• 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/receive_algorithm_interface.h"
12 #include "net/quic/congestion_control/send_algorithm_interface.h"
13 #include "net/quic/crypto/null_encrypter.h"
14 #include "net/quic/crypto/quic_decrypter.h"
15 #include "net/quic/crypto/quic_encrypter.h"
16 #include "net/quic/quic_protocol.h"
17 #include "net/quic/quic_sent_packet_manager.h"
18 #include "net/quic/quic_utils.h"
19 #include "net/quic/test_tools/mock_clock.h"
20 #include "net/quic/test_tools/mock_random.h"
21 #include "net/quic/test_tools/quic_connection_peer.h"
22 #include "net/quic/test_tools/quic_framer_peer.h"
23 #include "net/quic/test_tools/quic_packet_creator_peer.h"
24 #include "net/quic/test_tools/quic_test_utils.h"
25 #include "testing/gmock/include/gmock/gmock.h"
26 #include "testing/gtest/include/gtest/gtest.h"
27 
28 using base::StringPiece;
29 using std::map;
30 using std::vector;
31 using testing::_;
32 using testing::AnyNumber;
33 using testing::ContainerEq;
34 using testing::DoAll;
35 using testing::InSequence;
36 using testing::InvokeWithoutArgs;
37 using testing::Ref;
38 using testing::Return;
39 using testing::SaveArg;
40 using testing::StrictMock;
41 
42 namespace net {
43 namespace test {
44 namespace {
45 
46 const char data1[] = "foo";
47 const char data2[] = "bar";
48 
49 const bool kFin = true;
50 const bool kEntropyFlag = true;
51 
52 const QuicPacketEntropyHash kTestEntropyHash = 76;
53 
54 const int kDefaultRetransmissionTimeMs = 500;
55 const int kMinRetransmissionTimeMs = 200;
56 
57 // Used by TestConnection::SendStreamData3.
58 const QuicStreamId kStreamId3 = 3;
59 // Used by TestConnection::SendStreamData5.
60 const QuicStreamId kStreamId5 = 5;
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_METHOD4(RecordIncomingPacket,
78                void(QuicByteCount, QuicPacketSequenceNumber, QuicTime, bool));
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 
147 // TaggingDecrypter ensures that the final kTagSize bytes of the message all
148 // have the same value and then removes them.
149 class TaggingDecrypter : public QuicDecrypter {
150  public:
~TaggingDecrypter()151   virtual ~TaggingDecrypter() {}
152 
153   // QuicDecrypter interface
SetKey(StringPiece key)154   virtual bool SetKey(StringPiece key) OVERRIDE { return true; }
SetNoncePrefix(StringPiece nonce_prefix)155   virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE {
156     return true;
157   }
158 
Decrypt(StringPiece nonce,StringPiece associated_data,StringPiece ciphertext,unsigned char * output,size_t * output_length)159   virtual bool Decrypt(StringPiece nonce,
160                        StringPiece associated_data,
161                        StringPiece ciphertext,
162                        unsigned char* output,
163                        size_t* output_length) OVERRIDE {
164     if (ciphertext.size() < kTagSize) {
165       return false;
166     }
167     if (!CheckTag(ciphertext, GetTag(ciphertext))) {
168       return false;
169     }
170     *output_length = ciphertext.size() - kTagSize;
171     memcpy(output, ciphertext.data(), *output_length);
172     return true;
173   }
174 
DecryptPacket(QuicPacketSequenceNumber sequence_number,StringPiece associated_data,StringPiece ciphertext)175   virtual QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number,
176                                   StringPiece associated_data,
177                                   StringPiece ciphertext) OVERRIDE {
178     if (ciphertext.size() < kTagSize) {
179       return NULL;
180     }
181     if (!CheckTag(ciphertext, GetTag(ciphertext))) {
182       return NULL;
183     }
184     const size_t len = ciphertext.size() - kTagSize;
185     uint8* buf = new uint8[len];
186     memcpy(buf, ciphertext.data(), len);
187     return new QuicData(reinterpret_cast<char*>(buf), len,
188                         true /* owns buffer */);
189   }
190 
GetKey() const191   virtual StringPiece GetKey() const OVERRIDE { return StringPiece(); }
GetNoncePrefix() const192   virtual StringPiece GetNoncePrefix() const OVERRIDE { return StringPiece(); }
193 
194  protected:
GetTag(StringPiece ciphertext)195   virtual uint8 GetTag(StringPiece ciphertext) {
196     return ciphertext.data()[ciphertext.size()-1];
197   }
198 
199  private:
200   enum {
201     kTagSize = 12,
202   };
203 
CheckTag(StringPiece ciphertext,uint8 tag)204   bool CheckTag(StringPiece ciphertext, uint8 tag) {
205     for (size_t i = ciphertext.size() - kTagSize; i < ciphertext.size(); i++) {
206       if (ciphertext.data()[i] != tag) {
207         return false;
208       }
209     }
210 
211     return true;
212   }
213 };
214 
215 // StringTaggingDecrypter ensures that the final kTagSize bytes of the message
216 // match the expected value.
217 class StrictTaggingDecrypter : public TaggingDecrypter {
218  public:
StrictTaggingDecrypter(uint8 tag)219   explicit StrictTaggingDecrypter(uint8 tag) : tag_(tag) {}
~StrictTaggingDecrypter()220   virtual ~StrictTaggingDecrypter() {}
221 
222   // TaggingQuicDecrypter
GetTag(StringPiece ciphertext)223   virtual uint8 GetTag(StringPiece ciphertext) OVERRIDE {
224     return tag_;
225   }
226 
227  private:
228   const uint8 tag_;
229 };
230 
231 class TestConnectionHelper : public QuicConnectionHelperInterface {
232  public:
233   class TestAlarm : public QuicAlarm {
234    public:
TestAlarm(QuicAlarm::Delegate * delegate)235     explicit TestAlarm(QuicAlarm::Delegate* delegate)
236         : QuicAlarm(delegate) {
237     }
238 
SetImpl()239     virtual void SetImpl() OVERRIDE {}
CancelImpl()240     virtual void CancelImpl() OVERRIDE {}
241     using QuicAlarm::Fire;
242   };
243 
TestConnectionHelper(MockClock * clock,MockRandom * random_generator)244   TestConnectionHelper(MockClock* clock, MockRandom* random_generator)
245       : clock_(clock),
246         random_generator_(random_generator) {
247     clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
248   }
249 
250   // QuicConnectionHelperInterface
GetClock() const251   virtual const QuicClock* GetClock() const OVERRIDE {
252     return clock_;
253   }
254 
GetRandomGenerator()255   virtual QuicRandom* GetRandomGenerator() OVERRIDE {
256     return random_generator_;
257   }
258 
CreateAlarm(QuicAlarm::Delegate * delegate)259   virtual QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) OVERRIDE {
260     return new TestAlarm(delegate);
261   }
262 
263  private:
264   MockClock* clock_;
265   MockRandom* random_generator_;
266 
267   DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper);
268 };
269 
270 class TestPacketWriter : public QuicPacketWriter {
271  public:
TestPacketWriter()272   TestPacketWriter()
273       : last_packet_size_(0),
274         blocked_(false),
275         is_write_blocked_data_buffered_(false),
276         is_server_(true),
277         final_bytes_of_last_packet_(0),
278         final_bytes_of_previous_packet_(0),
279         use_tagging_decrypter_(false),
280         packets_write_attempts_(0) {
281   }
282 
283   // QuicPacketWriter
WritePacket(const char * buffer,size_t buf_len,const IPAddressNumber & self_address,const IPEndPoint & peer_address,QuicBlockedWriterInterface * blocked_writer)284   virtual WriteResult WritePacket(
285       const char* buffer, size_t buf_len,
286       const IPAddressNumber& self_address,
287       const IPEndPoint& peer_address,
288       QuicBlockedWriterInterface* blocked_writer) OVERRIDE {
289     QuicEncryptedPacket packet(buffer, buf_len);
290     ++packets_write_attempts_;
291 
292     if (packet.length() >= sizeof(final_bytes_of_last_packet_)) {
293       final_bytes_of_previous_packet_ = final_bytes_of_last_packet_;
294       memcpy(&final_bytes_of_last_packet_, packet.data() + packet.length() - 4,
295              sizeof(final_bytes_of_last_packet_));
296     }
297 
298     QuicFramer framer(QuicSupportedVersions(), QuicTime::Zero(), !is_server_);
299     if (use_tagging_decrypter_) {
300       framer.SetDecrypter(new TaggingDecrypter);
301     }
302     visitor_.Reset();
303     framer.set_visitor(&visitor_);
304     EXPECT_TRUE(framer.ProcessPacket(packet));
305     if (blocked_) {
306       return WriteResult(WRITE_STATUS_BLOCKED, -1);
307     }
308     last_packet_size_ = packet.length();
309     return WriteResult(WRITE_STATUS_OK, last_packet_size_);
310   }
311 
IsWriteBlockedDataBuffered() const312   virtual bool IsWriteBlockedDataBuffered() const OVERRIDE {
313     return is_write_blocked_data_buffered_;
314   }
315 
316   // Resets the visitor's state by clearing out the headers and frames.
Reset()317   void Reset() {
318     visitor_.Reset();
319   }
320 
header()321   QuicPacketHeader* header() { return visitor_.header(); }
322 
frame_count() const323   size_t frame_count() const { return visitor_.frame_count(); }
324 
ack()325   QuicAckFrame* ack() { return visitor_.ack(); }
326 
feedback()327   QuicCongestionFeedbackFrame* feedback() { return visitor_.feedback(); }
328 
close()329   QuicConnectionCloseFrame* close() { return visitor_.close(); }
330 
stream_frames() const331   const vector<QuicStreamFrame>* stream_frames() const {
332     return visitor_.stream_frames();
333   }
334 
last_packet_size()335   size_t last_packet_size() {
336     return last_packet_size_;
337   }
338 
version_negotiation_packet()339   QuicVersionNegotiationPacket* version_negotiation_packet() {
340     return visitor_.version_negotiation_packet();
341   }
342 
set_blocked(bool blocked)343   void set_blocked(bool blocked) { blocked_ = blocked; }
344 
set_is_write_blocked_data_buffered(bool buffered)345   void set_is_write_blocked_data_buffered(bool buffered) {
346     is_write_blocked_data_buffered_ = buffered;
347   }
348 
set_is_server(bool is_server)349   void set_is_server(bool is_server) { is_server_ = is_server; }
350 
351   // final_bytes_of_last_packet_ returns the last four bytes of the previous
352   // packet as a little-endian, uint32. This is intended to be used with a
353   // TaggingEncrypter so that tests can determine which encrypter was used for
354   // a given packet.
final_bytes_of_last_packet()355   uint32 final_bytes_of_last_packet() { return final_bytes_of_last_packet_; }
356 
357   // Returns the final bytes of the second to last packet.
final_bytes_of_previous_packet()358   uint32 final_bytes_of_previous_packet() {
359     return final_bytes_of_previous_packet_;
360   }
361 
use_tagging_decrypter()362   void use_tagging_decrypter() {
363     use_tagging_decrypter_ = true;
364   }
365 
packets_write_attempts()366   uint32 packets_write_attempts() { return packets_write_attempts_; }
367 
368  private:
369   FramerVisitorCapturingFrames visitor_;
370   size_t last_packet_size_;
371   bool blocked_;
372   bool is_write_blocked_data_buffered_;
373   bool is_server_;
374   uint32 final_bytes_of_last_packet_;
375   uint32 final_bytes_of_previous_packet_;
376   bool use_tagging_decrypter_;
377   uint32 packets_write_attempts_;
378 
379   DISALLOW_COPY_AND_ASSIGN(TestPacketWriter);
380 };
381 
382 class TestConnection : public QuicConnection {
383  public:
TestConnection(QuicGuid guid,IPEndPoint address,TestConnectionHelper * helper,TestPacketWriter * writer,bool is_server)384   TestConnection(QuicGuid guid,
385                  IPEndPoint address,
386                  TestConnectionHelper* helper,
387                  TestPacketWriter* writer,
388                  bool is_server)
389       : QuicConnection(guid, address, helper, writer, is_server,
390                        QuicSupportedVersions()),
391         helper_(helper),
392         writer_(writer) {
393     writer_->set_is_server(is_server);
394   }
395 
SendAck()396   void SendAck() {
397     QuicConnectionPeer::SendAck(this);
398   }
399 
SetReceiveAlgorithm(TestReceiveAlgorithm * receive_algorithm)400   void SetReceiveAlgorithm(TestReceiveAlgorithm* receive_algorithm) {
401      QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm);
402   }
403 
SetSendAlgorithm(SendAlgorithmInterface * send_algorithm)404   void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) {
405     QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm);
406   }
407 
SendPacket(EncryptionLevel level,QuicPacketSequenceNumber sequence_number,QuicPacket * packet,QuicPacketEntropyHash entropy_hash,HasRetransmittableData retransmittable)408   void SendPacket(EncryptionLevel level,
409                   QuicPacketSequenceNumber sequence_number,
410                   QuicPacket* packet,
411                   QuicPacketEntropyHash entropy_hash,
412                   HasRetransmittableData retransmittable) {
413     RetransmittableFrames* retransmittable_frames =
414         retransmittable == HAS_RETRANSMITTABLE_DATA ?
415             new RetransmittableFrames() : NULL;
416     OnSerializedPacket(
417         SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER,
418                          packet, entropy_hash, retransmittable_frames));
419   }
420 
SendStreamDataWithString(QuicStreamId id,StringPiece data,QuicStreamOffset offset,bool fin,QuicAckNotifier::DelegateInterface * delegate)421   QuicConsumedData SendStreamDataWithString(
422       QuicStreamId id,
423       StringPiece data,
424       QuicStreamOffset offset,
425       bool fin,
426       QuicAckNotifier::DelegateInterface* delegate) {
427     IOVector data_iov;
428     if (!data.empty()) {
429       data_iov.Append(const_cast<char*>(data.data()), data.size());
430     }
431     return QuicConnection::SendStreamData(id, data_iov, offset, fin, delegate);
432   }
433 
SendStreamData3()434   QuicConsumedData SendStreamData3() {
435     return SendStreamDataWithString(kStreamId3, "food", 0, !kFin, NULL);
436   }
437 
SendStreamData5()438   QuicConsumedData SendStreamData5() {
439     return SendStreamDataWithString(kStreamId5, "food2", 0, !kFin, NULL);
440   }
441 
442   // The crypto stream has special semantics so that it is not blocked by a
443   // congestion window limitation, and also so that it gets put into a separate
444   // packet (so that it is easier to reason about a crypto frame not being
445   // split needlessly across packet boundaries).  As a result, we have separate
446   // tests for some cases for this stream.
SendCryptoStreamData()447   QuicConsumedData SendCryptoStreamData() {
448     this->Flush();
449     QuicConsumedData consumed =
450         SendStreamDataWithString(kCryptoStreamId, "chlo", 0, !kFin, NULL);
451     this->Flush();
452     return consumed;
453   }
454 
is_server()455   bool is_server() {
456     return QuicConnectionPeer::IsServer(this);
457   }
458 
set_version(QuicVersion version)459   void set_version(QuicVersion version) {
460     framer_.set_version(version);
461   }
462 
set_is_server(bool is_server)463   void set_is_server(bool is_server) {
464     writer_->set_is_server(is_server);
465     QuicPacketCreatorPeer::SetIsServer(
466         QuicConnectionPeer::GetPacketCreator(this), is_server);
467     QuicConnectionPeer::SetIsServer(this, is_server);
468   }
469 
GetAckAlarm()470   TestConnectionHelper::TestAlarm* GetAckAlarm() {
471     return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
472         QuicConnectionPeer::GetAckAlarm(this));
473   }
474 
GetRetransmissionAlarm()475   TestConnectionHelper::TestAlarm* GetRetransmissionAlarm() {
476     return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
477         QuicConnectionPeer::GetRetransmissionAlarm(this));
478   }
479 
GetSendAlarm()480   TestConnectionHelper::TestAlarm* GetSendAlarm() {
481     return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
482         QuicConnectionPeer::GetSendAlarm(this));
483   }
484 
GetResumeWritesAlarm()485   TestConnectionHelper::TestAlarm* GetResumeWritesAlarm() {
486     return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
487         QuicConnectionPeer::GetResumeWritesAlarm(this));
488   }
489 
GetTimeoutAlarm()490   TestConnectionHelper::TestAlarm* GetTimeoutAlarm() {
491     return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
492         QuicConnectionPeer::GetTimeoutAlarm(this));
493   }
494 
495   using QuicConnection::SelectMutualVersion;
496 
497  private:
498   TestConnectionHelper* helper_;
499   TestPacketWriter* writer_;
500 
501   DISALLOW_COPY_AND_ASSIGN(TestConnection);
502 };
503 
504 class QuicConnectionTest : public ::testing::TestWithParam<bool> {
505  protected:
QuicConnectionTest()506   QuicConnectionTest()
507       : guid_(42),
508         framer_(QuicSupportedVersions(), QuicTime::Zero(), false),
509         creator_(guid_, &framer_, &random_generator_, false),
510         send_algorithm_(new StrictMock<MockSendAlgorithm>),
511         helper_(new TestConnectionHelper(&clock_, &random_generator_)),
512         writer_(new TestPacketWriter()),
513         connection_(guid_, IPEndPoint(), helper_.get(), writer_.get(), false),
514         frame1_(1, false, 0, MakeIOVector(data1)),
515         frame2_(1, false, 3, MakeIOVector(data2)),
516         accept_packet_(true) {
517     connection_.set_visitor(&visitor_);
518     connection_.SetSendAlgorithm(send_algorithm_);
519     framer_.set_received_entropy_calculator(&entropy_calculator_);
520     // Simplify tests by not sending feedback unless specifically configured.
521     SetFeedback(NULL);
522     EXPECT_CALL(
523         *send_algorithm_, TimeUntilSend(_, _, _, _)).WillRepeatedly(Return(
524             QuicTime::Delta::Zero()));
525     EXPECT_CALL(*receive_algorithm_,
526                 RecordIncomingPacket(_, _, _, _)).Times(AnyNumber());
527     EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
528         .Times(AnyNumber());
529     EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly(
530         Return(QuicTime::Delta::Zero()));
531     EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillRepeatedly(Return(
532         QuicBandwidth::FromKBitsPerSecond(100)));
533     EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillRepeatedly(Return(
534         QuicTime::Delta::FromMilliseconds(100)));
535     ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
536         .WillByDefault(Return(true));
537     EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber());
538     EXPECT_CALL(visitor_, OnCanWrite()).Times(AnyNumber()).WillRepeatedly(
539         Return(true));
540   }
541 
outgoing_ack()542   QuicAckFrame* outgoing_ack() {
543     outgoing_ack_.reset(QuicConnectionPeer::CreateAckFrame(&connection_));
544     return outgoing_ack_.get();
545   }
546 
last_ack()547   QuicAckFrame* last_ack() {
548     return writer_->ack();
549   }
550 
last_feedback()551   QuicCongestionFeedbackFrame* last_feedback() {
552     return writer_->feedback();
553   }
554 
last_close()555   QuicConnectionCloseFrame* last_close() {
556     return writer_->close();
557   }
558 
last_header()559   QuicPacketHeader* last_header() {
560     return writer_->header();
561   }
562 
last_sent_packet_size()563   size_t last_sent_packet_size() {
564     return writer_->last_packet_size();
565   }
566 
final_bytes_of_last_packet()567   uint32 final_bytes_of_last_packet() {
568     return writer_->final_bytes_of_last_packet();
569   }
570 
final_bytes_of_previous_packet()571   uint32 final_bytes_of_previous_packet() {
572     return writer_->final_bytes_of_previous_packet();
573   }
574 
use_tagging_decrypter()575   void use_tagging_decrypter() {
576     writer_->use_tagging_decrypter();
577   }
578 
ProcessPacket(QuicPacketSequenceNumber number)579   void ProcessPacket(QuicPacketSequenceNumber number) {
580     EXPECT_CALL(visitor_, OnStreamFrames(_)).WillOnce(Return(accept_packet_));
581     ProcessDataPacket(number, 0, !kEntropyFlag);
582   }
583 
ProcessFramePacket(QuicFrame frame)584   QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) {
585     QuicFrames frames;
586     frames.push_back(QuicFrame(frame));
587     QuicPacketCreatorPeer::SetSendVersionInPacket(&creator_,
588                                                   connection_.is_server());
589     SerializedPacket serialized_packet = creator_.SerializeAllFrames(frames);
590     scoped_ptr<QuicPacket> packet(serialized_packet.packet);
591     scoped_ptr<QuicEncryptedPacket> encrypted(
592         framer_.EncryptPacket(ENCRYPTION_NONE,
593                               serialized_packet.sequence_number, *packet));
594     connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
595     return serialized_packet.entropy_hash;
596   }
597 
ProcessDataPacket(QuicPacketSequenceNumber number,QuicFecGroupNumber fec_group,bool entropy_flag)598   size_t ProcessDataPacket(QuicPacketSequenceNumber number,
599                            QuicFecGroupNumber fec_group,
600                            bool entropy_flag) {
601     return ProcessDataPacketAtLevel(number, fec_group, entropy_flag,
602                                     ENCRYPTION_NONE);
603   }
604 
ProcessDataPacketAtLevel(QuicPacketSequenceNumber number,QuicFecGroupNumber fec_group,bool entropy_flag,EncryptionLevel level)605   size_t ProcessDataPacketAtLevel(QuicPacketSequenceNumber number,
606                                   QuicFecGroupNumber fec_group,
607                                   bool entropy_flag,
608                                   EncryptionLevel level) {
609     scoped_ptr<QuicPacket> packet(ConstructDataPacket(number, fec_group,
610                                                       entropy_flag));
611     scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
612         level, number, *packet));
613     connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
614     return encrypted->length();
615   }
616 
ProcessClosePacket(QuicPacketSequenceNumber number,QuicFecGroupNumber fec_group)617   void ProcessClosePacket(QuicPacketSequenceNumber number,
618                           QuicFecGroupNumber fec_group) {
619     scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group));
620     scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
621         ENCRYPTION_NONE, number, *packet));
622     connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
623   }
624 
ProcessFecProtectedPacket(QuicPacketSequenceNumber number,bool expect_revival,bool entropy_flag)625   size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number,
626                                  bool expect_revival, bool entropy_flag) {
627     if (expect_revival) {
628       EXPECT_CALL(visitor_, OnStreamFrames(_)).WillOnce(Return(accept_packet_));
629     }
630     EXPECT_CALL(visitor_, OnStreamFrames(_)).WillOnce(Return(accept_packet_))
631         .RetiresOnSaturation();
632     return ProcessDataPacket(number, 1, entropy_flag);
633   }
634 
635   // Processes an FEC packet that covers the packets that would have been
636   // received.
ProcessFecPacket(QuicPacketSequenceNumber number,QuicPacketSequenceNumber min_protected_packet,bool expect_revival,bool entropy_flag,QuicPacket * packet)637   size_t ProcessFecPacket(QuicPacketSequenceNumber number,
638                           QuicPacketSequenceNumber min_protected_packet,
639                           bool expect_revival,
640                           bool entropy_flag,
641                           QuicPacket* packet) {
642     if (expect_revival) {
643       EXPECT_CALL(visitor_, OnStreamFrames(_)).WillOnce(Return(accept_packet_));
644     }
645 
646     // Construct the decrypted data packet so we can compute the correct
647     // redundancy. If |packet| has been provided then use that, otherwise
648     // construct a default data packet.
649     scoped_ptr<QuicPacket> data_packet;
650     if (packet) {
651       data_packet.reset(packet);
652     } else {
653       data_packet.reset(ConstructDataPacket(number, 1, !kEntropyFlag));
654     }
655 
656     header_.public_header.guid = guid_;
657     header_.public_header.reset_flag = false;
658     header_.public_header.version_flag = false;
659     header_.entropy_flag = entropy_flag;
660     header_.fec_flag = true;
661     header_.packet_sequence_number = number;
662     header_.is_in_fec_group = IN_FEC_GROUP;
663     header_.fec_group = min_protected_packet;
664     QuicFecData fec_data;
665     fec_data.fec_group = header_.fec_group;
666 
667     // Since all data packets in this test have the same payload, the
668     // redundancy is either equal to that payload or the xor of that payload
669     // with itself, depending on the number of packets.
670     if (((number - min_protected_packet) % 2) == 0) {
671       for (size_t i = GetStartOfFecProtectedData(
672                header_.public_header.guid_length,
673                header_.public_header.version_flag,
674                header_.public_header.sequence_number_length);
675            i < data_packet->length(); ++i) {
676         data_packet->mutable_data()[i] ^= data_packet->data()[i];
677       }
678     }
679     fec_data.redundancy = data_packet->FecProtectedData();
680 
681     scoped_ptr<QuicPacket> fec_packet(
682         framer_.BuildFecPacket(header_, fec_data).packet);
683     scoped_ptr<QuicEncryptedPacket> encrypted(
684         framer_.EncryptPacket(ENCRYPTION_NONE, number, *fec_packet));
685 
686     connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
687     return encrypted->length();
688   }
689 
SendStreamDataToPeer(QuicStreamId id,StringPiece data,QuicStreamOffset offset,bool fin,QuicPacketSequenceNumber * last_packet)690   QuicByteCount SendStreamDataToPeer(QuicStreamId id,
691                                      StringPiece data,
692                                      QuicStreamOffset offset,
693                                      bool fin,
694                                      QuicPacketSequenceNumber* last_packet) {
695     QuicByteCount packet_size;
696     EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
697         .WillOnce(DoAll(SaveArg<2>(&packet_size), Return(true)));
698     connection_.SendStreamDataWithString(id, data, offset, fin, NULL);
699     if (last_packet != NULL) {
700       *last_packet =
701           QuicConnectionPeer::GetPacketCreator(&connection_)->sequence_number();
702     }
703     EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
704         .Times(AnyNumber());
705     return packet_size;
706   }
707 
SendAckPacketToPeer()708   void SendAckPacketToPeer() {
709     EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
710     connection_.SendAck();
711     EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
712         .Times(AnyNumber());
713   }
714 
ProcessAckPacket(QuicAckFrame * frame)715   QuicPacketEntropyHash ProcessAckPacket(QuicAckFrame* frame) {
716     return ProcessFramePacket(QuicFrame(frame));
717   }
718 
ProcessGoAwayPacket(QuicGoAwayFrame * frame)719   QuicPacketEntropyHash ProcessGoAwayPacket(QuicGoAwayFrame* frame) {
720     return ProcessFramePacket(QuicFrame(frame));
721   }
722 
IsMissing(QuicPacketSequenceNumber number)723   bool IsMissing(QuicPacketSequenceNumber number) {
724     return IsAwaitingPacket(outgoing_ack()->received_info, number);
725   }
726 
ConstructDataPacket(QuicPacketSequenceNumber number,QuicFecGroupNumber fec_group,bool entropy_flag)727   QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number,
728                                   QuicFecGroupNumber fec_group,
729                                   bool entropy_flag) {
730     header_.public_header.guid = guid_;
731     header_.public_header.reset_flag = false;
732     header_.public_header.version_flag = false;
733     header_.entropy_flag = entropy_flag;
734     header_.fec_flag = false;
735     header_.packet_sequence_number = number;
736     header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP;
737     header_.fec_group = fec_group;
738 
739     QuicFrames frames;
740     QuicFrame frame(&frame1_);
741     frames.push_back(frame);
742     QuicPacket* packet =
743         framer_.BuildUnsizedDataPacket(header_, frames).packet;
744     EXPECT_TRUE(packet != NULL);
745     return packet;
746   }
747 
ConstructClosePacket(QuicPacketSequenceNumber number,QuicFecGroupNumber fec_group)748   QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number,
749                                    QuicFecGroupNumber fec_group) {
750     header_.public_header.guid = guid_;
751     header_.packet_sequence_number = number;
752     header_.public_header.reset_flag = false;
753     header_.public_header.version_flag = false;
754     header_.entropy_flag = false;
755     header_.fec_flag = false;
756     header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP;
757     header_.fec_group = fec_group;
758 
759     QuicConnectionCloseFrame qccf;
760     qccf.error_code = QUIC_PEER_GOING_AWAY;
761 
762     QuicFrames frames;
763     QuicFrame frame(&qccf);
764     frames.push_back(frame);
765     QuicPacket* packet =
766         framer_.BuildUnsizedDataPacket(header_, frames).packet;
767     EXPECT_TRUE(packet != NULL);
768     return packet;
769   }
770 
SetFeedback(QuicCongestionFeedbackFrame * feedback)771   void SetFeedback(QuicCongestionFeedbackFrame* feedback) {
772     receive_algorithm_ = new TestReceiveAlgorithm(feedback);
773     connection_.SetReceiveAlgorithm(receive_algorithm_);
774   }
775 
DefaultRetransmissionTime()776   QuicTime::Delta DefaultRetransmissionTime() {
777     return QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs);
778   }
779 
DefaultDelayedAckTime()780   QuicTime::Delta DefaultDelayedAckTime() {
781     return QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs/2);
782   }
783 
784   QuicGuid guid_;
785   QuicFramer framer_;
786   QuicPacketCreator creator_;
787   MockEntropyCalculator entropy_calculator_;
788 
789   MockSendAlgorithm* send_algorithm_;
790   TestReceiveAlgorithm* receive_algorithm_;
791   MockClock clock_;
792   MockRandom random_generator_;
793   scoped_ptr<TestConnectionHelper> helper_;
794   scoped_ptr<TestPacketWriter> writer_;
795   TestConnection connection_;
796   StrictMock<MockConnectionVisitor> visitor_;
797 
798   QuicPacketHeader header_;
799   QuicStreamFrame frame1_;
800   QuicStreamFrame frame2_;
801   scoped_ptr<QuicAckFrame> outgoing_ack_;
802   bool accept_packet_;
803 
804  private:
805   DISALLOW_COPY_AND_ASSIGN(QuicConnectionTest);
806 };
807 
TEST_F(QuicConnectionTest,PacketsInOrder)808 TEST_F(QuicConnectionTest, PacketsInOrder) {
809   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
810 
811   ProcessPacket(1);
812   EXPECT_EQ(1u, outgoing_ack()->received_info.largest_observed);
813   EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
814 
815   ProcessPacket(2);
816   EXPECT_EQ(2u, outgoing_ack()->received_info.largest_observed);
817   EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
818 
819   ProcessPacket(3);
820   EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
821   EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
822 }
823 
TEST_F(QuicConnectionTest,PacketsRejected)824 TEST_F(QuicConnectionTest, PacketsRejected) {
825   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
826 
827   ProcessPacket(1);
828   EXPECT_EQ(1u, outgoing_ack()->received_info.largest_observed);
829   EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
830 
831   accept_packet_ = false;
832   ProcessPacket(2);
833   // We should not have an ack for two.
834   EXPECT_EQ(1u, outgoing_ack()->received_info.largest_observed);
835   EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
836 }
837 
TEST_F(QuicConnectionTest,PacketsOutOfOrder)838 TEST_F(QuicConnectionTest, PacketsOutOfOrder) {
839   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
840 
841   ProcessPacket(3);
842   EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
843   EXPECT_TRUE(IsMissing(2));
844   EXPECT_TRUE(IsMissing(1));
845 
846   ProcessPacket(2);
847   EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
848   EXPECT_FALSE(IsMissing(2));
849   EXPECT_TRUE(IsMissing(1));
850 
851   ProcessPacket(1);
852   EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
853   EXPECT_FALSE(IsMissing(2));
854   EXPECT_FALSE(IsMissing(1));
855 }
856 
TEST_F(QuicConnectionTest,DuplicatePacket)857 TEST_F(QuicConnectionTest, DuplicatePacket) {
858   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
859 
860   ProcessPacket(3);
861   EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
862   EXPECT_TRUE(IsMissing(2));
863   EXPECT_TRUE(IsMissing(1));
864 
865   // Send packet 3 again, but do not set the expectation that
866   // the visitor OnStreamFrames() will be called.
867   ProcessDataPacket(3, 0, !kEntropyFlag);
868   EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
869   EXPECT_TRUE(IsMissing(2));
870   EXPECT_TRUE(IsMissing(1));
871 }
872 
TEST_F(QuicConnectionTest,PacketsOutOfOrderWithAdditionsAndLeastAwaiting)873 TEST_F(QuicConnectionTest, PacketsOutOfOrderWithAdditionsAndLeastAwaiting) {
874   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
875 
876   ProcessPacket(3);
877   EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
878   EXPECT_TRUE(IsMissing(2));
879   EXPECT_TRUE(IsMissing(1));
880 
881   ProcessPacket(2);
882   EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
883   EXPECT_TRUE(IsMissing(1));
884 
885   ProcessPacket(5);
886   EXPECT_EQ(5u, outgoing_ack()->received_info.largest_observed);
887   EXPECT_TRUE(IsMissing(1));
888   EXPECT_TRUE(IsMissing(4));
889 
890   // Pretend at this point the client has gotten acks for 2 and 3 and 1 is a
891   // packet the peer will not retransmit.  It indicates this by sending 'least
892   // awaiting' is 4.  The connection should then realize 1 will not be
893   // retransmitted, and will remove it from the missing list.
894   creator_.set_sequence_number(5);
895   QuicAckFrame frame(0, QuicTime::Zero(), 4);
896   ProcessAckPacket(&frame);
897 
898   // Force an ack to be sent.
899   SendAckPacketToPeer();
900   EXPECT_TRUE(IsMissing(4));
901 }
902 
TEST_F(QuicConnectionTest,RejectPacketTooFarOut)903 TEST_F(QuicConnectionTest, RejectPacketTooFarOut) {
904   // Call ProcessDataPacket rather than ProcessPacket, as we should not get a
905   // packet call to the visitor.
906   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
907   ProcessDataPacket(6000, 0, !kEntropyFlag);
908 }
909 
TEST_F(QuicConnectionTest,TruncatedAck)910 TEST_F(QuicConnectionTest, TruncatedAck) {
911   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
912   QuicPacketSequenceNumber num_packets = 256 * 2 + 1;
913   for (QuicPacketSequenceNumber i = 0; i < num_packets; ++i) {
914     SendStreamDataToPeer(1, "foo", i * 3, !kFin, NULL);
915   }
916 
917   QuicAckFrame frame(num_packets, QuicTime::Zero(), 1);
918   // Create an ack with 256 nacks, none adjacent to one another.
919   for (QuicPacketSequenceNumber i = 1; i <= 256; ++i) {
920     frame.received_info.missing_packets.insert(i * 2);
921   }
922   frame.received_info.entropy_hash = 0;
923   EXPECT_CALL(entropy_calculator_,
924               EntropyHash(511)).WillOnce(testing::Return(0));
925   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(256);
926   EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(2);
927   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2);
928   ProcessAckPacket(&frame);
929 
930   QuicReceivedPacketManager* received_packet_manager =
931       QuicConnectionPeer::GetReceivedPacketManager(&connection_);
932   // A truncated ack will not have the true largest observed.
933   EXPECT_GT(num_packets,
934             received_packet_manager->peer_largest_observed_packet());
935 
936   frame.received_info.missing_packets.erase(192);
937   frame.received_info.entropy_hash = 2;
938 
939   // Removing one missing packet allows us to ack 192 and one more range.
940   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
941   EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(2);
942   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2);
943   ProcessAckPacket(&frame);
944   EXPECT_EQ(num_packets,
945             received_packet_manager->peer_largest_observed_packet());
946 }
947 
TEST_F(QuicConnectionTest,AckReceiptCausesAckSendBadEntropy)948 TEST_F(QuicConnectionTest, AckReceiptCausesAckSendBadEntropy) {
949   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
950 
951   ProcessPacket(1);
952   // Delay sending, then queue up an ack.
953   EXPECT_CALL(*send_algorithm_,
954               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
955                   testing::Return(QuicTime::Delta::FromMicroseconds(1)));
956   QuicConnectionPeer::SendAck(&connection_);
957 
958   // Process an ack with a least unacked of the received ack.
959   // This causes an ack to be sent when TimeUntilSend returns 0.
960   EXPECT_CALL(*send_algorithm_,
961               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillRepeatedly(
962                   testing::Return(QuicTime::Delta::Zero()));
963   // Skip a packet and then record an ack.
964   creator_.set_sequence_number(2);
965   QuicAckFrame frame(0, QuicTime::Zero(), 3);
966   ProcessAckPacket(&frame);
967 }
968 
TEST_F(QuicConnectionTest,OutOfOrderReceiptCausesAckSend)969 TEST_F(QuicConnectionTest, OutOfOrderReceiptCausesAckSend) {
970   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
971 
972   ProcessPacket(3);
973   // Should ack immediately since we have missing packets.
974   EXPECT_EQ(1u, writer_->packets_write_attempts());
975 
976   ProcessPacket(2);
977   // Should ack immediately since we have missing packets.
978   EXPECT_EQ(2u, writer_->packets_write_attempts());
979 
980   ProcessPacket(1);
981   // Should ack immediately, since this fills the last hole.
982   EXPECT_EQ(3u, writer_->packets_write_attempts());
983 
984   ProcessPacket(4);
985   // Should not cause an ack.
986   EXPECT_EQ(3u, writer_->packets_write_attempts());
987 }
988 
TEST_F(QuicConnectionTest,AckReceiptCausesAckSend)989 TEST_F(QuicConnectionTest, AckReceiptCausesAckSend) {
990   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
991   EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1);
992   QuicPacketSequenceNumber original;
993   QuicByteCount packet_size;
994   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _))
995       .WillOnce(DoAll(SaveArg<1>(&original), SaveArg<2>(&packet_size),
996                       Return(true)));
997   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1);
998   connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
999   QuicAckFrame frame(original, QuicTime::Zero(), 1);
1000   frame.received_info.missing_packets.insert(original);
1001   frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
1002       &connection_, original - 1);
1003   // First nack triggers early retransmit.
1004   QuicPacketSequenceNumber retransmission;
1005   EXPECT_CALL(*send_algorithm_,
1006               OnPacketSent(_, _, packet_size - kQuicVersionSize,
1007                            NACK_RETRANSMISSION, _))
1008       .WillOnce(DoAll(SaveArg<1>(&retransmission), Return(true)));
1009 
1010   ProcessAckPacket(&frame);
1011 
1012   QuicAckFrame frame2(retransmission, QuicTime::Zero(), 1);
1013   frame2.received_info.missing_packets.insert(original);
1014   frame2.received_info.entropy_hash =
1015       QuicConnectionPeer::GetSentEntropyHash(&connection_, retransmission) ^
1016       QuicConnectionPeer::GetSentEntropyHash(&connection_, original);
1017   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _));
1018 
1019   ProcessAckPacket(&frame2);
1020   // Now if the peer sends an ack which still reports the retransmitted packet
1021   // as missing, then that will count as a packet which instigates an ack.
1022   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _));
1023   ProcessAckPacket(&frame2);
1024   ProcessAckPacket(&frame2);
1025 
1026   // But an ack with no missing packets will not send an ack.
1027   frame2.received_info.missing_packets.clear();
1028   frame2.received_info.entropy_hash =
1029       QuicConnectionPeer::GetSentEntropyHash(&connection_, retransmission);
1030   ProcessAckPacket(&frame2);
1031   ProcessAckPacket(&frame2);
1032 }
1033 
TEST_F(QuicConnectionTest,LeastUnackedLower)1034 TEST_F(QuicConnectionTest, LeastUnackedLower) {
1035   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1036 
1037   SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1038   SendStreamDataToPeer(1, "bar", 3, !kFin, NULL);
1039   SendStreamDataToPeer(1, "eep", 6, !kFin, NULL);
1040 
1041   // Start out saying the least unacked is 2.
1042   creator_.set_sequence_number(5);
1043   QuicAckFrame frame(0, QuicTime::Zero(), 2);
1044   ProcessAckPacket(&frame);
1045 
1046   // Change it to 1, but lower the sequence number to fake out-of-order packets.
1047   // This should be fine.
1048   creator_.set_sequence_number(1);
1049   QuicAckFrame frame2(0, QuicTime::Zero(), 1);
1050   // The scheduler will not process out of order acks.
1051   EXPECT_CALL(visitor_, OnCanWrite()).Times(0);
1052   ProcessAckPacket(&frame2);
1053 
1054   // Now claim it's one, but set the ordering so it was sent "after" the first
1055   // one.  This should cause a connection error.
1056   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, false));
1057   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1058   creator_.set_sequence_number(7);
1059   ProcessAckPacket(&frame2);
1060 }
1061 
TEST_F(QuicConnectionTest,LargestObservedLower)1062 TEST_F(QuicConnectionTest, LargestObservedLower) {
1063   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1064 
1065   SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1066   SendStreamDataToPeer(1, "bar", 3, !kFin, NULL);
1067   SendStreamDataToPeer(1, "eep", 6, !kFin, NULL);
1068   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
1069 
1070   // Start out saying the largest observed is 2.
1071   QuicAckFrame frame(2, QuicTime::Zero(), 0);
1072   frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
1073       &connection_, 2);
1074   ProcessAckPacket(&frame);
1075 
1076   // Now change it to 1, and it should cause a connection error.
1077   QuicAckFrame frame2(1, QuicTime::Zero(), 0);
1078   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, false));
1079   EXPECT_CALL(visitor_, OnCanWrite()).Times(0);
1080   ProcessAckPacket(&frame2);
1081 }
1082 
TEST_F(QuicConnectionTest,AckUnsentData)1083 TEST_F(QuicConnectionTest, AckUnsentData) {
1084   // Ack a packet which has not been sent.
1085   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, false));
1086   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1087   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1088   QuicAckFrame frame(1, QuicTime::Zero(), 0);
1089   EXPECT_CALL(visitor_, OnCanWrite()).Times(0);
1090   ProcessAckPacket(&frame);
1091 }
1092 
TEST_F(QuicConnectionTest,AckAll)1093 TEST_F(QuicConnectionTest, AckAll) {
1094   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1095   ProcessPacket(1);
1096 
1097   creator_.set_sequence_number(1);
1098   QuicAckFrame frame1(0, QuicTime::Zero(), 1);
1099   ProcessAckPacket(&frame1);
1100 }
1101 
TEST_F(QuicConnectionTest,SendingDifferentSequenceNumberLengthsBandwidth)1102 TEST_F(QuicConnectionTest, SendingDifferentSequenceNumberLengthsBandwidth) {
1103   EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(Return(
1104        QuicBandwidth::FromKBitsPerSecond(1000)));
1105 
1106   QuicPacketSequenceNumber last_packet;
1107   SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);
1108   EXPECT_EQ(1u, last_packet);
1109   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1110             connection_.options()->send_sequence_number_length);
1111   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1112             last_header()->public_header.sequence_number_length);
1113 
1114   EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(Return(
1115        QuicBandwidth::FromKBitsPerSecond(1000 * 256)));
1116 
1117   SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet);
1118   EXPECT_EQ(2u, last_packet);
1119   EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
1120             connection_.options()->send_sequence_number_length);
1121   // The 1 packet lag is due to the sequence number length being recalculated in
1122   // QuicConnection after a packet is sent.
1123   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1124             last_header()->public_header.sequence_number_length);
1125 
1126   EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(Return(
1127        QuicBandwidth::FromKBitsPerSecond(1000 * 256 * 256)));
1128 
1129   SendStreamDataToPeer(1, "foo", 6, !kFin, &last_packet);
1130   EXPECT_EQ(3u, last_packet);
1131   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1132             connection_.options()->send_sequence_number_length);
1133   EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
1134             last_header()->public_header.sequence_number_length);
1135 
1136   EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(Return(
1137        QuicBandwidth::FromKBitsPerSecond(1000ll * 256 * 256 * 256)));
1138 
1139   SendStreamDataToPeer(1, "bar", 9, !kFin, &last_packet);
1140   EXPECT_EQ(4u, last_packet);
1141   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1142             connection_.options()->send_sequence_number_length);
1143   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1144             last_header()->public_header.sequence_number_length);
1145 
1146   EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(Return(
1147       QuicBandwidth::FromKBitsPerSecond(1000ll * 256 * 256 * 256 * 256)));
1148 
1149   SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet);
1150   EXPECT_EQ(5u, last_packet);
1151   EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
1152             connection_.options()->send_sequence_number_length);
1153   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1154             last_header()->public_header.sequence_number_length);
1155 }
1156 
TEST_F(QuicConnectionTest,SendingDifferentSequenceNumberLengthsUnackedDelta)1157 TEST_F(QuicConnectionTest, SendingDifferentSequenceNumberLengthsUnackedDelta) {
1158   QuicPacketSequenceNumber last_packet;
1159   SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);
1160   EXPECT_EQ(1u, last_packet);
1161   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1162             connection_.options()->send_sequence_number_length);
1163   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1164             last_header()->public_header.sequence_number_length);
1165 
1166   QuicConnectionPeer::GetPacketCreator(&connection_)->set_sequence_number(100);
1167 
1168   SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet);
1169   EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
1170             connection_.options()->send_sequence_number_length);
1171   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1172             last_header()->public_header.sequence_number_length);
1173 
1174   QuicConnectionPeer::GetPacketCreator(&connection_)->set_sequence_number(
1175       100 * 256);
1176 
1177   SendStreamDataToPeer(1, "foo", 6, !kFin, &last_packet);
1178   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1179             connection_.options()->send_sequence_number_length);
1180   EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
1181             last_header()->public_header.sequence_number_length);
1182 
1183   QuicConnectionPeer::GetPacketCreator(&connection_)->set_sequence_number(
1184       100 * 256 * 256);
1185 
1186   SendStreamDataToPeer(1, "bar", 9, !kFin, &last_packet);
1187   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1188             connection_.options()->send_sequence_number_length);
1189   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1190             last_header()->public_header.sequence_number_length);
1191 
1192   QuicConnectionPeer::GetPacketCreator(&connection_)->set_sequence_number(
1193       100 * 256 * 256 * 256);
1194 
1195   SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet);
1196   EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
1197             connection_.options()->send_sequence_number_length);
1198   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1199             last_header()->public_header.sequence_number_length);
1200 }
1201 
TEST_F(QuicConnectionTest,BasicSending)1202 TEST_F(QuicConnectionTest, BasicSending) {
1203   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1204   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(6);
1205   QuicPacketSequenceNumber last_packet;
1206   SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);  // Packet 1
1207   EXPECT_EQ(1u, last_packet);
1208   SendAckPacketToPeer();  // Packet 2
1209 
1210   EXPECT_EQ(1u, last_ack()->sent_info.least_unacked);
1211 
1212   SendAckPacketToPeer();  // Packet 3
1213   EXPECT_EQ(1u, last_ack()->sent_info.least_unacked);
1214 
1215   SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet);  // Packet 4
1216   EXPECT_EQ(4u, last_packet);
1217   SendAckPacketToPeer();  // Packet 5
1218   EXPECT_EQ(1u, last_ack()->sent_info.least_unacked);
1219 
1220   // Peer acks up to packet 3.
1221   QuicAckFrame frame(3, QuicTime::Zero(), 0);
1222   frame.received_info.entropy_hash =
1223       QuicConnectionPeer::GetSentEntropyHash(&connection_, 3);
1224   ProcessAckPacket(&frame);
1225   SendAckPacketToPeer();  // Packet 6
1226 
1227   // As soon as we've acked one, we skip ack packets 2 and 3 and note lack of
1228   // ack for 4.
1229   EXPECT_EQ(4u, last_ack()->sent_info.least_unacked);
1230 
1231   // Peer acks up to packet 4, the last packet.
1232   QuicAckFrame frame2(6, QuicTime::Zero(), 0);
1233   frame2.received_info.entropy_hash =
1234       QuicConnectionPeer::GetSentEntropyHash(&connection_, 6);
1235   ProcessAckPacket(&frame2);  // Acks don't instigate acks.
1236 
1237   // Verify that we did not send an ack.
1238   EXPECT_EQ(6u, last_header()->packet_sequence_number);
1239 
1240   // So the last ack has not changed.
1241   EXPECT_EQ(4u, last_ack()->sent_info.least_unacked);
1242 
1243   // If we force an ack, we shouldn't change our retransmit state.
1244   SendAckPacketToPeer();  // Packet 7
1245   EXPECT_EQ(7u, last_ack()->sent_info.least_unacked);
1246 
1247   // But if we send more data it should.
1248   SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet);  // Packet 8
1249   EXPECT_EQ(8u, last_packet);
1250   SendAckPacketToPeer();  // Packet 9
1251   EXPECT_EQ(8u, last_ack()->sent_info.least_unacked);
1252 }
1253 
TEST_F(QuicConnectionTest,FECSending)1254 TEST_F(QuicConnectionTest, FECSending) {
1255   // All packets carry version info till version is negotiated.
1256   size_t payload_length;
1257   connection_.options()->max_packet_length =
1258       GetPacketLengthForOneStream(
1259           connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
1260           IN_FEC_GROUP, &payload_length);
1261   // And send FEC every two packets.
1262   connection_.options()->max_packets_per_fec_group = 2;
1263 
1264   // Send 4 data packets and 2 FEC packets.
1265   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1266   // The first stream frame will consume 2 fewer bytes than the other three.
1267   const string payload(payload_length * 4 - 6, 'a');
1268   connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL);
1269   // Expect the FEC group to be closed after SendStreamDataWithString.
1270   EXPECT_FALSE(creator_.ShouldSendFec(true));
1271 }
1272 
TEST_F(QuicConnectionTest,FECQueueing)1273 TEST_F(QuicConnectionTest, FECQueueing) {
1274   // All packets carry version info till version is negotiated.
1275   size_t payload_length;
1276   connection_.options()->max_packet_length =
1277       GetPacketLengthForOneStream(
1278           connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
1279           IN_FEC_GROUP, &payload_length);
1280   // And send FEC every two packets.
1281   connection_.options()->max_packets_per_fec_group = 2;
1282 
1283   EXPECT_EQ(0u, connection_.NumQueuedPackets());
1284   writer_->set_blocked(true);
1285   const string payload(payload_length, 'a');
1286   connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL);
1287   EXPECT_FALSE(creator_.ShouldSendFec(true));
1288   // Expect the first data packet and the fec packet to be queued.
1289   EXPECT_EQ(2u, connection_.NumQueuedPackets());
1290 }
1291 
TEST_F(QuicConnectionTest,AbandonFECFromCongestionWindow)1292 TEST_F(QuicConnectionTest, AbandonFECFromCongestionWindow) {
1293   connection_.options()->max_packets_per_fec_group = 1;
1294   // 1 Data and 1 FEC packet.
1295   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
1296   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
1297 
1298   const QuicTime::Delta retransmission_time =
1299       QuicTime::Delta::FromMilliseconds(5000);
1300   clock_.AdvanceTime(retransmission_time);
1301 
1302   // Abandon FEC packet and data packet.
1303   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2);
1304   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
1305   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1306   EXPECT_CALL(visitor_, OnCanWrite());
1307   connection_.OnRetransmissionTimeout();
1308 }
1309 
TEST_F(QuicConnectionTest,DontAbandonAckedFEC)1310 TEST_F(QuicConnectionTest, DontAbandonAckedFEC) {
1311   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1312   connection_.options()->max_packets_per_fec_group = 1;
1313 
1314   // 1 Data and 1 FEC packet.
1315   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1316   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
1317   // Send some more data afterwards to ensure early retransmit doesn't trigger.
1318   connection_.SendStreamDataWithString(1, "foo", 3, !kFin, NULL);
1319   connection_.SendStreamDataWithString(1, "foo", 6, !kFin, NULL);
1320 
1321   QuicAckFrame ack_fec(2, QuicTime::Zero(), 1);
1322   // Data packet missing.
1323   // TODO(ianswett): Note that this is not a sensible ack, since if the FEC was
1324   // received, it would cause the covered packet to be acked as well.
1325   ack_fec.received_info.missing_packets.insert(1);
1326   ack_fec.received_info.entropy_hash =
1327       QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
1328       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1329 
1330   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
1331 
1332   ProcessAckPacket(&ack_fec);
1333 
1334   clock_.AdvanceTime(DefaultRetransmissionTime());
1335 
1336   // Don't abandon the acked FEC packet, but it will abandon 2 the subsequent
1337   // FEC packets.
1338   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(5);
1339   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
1340   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
1341   connection_.GetRetransmissionAlarm()->Fire();
1342 }
1343 
TEST_F(QuicConnectionTest,DontAbandonAllFEC)1344 TEST_F(QuicConnectionTest, DontAbandonAllFEC) {
1345   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1346   connection_.options()->max_packets_per_fec_group = 1;
1347 
1348   // 1 Data and 1 FEC packet.
1349   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1350   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
1351   // Send some more data afterwards to ensure early retransmit doesn't trigger.
1352   connection_.SendStreamDataWithString(1, "foo", 3, !kFin, NULL);
1353   // Advance the time so not all the FEC packets are abandoned.
1354   clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
1355   connection_.SendStreamDataWithString(1, "foo", 6, !kFin, NULL);
1356 
1357   QuicAckFrame ack_fec(5, QuicTime::Zero(), 1);
1358   // Ack all data packets, but no fec packets.
1359   ack_fec.received_info.missing_packets.insert(2);
1360   ack_fec.received_info.missing_packets.insert(4);
1361   ack_fec.received_info.entropy_hash =
1362       QuicConnectionPeer::GetSentEntropyHash(&connection_, 5) ^
1363       QuicConnectionPeer::GetSentEntropyHash(&connection_, 4) ^
1364       QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
1365       QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
1366       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1367 
1368   // Lose the first FEC packet and ack the three data packets.
1369   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(3);
1370   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _));
1371   EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _));
1372   ProcessAckPacket(&ack_fec);
1373 
1374   clock_.AdvanceTime(DefaultRetransmissionTime().Subtract(
1375       QuicTime::Delta::FromMilliseconds(1)));
1376 
1377   // Don't abandon the acked FEC packet, but it will abandon 1 of the subsequent
1378   // FEC packets.
1379   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(4, _));
1380   connection_.GetRetransmissionAlarm()->Fire();
1381 
1382   // Ensure the connection's alarm is still set, in order to abandon the third
1383   // FEC packet.
1384   EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
1385 }
1386 
TEST_F(QuicConnectionTest,FramePacking)1387 TEST_F(QuicConnectionTest, FramePacking) {
1388   // Block the connection.
1389   connection_.GetSendAlarm()->Set(
1390       clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1)));
1391 
1392   // Send an ack and two stream frames in 1 packet by queueing them.
1393   connection_.SendAck();
1394   EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1395       IgnoreResult(InvokeWithoutArgs(&connection_,
1396                                      &TestConnection::SendStreamData3)),
1397       IgnoreResult(InvokeWithoutArgs(&connection_,
1398                                      &TestConnection::SendStreamData5)),
1399       Return(true)));
1400 
1401   EXPECT_CALL(*send_algorithm_,
1402               OnPacketSent(_, _, _, NOT_RETRANSMISSION, _))
1403       .Times(1);
1404   // Unblock the connection.
1405   connection_.GetSendAlarm()->Fire();
1406   EXPECT_EQ(0u, connection_.NumQueuedPackets());
1407   EXPECT_FALSE(connection_.HasQueuedData());
1408 
1409   // Parse the last packet and ensure it's an ack and two stream frames from
1410   // two different streams.
1411   EXPECT_EQ(3u, writer_->frame_count());
1412   EXPECT_TRUE(writer_->ack());
1413   EXPECT_EQ(2u, writer_->stream_frames()->size());
1414   EXPECT_EQ(kStreamId3, (*writer_->stream_frames())[0].stream_id);
1415   EXPECT_EQ(kStreamId5, (*writer_->stream_frames())[1].stream_id);
1416 }
1417 
TEST_F(QuicConnectionTest,FramePackingNonCryptoThenCrypto)1418 TEST_F(QuicConnectionTest, FramePackingNonCryptoThenCrypto) {
1419   // Block the connection.
1420   connection_.GetSendAlarm()->Set(
1421       clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1)));
1422 
1423   // Send an ack and two stream frames (one non-crypto, then one crypto) in 2
1424   // packets by queueing them.
1425   connection_.SendAck();
1426   EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1427       IgnoreResult(InvokeWithoutArgs(&connection_,
1428                                      &TestConnection::SendStreamData3)),
1429       IgnoreResult(InvokeWithoutArgs(&connection_,
1430                                      &TestConnection::SendCryptoStreamData)),
1431       Return(true)));
1432 
1433   EXPECT_CALL(*send_algorithm_,
1434               OnPacketSent(_, _, _, NOT_RETRANSMISSION, _))
1435       .Times(2);
1436   // Unblock the connection.
1437   connection_.GetSendAlarm()->Fire();
1438   EXPECT_EQ(0u, connection_.NumQueuedPackets());
1439   EXPECT_FALSE(connection_.HasQueuedData());
1440 
1441   // Parse the last packet and ensure it's the crypto stream frame.
1442   EXPECT_EQ(1u, writer_->frame_count());
1443   EXPECT_EQ(1u, writer_->stream_frames()->size());
1444   EXPECT_EQ(kCryptoStreamId, (*writer_->stream_frames())[0].stream_id);
1445 }
1446 
TEST_F(QuicConnectionTest,FramePackingCryptoThenNonCrypto)1447 TEST_F(QuicConnectionTest, FramePackingCryptoThenNonCrypto) {
1448   // Block the connection.
1449   connection_.GetSendAlarm()->Set(
1450       clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1)));
1451 
1452   // Send an ack and two stream frames (one crypto, then one non-crypto) in 3
1453   // packets by queueing them.
1454   connection_.SendAck();
1455   EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1456       IgnoreResult(InvokeWithoutArgs(&connection_,
1457                                      &TestConnection::SendCryptoStreamData)),
1458       IgnoreResult(InvokeWithoutArgs(&connection_,
1459                                      &TestConnection::SendStreamData3)),
1460       Return(true)));
1461 
1462   EXPECT_CALL(*send_algorithm_,
1463               OnPacketSent(_, _, _, NOT_RETRANSMISSION, _))
1464       .Times(3);
1465   // Unblock the connection.
1466   connection_.GetSendAlarm()->Fire();
1467   EXPECT_EQ(0u, connection_.NumQueuedPackets());
1468   EXPECT_FALSE(connection_.HasQueuedData());
1469 
1470   // Parse the last packet and ensure it's the stream frame from stream 3.
1471   EXPECT_EQ(1u, writer_->frame_count());
1472   EXPECT_EQ(1u, writer_->stream_frames()->size());
1473   EXPECT_EQ(kStreamId3, (*writer_->stream_frames())[0].stream_id);
1474 }
1475 
TEST_F(QuicConnectionTest,FramePackingFEC)1476 TEST_F(QuicConnectionTest, FramePackingFEC) {
1477   // Enable fec.
1478   connection_.options()->max_packets_per_fec_group = 6;
1479   // Block the connection.
1480   connection_.GetSendAlarm()->Set(
1481       clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1)));
1482 
1483   // Send an ack and two stream frames in 1 packet by queueing them.
1484   connection_.SendAck();
1485   EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1486       IgnoreResult(InvokeWithoutArgs(&connection_,
1487                                      &TestConnection::SendStreamData3)),
1488       IgnoreResult(InvokeWithoutArgs(&connection_,
1489                                      &TestConnection::SendStreamData5)),
1490       Return(true)));
1491 
1492   EXPECT_CALL(*send_algorithm_,
1493               OnPacketSent(_, _, _, NOT_RETRANSMISSION, _)).Times(2);
1494   // Unblock the connection.
1495   connection_.GetSendAlarm()->Fire();
1496   EXPECT_EQ(0u, connection_.NumQueuedPackets());
1497   EXPECT_FALSE(connection_.HasQueuedData());
1498 
1499   // Parse the last packet and ensure it's in an fec group.
1500   EXPECT_EQ(1u, writer_->header()->fec_group);
1501   EXPECT_EQ(0u, writer_->frame_count());
1502 }
1503 
TEST_F(QuicConnectionTest,FramePackingAckResponse)1504 TEST_F(QuicConnectionTest, FramePackingAckResponse) {
1505   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1506   // Process a data packet to queue up a pending ack.
1507   EXPECT_CALL(visitor_, OnStreamFrames(_)).WillOnce(Return(true));
1508   ProcessDataPacket(1, 1, kEntropyFlag);
1509 
1510   EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1511       IgnoreResult(InvokeWithoutArgs(&connection_,
1512                                      &TestConnection::SendStreamData3)),
1513       IgnoreResult(InvokeWithoutArgs(&connection_,
1514                                      &TestConnection::SendStreamData5)),
1515       Return(true)));
1516 
1517   EXPECT_CALL(*send_algorithm_,
1518               OnPacketSent(_, _, _, NOT_RETRANSMISSION, _))
1519       .Times(1);
1520 
1521   // Process an ack to cause the visitor's OnCanWrite to be invoked.
1522   creator_.set_sequence_number(2);
1523   QuicAckFrame ack_one(0, QuicTime::Zero(), 0);
1524   ProcessAckPacket(&ack_one);
1525 
1526   EXPECT_EQ(0u, connection_.NumQueuedPackets());
1527   EXPECT_FALSE(connection_.HasQueuedData());
1528 
1529   // Parse the last packet and ensure it's an ack and two stream frames from
1530   // two different streams.
1531   EXPECT_EQ(3u, writer_->frame_count());
1532   EXPECT_TRUE(writer_->ack());
1533   ASSERT_EQ(2u, writer_->stream_frames()->size());
1534   EXPECT_EQ(kStreamId3, (*writer_->stream_frames())[0].stream_id);
1535   EXPECT_EQ(kStreamId5, (*writer_->stream_frames())[1].stream_id);
1536 }
1537 
TEST_F(QuicConnectionTest,FramePackingSendv)1538 TEST_F(QuicConnectionTest, FramePackingSendv) {
1539   // Send data in 1 packet by writing multiple blocks in a single iovector
1540   // using writev.
1541   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _));
1542 
1543   char data[] = "ABCD";
1544   IOVector data_iov;
1545   data_iov.AppendNoCoalesce(data, 2);
1546   data_iov.AppendNoCoalesce(data + 2, 2);
1547   connection_.SendStreamData(1, data_iov, 0, !kFin, NULL);
1548 
1549   EXPECT_EQ(0u, connection_.NumQueuedPackets());
1550   EXPECT_FALSE(connection_.HasQueuedData());
1551 
1552   // Parse the last packet and ensure multiple iovector blocks have
1553   // been packed into a single stream frame from one stream.
1554   EXPECT_EQ(1u, writer_->frame_count());
1555   EXPECT_EQ(1u, writer_->stream_frames()->size());
1556   QuicStreamFrame frame = (*writer_->stream_frames())[0];
1557   EXPECT_EQ(1u, frame.stream_id);
1558   EXPECT_EQ("ABCD", string(static_cast<char*>
1559                            (frame.data.iovec()[0].iov_base),
1560                            (frame.data.iovec()[0].iov_len)));
1561 }
1562 
TEST_F(QuicConnectionTest,FramePackingSendvQueued)1563 TEST_F(QuicConnectionTest, FramePackingSendvQueued) {
1564   // Try to send two stream frames in 1 packet by using writev.
1565   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _));
1566 
1567   writer_->set_blocked(true);
1568   char data[] = "ABCD";
1569   IOVector data_iov;
1570   data_iov.AppendNoCoalesce(data, 2);
1571   data_iov.AppendNoCoalesce(data + 2, 2);
1572   connection_.SendStreamData(1, data_iov, 0, !kFin, NULL);
1573 
1574   EXPECT_EQ(1u, connection_.NumQueuedPackets());
1575   EXPECT_TRUE(connection_.HasQueuedData());
1576 
1577   // Attempt to send all packets, but since we're actually still
1578   // blocked, they should all remain queued.
1579   EXPECT_FALSE(connection_.OnCanWrite());
1580   EXPECT_EQ(1u, connection_.NumQueuedPackets());
1581 
1582   // Unblock the writes and actually send.
1583   writer_->set_blocked(false);
1584   EXPECT_TRUE(connection_.OnCanWrite());
1585   EXPECT_EQ(0u, connection_.NumQueuedPackets());
1586 
1587   // Parse the last packet and ensure it's one stream frame from one stream.
1588   EXPECT_EQ(1u, writer_->frame_count());
1589   EXPECT_EQ(1u, writer_->stream_frames()->size());
1590   EXPECT_EQ(1u, (*writer_->stream_frames())[0].stream_id);
1591 }
1592 
TEST_F(QuicConnectionTest,SendingZeroBytes)1593 TEST_F(QuicConnectionTest, SendingZeroBytes) {
1594   // Send a zero byte write with a fin using writev.
1595   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _));
1596   IOVector empty_iov;
1597   connection_.SendStreamData(1, empty_iov, 0, kFin, NULL);
1598 
1599   EXPECT_EQ(0u, connection_.NumQueuedPackets());
1600   EXPECT_FALSE(connection_.HasQueuedData());
1601 
1602   // Parse the last packet and ensure it's one stream frame from one stream.
1603   EXPECT_EQ(1u, writer_->frame_count());
1604   EXPECT_EQ(1u, writer_->stream_frames()->size());
1605   EXPECT_EQ(1u, (*writer_->stream_frames())[0].stream_id);
1606   EXPECT_TRUE((*writer_->stream_frames())[0].fin);
1607 }
1608 
TEST_F(QuicConnectionTest,OnCanWrite)1609 TEST_F(QuicConnectionTest, OnCanWrite) {
1610   // Visitor's OnCanWill send data, but will return false.
1611   EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1612       IgnoreResult(InvokeWithoutArgs(&connection_,
1613                                      &TestConnection::SendStreamData3)),
1614       IgnoreResult(InvokeWithoutArgs(&connection_,
1615                                      &TestConnection::SendStreamData5)),
1616       Return(false)));
1617 
1618   EXPECT_CALL(*send_algorithm_,
1619               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillRepeatedly(
1620                   testing::Return(QuicTime::Delta::Zero()));
1621 
1622   // Unblock the connection.
1623   connection_.OnCanWrite();
1624   // Parse the last packet and ensure it's the two stream frames from
1625   // two different streams.
1626   EXPECT_EQ(2u, writer_->frame_count());
1627   EXPECT_EQ(2u, writer_->stream_frames()->size());
1628   EXPECT_EQ(kStreamId3, (*writer_->stream_frames())[0].stream_id);
1629   EXPECT_EQ(kStreamId5, (*writer_->stream_frames())[1].stream_id);
1630 }
1631 
TEST_F(QuicConnectionTest,RetransmitOnNack)1632 TEST_F(QuicConnectionTest, RetransmitOnNack) {
1633   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
1634   EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1);
1635   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)).Times(1);
1636   QuicPacketSequenceNumber last_packet;
1637   QuicByteCount second_packet_size;
1638   SendStreamDataToPeer(3, "foo", 0, !kFin, &last_packet);  // Packet 1
1639   second_packet_size =
1640       SendStreamDataToPeer(3, "foos", 3, !kFin, &last_packet);  // Packet 2
1641   SendStreamDataToPeer(3, "fooos", 7, !kFin, &last_packet);  // Packet 3
1642 
1643   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1644 
1645   // Peer acks one but not two or three.  Right now we only retransmit on
1646   // explicit nack, so it should not trigger a retransmission.
1647   QuicAckFrame ack_one(1, QuicTime::Zero(), 0);
1648   ack_one.received_info.entropy_hash =
1649       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1650   ProcessAckPacket(&ack_one);
1651   ProcessAckPacket(&ack_one);
1652   ProcessAckPacket(&ack_one);
1653 
1654   // Peer acks up to 3 with two explicitly missing.
1655   // Early retransmit causes 2 to be retransmitted on the first ack.
1656   QuicAckFrame nack_two(3, QuicTime::Zero(), 0);
1657   nack_two.received_info.missing_packets.insert(2);
1658   nack_two.received_info.entropy_hash =
1659       QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
1660       QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
1661       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1662   // The third nack should trigger a retransmission.
1663   EXPECT_CALL(*send_algorithm_,
1664               OnPacketSent(_, _, second_packet_size - kQuicVersionSize,
1665                            NACK_RETRANSMISSION, _)).Times(1);
1666   ProcessAckPacket(&nack_two);
1667 }
1668 
TEST_F(QuicConnectionTest,DiscardRetransmit)1669 TEST_F(QuicConnectionTest, DiscardRetransmit) {
1670   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
1671   EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1);
1672   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)).Times(1);
1673   QuicPacketSequenceNumber last_packet;
1674   SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);  // Packet 1
1675   SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet);  // Packet 2
1676   SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet);  // Packet 3
1677 
1678   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1679 
1680   // Peer acks one but not two or three.  Right now we only retransmit on
1681   // explicit nack, so it should not trigger a retransmission.
1682   QuicAckFrame ack_one(1, QuicTime::Zero(), 0);
1683   ack_one.received_info.entropy_hash =
1684       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1685   ProcessAckPacket(&ack_one);
1686   ProcessAckPacket(&ack_one);
1687   ProcessAckPacket(&ack_one);
1688 
1689   // Peer acks up to 3 with two explicitly missing.  Two nacks should cause no
1690   // change.
1691   QuicAckFrame nack_two(3, QuicTime::Zero(), 0);
1692   nack_two.received_info.missing_packets.insert(2);
1693   nack_two.received_info.entropy_hash =
1694       QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
1695       QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
1696       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1697   // The first nack should trigger a fast retransmission, but we'll be
1698   // write blocked, so the packet will be queued.
1699   writer_->set_blocked(true);
1700 
1701   ProcessAckPacket(&nack_two);
1702   EXPECT_EQ(1u, connection_.NumQueuedPackets());
1703 
1704   // Now, ack the previous transmission.
1705   QuicAckFrame ack_all(3, QuicTime::Zero(), 0);
1706   ack_all.received_info.entropy_hash =
1707       QuicConnectionPeer::GetSentEntropyHash(&connection_, 3);
1708   ProcessAckPacket(&ack_all);
1709 
1710   // Unblock the socket and attempt to send the queued packets.  However,
1711   // since the previous transmission has been acked, we will not
1712   // send the retransmission.
1713   EXPECT_CALL(*send_algorithm_,
1714               OnPacketSent(_, _, _, _, _)).Times(0);
1715 
1716   writer_->set_blocked(false);
1717   connection_.OnCanWrite();
1718 
1719   EXPECT_EQ(0u, connection_.NumQueuedPackets());
1720 }
1721 
TEST_F(QuicConnectionTest,RetransmitNackedLargestObserved)1722 TEST_F(QuicConnectionTest, RetransmitNackedLargestObserved) {
1723   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1724   EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1);
1725   QuicPacketSequenceNumber largest_observed;
1726   QuicByteCount packet_size;
1727   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _))
1728       .WillOnce(DoAll(SaveArg<1>(&largest_observed), SaveArg<2>(&packet_size),
1729                       Return(true)));
1730   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1);
1731   connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
1732   QuicAckFrame frame(1, QuicTime::Zero(), largest_observed);
1733   frame.received_info.missing_packets.insert(largest_observed);
1734   frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
1735       &connection_, largest_observed - 1);
1736   // The first nack should retransmit the largest observed packet.
1737   EXPECT_CALL(*send_algorithm_,
1738               OnPacketSent(_, _, packet_size - kQuicVersionSize,
1739                            NACK_RETRANSMISSION, _));
1740   ProcessAckPacket(&frame);
1741 }
1742 
TEST_F(QuicConnectionTest,QueueAfterTwoRTOs)1743 TEST_F(QuicConnectionTest, QueueAfterTwoRTOs) {
1744   for (int i = 0; i < 10; ++i) {
1745     EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1746     connection_.SendStreamDataWithString(1, "foo", i * 3, !kFin, NULL);
1747   }
1748 
1749   // Block the congestion window and ensure they're queued.
1750   writer_->set_blocked(true);
1751   clock_.AdvanceTime(DefaultRetransmissionTime());
1752   // Only one packet should be retransmitted.
1753   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
1754   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(10);
1755   connection_.GetRetransmissionAlarm()->Fire();
1756   EXPECT_TRUE(connection_.HasQueuedData());
1757 
1758   // Unblock the congestion window.
1759   writer_->set_blocked(false);
1760   clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(
1761       2 * DefaultRetransmissionTime().ToMicroseconds()));
1762   // Retransmit already retransmitted packets event though the sequence number
1763   // greater than the largest observed.
1764   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(10);
1765   connection_.GetRetransmissionAlarm()->Fire();
1766   connection_.OnCanWrite();
1767 }
1768 
TEST_F(QuicConnectionTest,WriteBlockedThenSent)1769 TEST_F(QuicConnectionTest, WriteBlockedThenSent) {
1770   writer_->set_blocked(true);
1771 
1772   writer_->set_is_write_blocked_data_buffered(true);
1773   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
1774   EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
1775 
1776   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1777   connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0));
1778   EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
1779 }
1780 
TEST_F(QuicConnectionTest,ResumptionAlarmThenWriteBlocked)1781 TEST_F(QuicConnectionTest, ResumptionAlarmThenWriteBlocked) {
1782   // Set the send and resumption alarm, then block the connection.
1783   connection_.GetResumeWritesAlarm()->Set(clock_.ApproximateNow());
1784   connection_.GetSendAlarm()->Set(clock_.ApproximateNow());
1785   QuicConnectionPeer::SetIsWriteBlocked(&connection_, true);
1786 
1787   // Fire the alarms and ensure the connection is still write blocked.
1788   connection_.GetResumeWritesAlarm()->Fire();
1789   connection_.GetSendAlarm()->Fire();
1790   EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_));
1791 }
1792 
TEST_F(QuicConnectionTest,LimitPacketsPerNack)1793 TEST_F(QuicConnectionTest, LimitPacketsPerNack) {
1794   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1795   EXPECT_CALL(*send_algorithm_, OnPacketAcked(15, _, _)).Times(1);
1796   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(4);
1797   int offset = 0;
1798   // Send packets 1 to 15.
1799   for (int i = 0; i < 15; ++i) {
1800     SendStreamDataToPeer(1, "foo", offset, !kFin, NULL);
1801     offset += 3;
1802   }
1803 
1804   // Ack 15, nack 1-14.
1805   QuicAckFrame nack(15, QuicTime::Zero(), 0);
1806   for (int i = 1; i < 15; ++i) {
1807     nack.received_info.missing_packets.insert(i);
1808   }
1809 
1810   nack.received_info.entropy_hash =
1811       QuicConnectionPeer::GetSentEntropyHash(&connection_, 15) ^
1812       QuicConnectionPeer::GetSentEntropyHash(&connection_, 14);
1813 
1814   // 13 packets have been NACK'd 3 times, but we limit retransmissions to 2.
1815   EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(2);
1816   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
1817   ProcessAckPacket(&nack);
1818 
1819   // The next call should trigger retransmitting 2 more packets.
1820   EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(2);
1821   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
1822   ProcessAckPacket(&nack);
1823 }
1824 
1825 // Test sending multiple acks from the connection to the session.
TEST_F(QuicConnectionTest,MultipleAcks)1826 TEST_F(QuicConnectionTest, MultipleAcks) {
1827   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(6);
1828   QuicPacketSequenceNumber last_packet;
1829   SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);  // Packet 1
1830   EXPECT_EQ(1u, last_packet);
1831   SendStreamDataToPeer(3, "foo", 0, !kFin, &last_packet);  // Packet 2
1832   EXPECT_EQ(2u, last_packet);
1833   SendAckPacketToPeer();  // Packet 3
1834   SendStreamDataToPeer(5, "foo", 0, !kFin, &last_packet);  // Packet 4
1835   EXPECT_EQ(4u, last_packet);
1836   SendStreamDataToPeer(1, "foo", 3, !kFin, &last_packet);  // Packet 5
1837   EXPECT_EQ(5u, last_packet);
1838   SendStreamDataToPeer(3, "foo", 3, !kFin, &last_packet);  // Packet 6
1839   EXPECT_EQ(6u, last_packet);
1840 
1841   // Client will ack packets 1, 2, [!3], 4, 5.
1842   QuicAckFrame frame1(5, QuicTime::Zero(), 0);
1843   frame1.received_info.missing_packets.insert(3);
1844   frame1.received_info.entropy_hash =
1845       QuicConnectionPeer::GetSentEntropyHash(&connection_, 5) ^
1846       QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
1847       QuicConnectionPeer::GetSentEntropyHash(&connection_, 2);
1848 
1849   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1850 
1851   ProcessAckPacket(&frame1);
1852 
1853   // Now the client implicitly acks 3, and explicitly acks 6.
1854   QuicAckFrame frame2(6, QuicTime::Zero(), 0);
1855   frame2.received_info.entropy_hash =
1856       QuicConnectionPeer::GetSentEntropyHash(&connection_, 6);
1857 
1858   ProcessAckPacket(&frame2);
1859 }
1860 
TEST_F(QuicConnectionTest,DontLatchUnackedPacket)1861 TEST_F(QuicConnectionTest, DontLatchUnackedPacket) {
1862   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
1863   SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);  // Packet 1;
1864   SendAckPacketToPeer();  // Packet 2
1865 
1866   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1867   QuicAckFrame frame(1, QuicTime::Zero(), 0);
1868   frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
1869       &connection_, 1);
1870   ProcessAckPacket(&frame);
1871 
1872   // Verify that our internal state has least-unacked as 3.
1873   EXPECT_EQ(3u, outgoing_ack()->sent_info.least_unacked);
1874 
1875   // When we send an ack, we make sure our least-unacked makes sense.  In this
1876   // case since we're not waiting on an ack for 2 and all packets are acked, we
1877   // set it to 3.
1878   SendAckPacketToPeer();  // Packet 3
1879   // Since this was an ack packet, we set least_unacked to 4.
1880   EXPECT_EQ(4u, outgoing_ack()->sent_info.least_unacked);
1881   // Check that the outgoing ack had its sequence number as least_unacked.
1882   EXPECT_EQ(3u, last_ack()->sent_info.least_unacked);
1883 
1884   SendStreamDataToPeer(1, "bar", 3, false, NULL);  // Packet 4
1885   EXPECT_EQ(4u, outgoing_ack()->sent_info.least_unacked);
1886   SendAckPacketToPeer();  // Packet 5
1887   EXPECT_EQ(4u, last_ack()->sent_info.least_unacked);
1888 }
1889 
TEST_F(QuicConnectionTest,ReviveMissingPacketAfterFecPacket)1890 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterFecPacket) {
1891   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1892 
1893   // Don't send missing packet 1.
1894   ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL);
1895   // Entropy flag should be false, so entropy should be 0.
1896   EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
1897 }
1898 
TEST_F(QuicConnectionTest,ReviveMissingPacketAfterDataPacketThenFecPacket)1899 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacketThenFecPacket) {
1900   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1901 
1902   ProcessFecProtectedPacket(1, false, kEntropyFlag);
1903   // Don't send missing packet 2.
1904   ProcessFecPacket(3, 1, true, !kEntropyFlag, NULL);
1905   // Entropy flag should be true, so entropy should not be 0.
1906   EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
1907 }
1908 
TEST_F(QuicConnectionTest,ReviveMissingPacketAfterDataPacketsThenFecPacket)1909 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacketsThenFecPacket) {
1910   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1911 
1912   ProcessFecProtectedPacket(1, false, !kEntropyFlag);
1913   // Don't send missing packet 2.
1914   ProcessFecProtectedPacket(3, false, !kEntropyFlag);
1915   ProcessFecPacket(4, 1, true, kEntropyFlag, NULL);
1916   // Entropy flag should be true, so entropy should not be 0.
1917   EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
1918 }
1919 
TEST_F(QuicConnectionTest,ReviveMissingPacketAfterDataPacket)1920 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacket) {
1921   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1922 
1923   // Don't send missing packet 1.
1924   ProcessFecPacket(3, 1, false, !kEntropyFlag, NULL);
1925   // Out of order.
1926   ProcessFecProtectedPacket(2, true, !kEntropyFlag);
1927   // Entropy flag should be false, so entropy should be 0.
1928   EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
1929 }
1930 
TEST_F(QuicConnectionTest,ReviveMissingPacketAfterDataPackets)1931 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPackets) {
1932   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1933 
1934   ProcessFecProtectedPacket(1, false, !kEntropyFlag);
1935   // Don't send missing packet 2.
1936   ProcessFecPacket(6, 1, false, kEntropyFlag, NULL);
1937   ProcessFecProtectedPacket(3, false, kEntropyFlag);
1938   ProcessFecProtectedPacket(4, false, kEntropyFlag);
1939   ProcessFecProtectedPacket(5, true, !kEntropyFlag);
1940   // Entropy flag should be true, so entropy should be 0.
1941   EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
1942 }
1943 
TEST_F(QuicConnectionTest,RTO)1944 TEST_F(QuicConnectionTest, RTO) {
1945   QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
1946       DefaultRetransmissionTime());
1947   SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1948   EXPECT_EQ(1u, outgoing_ack()->sent_info.least_unacked);
1949 
1950   EXPECT_EQ(1u, last_header()->packet_sequence_number);
1951   EXPECT_EQ(default_retransmission_time,
1952             connection_.GetRetransmissionAlarm()->deadline());
1953   // Simulate the retransmission alarm firing.
1954   clock_.AdvanceTime(DefaultRetransmissionTime());
1955   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
1956   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1u, _));
1957   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 2u, _, _, _));
1958   connection_.GetRetransmissionAlarm()->Fire();
1959   EXPECT_EQ(2u, last_header()->packet_sequence_number);
1960   // We do not raise the high water mark yet.
1961   EXPECT_EQ(1u, outgoing_ack()->sent_info.least_unacked);
1962 }
1963 
TEST_F(QuicConnectionTest,RTOWithSameEncryptionLevel)1964 TEST_F(QuicConnectionTest, RTOWithSameEncryptionLevel) {
1965   QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
1966       DefaultRetransmissionTime());
1967   use_tagging_decrypter();
1968 
1969   // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at
1970   // the end of the packet. We can test this to check which encrypter was used.
1971   connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
1972   SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1973   EXPECT_EQ(0x01010101u, final_bytes_of_last_packet());
1974 
1975   connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
1976   connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
1977   SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1978   EXPECT_EQ(0x02020202u, final_bytes_of_last_packet());
1979 
1980   EXPECT_EQ(default_retransmission_time,
1981             connection_.GetRetransmissionAlarm()->deadline());
1982   {
1983     InSequence s;
1984     EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _));
1985     EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _));
1986     EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
1987     EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 3, _, RTO_RETRANSMISSION, _));
1988     EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 4, _, RTO_RETRANSMISSION, _));
1989   }
1990 
1991   // Simulate the retransmission alarm firing.
1992   clock_.AdvanceTime(DefaultRetransmissionTime());
1993   connection_.GetRetransmissionAlarm()->Fire();
1994 
1995   // Packet should have been sent with ENCRYPTION_NONE.
1996   EXPECT_EQ(0x01010101u, final_bytes_of_previous_packet());
1997 
1998   // Packet should have been sent with ENCRYPTION_INITIAL.
1999   EXPECT_EQ(0x02020202u, final_bytes_of_last_packet());
2000 }
2001 
TEST_F(QuicConnectionTest,SendHandshakeMessages)2002 TEST_F(QuicConnectionTest, SendHandshakeMessages) {
2003   use_tagging_decrypter();
2004   // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at
2005   // the end of the packet. We can test this to check which encrypter was used.
2006   connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
2007 
2008   // Attempt to send a handshake message while the congestion manager
2009   // does not permit sending.
2010   EXPECT_CALL(*send_algorithm_,
2011               TimeUntilSend(_, _, _, IS_HANDSHAKE)).WillRepeatedly(
2012                   testing::Return(QuicTime::Delta::Infinite()));
2013   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2014   // The packet should be serialized, but not queued.
2015   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2016 
2017   // Switch to the new encrypter.
2018   connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
2019   connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
2020 
2021   // Now become writeable and flush the packets.
2022   EXPECT_CALL(*send_algorithm_,
2023               TimeUntilSend(_, _, _, IS_HANDSHAKE)).WillRepeatedly(
2024                   testing::Return(QuicTime::Delta::Zero()));
2025   EXPECT_CALL(visitor_, OnCanWrite());
2026   connection_.OnCanWrite();
2027   EXPECT_EQ(0u, connection_.NumQueuedPackets());
2028 
2029   // Verify that the handshake packet went out at the null encryption.
2030   EXPECT_EQ(0x01010101u, final_bytes_of_last_packet());
2031 }
2032 
TEST_F(QuicConnectionTest,DropRetransmitsForNullEncryptedPacketAfterForwardSecure)2033 TEST_F(QuicConnectionTest,
2034        DropRetransmitsForNullEncryptedPacketAfterForwardSecure) {
2035   use_tagging_decrypter();
2036   connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
2037   QuicPacketSequenceNumber sequence_number;
2038   SendStreamDataToPeer(1, "foo", 0, !kFin, &sequence_number);
2039 
2040   connection_.SetEncrypter(ENCRYPTION_FORWARD_SECURE,
2041                            new TaggingEncrypter(0x02));
2042   connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
2043 
2044   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
2045   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
2046   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(sequence_number, _)).Times(1);
2047 
2048   QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
2049       DefaultRetransmissionTime());
2050 
2051   EXPECT_EQ(default_retransmission_time,
2052             connection_.GetRetransmissionAlarm()->deadline());
2053   // Simulate the retransmission alarm firing.
2054   clock_.AdvanceTime(DefaultRetransmissionTime());
2055   connection_.GetRetransmissionAlarm()->Fire();
2056 }
2057 
TEST_F(QuicConnectionTest,RetransmitPacketsWithInitialEncryption)2058 TEST_F(QuicConnectionTest, RetransmitPacketsWithInitialEncryption) {
2059   use_tagging_decrypter();
2060   connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
2061   connection_.SetDefaultEncryptionLevel(ENCRYPTION_NONE);
2062 
2063   SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
2064 
2065   connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
2066   connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
2067 
2068   SendStreamDataToPeer(2, "bar", 0, !kFin, NULL);
2069 
2070   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
2071   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(1);
2072 
2073   connection_.RetransmitUnackedPackets(INITIAL_ENCRYPTION_ONLY);
2074 }
2075 
TEST_F(QuicConnectionTest,BufferNonDecryptablePackets)2076 TEST_F(QuicConnectionTest, BufferNonDecryptablePackets) {
2077   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2078   use_tagging_decrypter();
2079 
2080   const uint8 tag = 0x07;
2081   framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag));
2082 
2083   // Process an encrypted packet which can not yet be decrypted
2084   // which should result in the packet being buffered.
2085   ProcessDataPacketAtLevel(1, false, kEntropyFlag, ENCRYPTION_INITIAL);
2086 
2087   // Transition to the new encryption state and process another
2088   // encrypted packet which should result in the original packet being
2089   // processed.
2090   connection_.SetDecrypter(new StrictTaggingDecrypter(tag));
2091   connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
2092   connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag));
2093   EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(2).WillRepeatedly(
2094       Return(true));
2095   ProcessDataPacketAtLevel(2, false, kEntropyFlag, ENCRYPTION_INITIAL);
2096 
2097   // Finally, process a third packet and note that we do not
2098   // reprocess the buffered packet.
2099   EXPECT_CALL(visitor_, OnStreamFrames(_)).WillOnce(Return(true));
2100   ProcessDataPacketAtLevel(3, false, kEntropyFlag, ENCRYPTION_INITIAL);
2101 }
2102 
TEST_F(QuicConnectionTest,TestRetransmitOrder)2103 TEST_F(QuicConnectionTest, TestRetransmitOrder) {
2104   QuicByteCount first_packet_size;
2105   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).WillOnce(
2106       DoAll(SaveArg<2>(&first_packet_size), Return(true)));
2107 
2108   connection_.SendStreamDataWithString(3, "first_packet", 0, !kFin, NULL);
2109   QuicByteCount second_packet_size;
2110   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).WillOnce(
2111       DoAll(SaveArg<2>(&second_packet_size), Return(true)));
2112   connection_.SendStreamDataWithString(3, "second_packet", 12, !kFin, NULL);
2113   EXPECT_NE(first_packet_size, second_packet_size);
2114   // Advance the clock by huge time to make sure packets will be retransmitted.
2115   clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
2116   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
2117   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2);
2118   {
2119     InSequence s;
2120     EXPECT_CALL(*send_algorithm_,
2121                 OnPacketSent(_, _, first_packet_size, _, _));
2122     EXPECT_CALL(*send_algorithm_,
2123                 OnPacketSent(_, _, second_packet_size, _, _));
2124   }
2125   connection_.GetRetransmissionAlarm()->Fire();
2126 
2127   // Advance again and expect the packets to be sent again in the same order.
2128   clock_.AdvanceTime(QuicTime::Delta::FromSeconds(20));
2129   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
2130   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2);
2131   {
2132     InSequence s;
2133     EXPECT_CALL(*send_algorithm_,
2134                 OnPacketSent(_, _, first_packet_size, _, _));
2135     EXPECT_CALL(*send_algorithm_,
2136                 OnPacketSent(_, _, second_packet_size, _, _));
2137   }
2138   connection_.GetRetransmissionAlarm()->Fire();
2139 }
2140 
TEST_F(QuicConnectionTest,RetransmissionCountCalculation)2141 TEST_F(QuicConnectionTest, RetransmissionCountCalculation) {
2142   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2143   QuicPacketSequenceNumber original_sequence_number;
2144   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _))
2145       .WillOnce(DoAll(SaveArg<1>(&original_sequence_number), Return(true)));
2146   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2147 
2148   EXPECT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
2149       &connection_, original_sequence_number));
2150   EXPECT_FALSE(QuicConnectionPeer::IsRetransmission(
2151       &connection_, original_sequence_number));
2152   // Force retransmission due to RTO.
2153   clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
2154   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
2155   EXPECT_CALL(*send_algorithm_,
2156               OnPacketAbandoned(original_sequence_number, _)).Times(1);
2157   QuicPacketSequenceNumber rto_sequence_number;
2158   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, RTO_RETRANSMISSION, _))
2159       .WillOnce(DoAll(SaveArg<1>(&rto_sequence_number), Return(true)));
2160   connection_.GetRetransmissionAlarm()->Fire();
2161   EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission(
2162       &connection_, original_sequence_number));
2163   ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
2164       &connection_, rto_sequence_number));
2165   EXPECT_TRUE(QuicConnectionPeer::IsRetransmission(
2166       &connection_, rto_sequence_number));
2167   // Once by explicit nack.
2168   EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1);
2169   EXPECT_CALL(*send_algorithm_,
2170               OnPacketAbandoned(rto_sequence_number, _)).Times(1);
2171   QuicPacketSequenceNumber nack_sequence_number = 0;
2172   // Ack packets might generate some other packets, which are not
2173   // retransmissions. (More ack packets).
2174   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _))
2175       .Times(AnyNumber());
2176   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NACK_RETRANSMISSION, _))
2177       .WillOnce(DoAll(SaveArg<1>(&nack_sequence_number), Return(true)));
2178   QuicAckFrame ack(rto_sequence_number, QuicTime::Zero(), 0);
2179   // Ack the retransmitted packet.
2180   ack.received_info.missing_packets.insert(original_sequence_number);
2181   ack.received_info.missing_packets.insert(rto_sequence_number);
2182   ack.received_info.entropy_hash =
2183       QuicConnectionPeer::GetSentEntropyHash(&connection_,
2184                                              rto_sequence_number - 1) ^
2185       QuicConnectionPeer::GetSentEntropyHash(&connection_,
2186                                              original_sequence_number);
2187   for (int i = 0; i < 3; i++) {
2188     ProcessAckPacket(&ack);
2189   }
2190   ASSERT_NE(0u, nack_sequence_number);
2191   EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission(
2192       &connection_, rto_sequence_number));
2193   ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
2194       &connection_, nack_sequence_number));
2195   EXPECT_TRUE(QuicConnectionPeer::IsRetransmission(
2196       &connection_, nack_sequence_number));
2197 }
2198 
TEST_F(QuicConnectionTest,SetRTOAfterWritingToSocket)2199 TEST_F(QuicConnectionTest, SetRTOAfterWritingToSocket) {
2200   writer_->set_blocked(true);
2201   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2202   // Make sure that RTO is not started when the packet is queued.
2203   EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
2204 
2205   // Test that RTO is started once we write to the socket.
2206   writer_->set_blocked(false);
2207   connection_.OnCanWrite();
2208   EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
2209 }
2210 
TEST_F(QuicConnectionTest,DelayRTOWithAckReceipt)2211 TEST_F(QuicConnectionTest, DelayRTOWithAckReceipt) {
2212   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2213   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _))
2214       .Times(2);
2215   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2216   connection_.SendStreamDataWithString(2, "bar", 0, !kFin, NULL);
2217   QuicAlarm* retransmission_alarm = connection_.GetRetransmissionAlarm();
2218   EXPECT_TRUE(retransmission_alarm->IsSet());
2219 
2220   // Advance the time right before the RTO, then receive an ack for the first
2221   // packet to delay the RTO.
2222   clock_.AdvanceTime(DefaultRetransmissionTime());
2223   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
2224   QuicAckFrame ack(1, QuicTime::Zero(), 0);
2225   ack.received_info.entropy_hash =
2226       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
2227   ProcessAckPacket(&ack);
2228   EXPECT_TRUE(retransmission_alarm->IsSet());
2229 
2230   // Move forward past the original RTO and ensure the RTO is still pending.
2231   clock_.AdvanceTime(DefaultRetransmissionTime());
2232 
2233   // Ensure the second packet gets retransmitted when it finally fires.
2234   EXPECT_TRUE(retransmission_alarm->IsSet());
2235   EXPECT_GE(retransmission_alarm->deadline(), clock_.ApproximateNow());
2236   clock_.AdvanceTime(DefaultRetransmissionTime());
2237   EXPECT_LT(retransmission_alarm->deadline(), clock_.ApproximateNow());
2238   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
2239   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, RTO_RETRANSMISSION, _));
2240   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _));
2241   // Manually cancel the alarm to simulate a real test.
2242   connection_.GetRetransmissionAlarm()->Fire();
2243 
2244   // The new retransmitted sequence number should set the RTO to a larger value
2245   // than previously.
2246   EXPECT_TRUE(retransmission_alarm->IsSet());
2247   QuicTime next_rto_time = retransmission_alarm->deadline();
2248   QuicTime::Delta expected_rto =
2249       connection_.sent_packet_manager().GetRetransmissionDelay();
2250   EXPECT_EQ(next_rto_time, clock_.ApproximateNow().Add(expected_rto));
2251 }
2252 
TEST_F(QuicConnectionTest,TestQueued)2253 TEST_F(QuicConnectionTest, TestQueued) {
2254   EXPECT_EQ(0u, connection_.NumQueuedPackets());
2255   writer_->set_blocked(true);
2256   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2257   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2258 
2259   // Attempt to send all packets, but since we're actually still
2260   // blocked, they should all remain queued.
2261   EXPECT_FALSE(connection_.OnCanWrite());
2262   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2263 
2264   // Unblock the writes and actually send.
2265   writer_->set_blocked(false);
2266   EXPECT_TRUE(connection_.OnCanWrite());
2267   EXPECT_EQ(0u, connection_.NumQueuedPackets());
2268 }
2269 
TEST_F(QuicConnectionTest,CloseFecGroup)2270 TEST_F(QuicConnectionTest, CloseFecGroup) {
2271   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2272   // Don't send missing packet 1.
2273   // Don't send missing packet 2.
2274   ProcessFecProtectedPacket(3, false, !kEntropyFlag);
2275   // Don't send missing FEC packet 3.
2276   ASSERT_EQ(1u, connection_.NumFecGroups());
2277 
2278   // Now send non-fec protected ack packet and close the group.
2279   QuicAckFrame frame(0, QuicTime::Zero(), 5);
2280   creator_.set_sequence_number(4);
2281   ProcessAckPacket(&frame);
2282   ASSERT_EQ(0u, connection_.NumFecGroups());
2283 }
2284 
TEST_F(QuicConnectionTest,NoQuicCongestionFeedbackFrame)2285 TEST_F(QuicConnectionTest, NoQuicCongestionFeedbackFrame) {
2286   SendAckPacketToPeer();
2287   EXPECT_TRUE(last_feedback() == NULL);
2288 }
2289 
TEST_F(QuicConnectionTest,WithQuicCongestionFeedbackFrame)2290 TEST_F(QuicConnectionTest, WithQuicCongestionFeedbackFrame) {
2291   QuicCongestionFeedbackFrame info;
2292   info.type = kFixRate;
2293   info.fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(123);
2294   SetFeedback(&info);
2295 
2296   SendAckPacketToPeer();
2297   EXPECT_EQ(kFixRate, last_feedback()->type);
2298   EXPECT_EQ(info.fix_rate.bitrate, last_feedback()->fix_rate.bitrate);
2299 }
2300 
TEST_F(QuicConnectionTest,UpdateQuicCongestionFeedbackFrame)2301 TEST_F(QuicConnectionTest, UpdateQuicCongestionFeedbackFrame) {
2302   SendAckPacketToPeer();
2303   EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _, _));
2304   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2305   ProcessPacket(1);
2306 }
2307 
TEST_F(QuicConnectionTest,DontUpdateQuicCongestionFeedbackFrameForRevived)2308 TEST_F(QuicConnectionTest, DontUpdateQuicCongestionFeedbackFrameForRevived) {
2309   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2310   SendAckPacketToPeer();
2311   // Process an FEC packet, and revive the missing data packet
2312   // but only contact the receive_algorithm once.
2313   EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _, _));
2314   ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL);
2315 }
2316 
TEST_F(QuicConnectionTest,InitialTimeout)2317 TEST_F(QuicConnectionTest, InitialTimeout) {
2318   EXPECT_TRUE(connection_.connected());
2319   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_CONNECTION_TIMED_OUT, false));
2320   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
2321 
2322   QuicTime default_timeout = clock_.ApproximateNow().Add(
2323       QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
2324   EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
2325 
2326   // Simulate the timeout alarm firing.
2327   clock_.AdvanceTime(
2328       QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
2329   connection_.GetTimeoutAlarm()->Fire();
2330   EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet());
2331   EXPECT_FALSE(connection_.connected());
2332 
2333   EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2334   EXPECT_FALSE(connection_.GetResumeWritesAlarm()->IsSet());
2335   EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
2336   EXPECT_FALSE(connection_.GetSendAlarm()->IsSet());
2337   EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet());
2338 }
2339 
TEST_F(QuicConnectionTest,TimeoutAfterSend)2340 TEST_F(QuicConnectionTest, TimeoutAfterSend) {
2341   EXPECT_TRUE(connection_.connected());
2342 
2343   QuicTime default_timeout = clock_.ApproximateNow().Add(
2344       QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
2345 
2346   // When we send a packet, the timeout will change to 5000 +
2347   // kDefaultInitialTimeoutSecs.
2348   clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
2349 
2350   // Send an ack so we don't set the retransmission alarm.
2351   SendAckPacketToPeer();
2352   EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
2353 
2354   // The original alarm will fire.  We should not time out because we had a
2355   // network event at t=5000.  The alarm will reregister.
2356   clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(
2357       kDefaultInitialTimeoutSecs * 1000000 - 5000));
2358   EXPECT_EQ(default_timeout, clock_.ApproximateNow());
2359   connection_.GetTimeoutAlarm()->Fire();
2360   EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet());
2361   EXPECT_TRUE(connection_.connected());
2362   EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)),
2363             connection_.GetTimeoutAlarm()->deadline());
2364 
2365   // This time, we should time out.
2366   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_CONNECTION_TIMED_OUT, false));
2367   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
2368   clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
2369   EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)),
2370             clock_.ApproximateNow());
2371   connection_.GetTimeoutAlarm()->Fire();
2372   EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet());
2373   EXPECT_FALSE(connection_.connected());
2374 }
2375 
2376 // TODO(ianswett): Add scheduler tests when should_retransmit is false.
TEST_F(QuicConnectionTest,SendScheduler)2377 TEST_F(QuicConnectionTest, SendScheduler) {
2378   // Test that if we send a packet without delay, it is not queued.
2379   QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2380   EXPECT_CALL(*send_algorithm_,
2381               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
2382                   testing::Return(QuicTime::Delta::Zero()));
2383   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
2384   connection_.SendPacket(
2385       ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2386   EXPECT_EQ(0u, connection_.NumQueuedPackets());
2387 }
2388 
TEST_F(QuicConnectionTest,SendSchedulerDelay)2389 TEST_F(QuicConnectionTest, SendSchedulerDelay) {
2390   // Test that if we send a packet with a delay, it ends up queued.
2391   QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2392   EXPECT_CALL(*send_algorithm_,
2393               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
2394                   testing::Return(QuicTime::Delta::FromMicroseconds(1)));
2395   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 1, _, _, _)).Times(0);
2396   connection_.SendPacket(
2397       ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2398   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2399 }
2400 
TEST_F(QuicConnectionTest,SendSchedulerForce)2401 TEST_F(QuicConnectionTest, SendSchedulerForce) {
2402   // Test that if we force send a packet, it is not queued.
2403   QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2404   EXPECT_CALL(*send_algorithm_,
2405               TimeUntilSend(_, NACK_RETRANSMISSION, _, _)).Times(0);
2406   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
2407   connection_.SendPacket(
2408       ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2409   // XXX: fixme.  was:  connection_.SendPacket(1, packet, kForce);
2410   EXPECT_EQ(0u, connection_.NumQueuedPackets());
2411 }
2412 
TEST_F(QuicConnectionTest,SendSchedulerEAGAIN)2413 TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) {
2414   QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2415   writer_->set_blocked(true);
2416   EXPECT_CALL(*send_algorithm_,
2417               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
2418                   testing::Return(QuicTime::Delta::Zero()));
2419   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 1, _, _, _)).Times(0);
2420   connection_.SendPacket(
2421       ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2422   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2423 }
2424 
TEST_F(QuicConnectionTest,SendSchedulerDelayThenSend)2425 TEST_F(QuicConnectionTest, SendSchedulerDelayThenSend) {
2426   // Test that if we send a packet with a delay, it ends up queued.
2427   QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2428   EXPECT_CALL(*send_algorithm_,
2429               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
2430                   testing::Return(QuicTime::Delta::FromMicroseconds(1)));
2431   connection_.SendPacket(
2432        ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2433   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2434 
2435   // Advance the clock to fire the alarm, and configure the scheduler
2436   // to permit the packet to be sent.
2437   EXPECT_CALL(*send_algorithm_,
2438               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillRepeatedly(
2439                   testing::Return(QuicTime::Delta::Zero()));
2440   clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1));
2441   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
2442   connection_.GetSendAlarm()->Fire();
2443   EXPECT_EQ(0u, connection_.NumQueuedPackets());
2444 }
2445 
TEST_F(QuicConnectionTest,SendSchedulerDelayThenRetransmit)2446 TEST_F(QuicConnectionTest, SendSchedulerDelayThenRetransmit) {
2447   EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, NOT_RETRANSMISSION, _, _))
2448       .WillRepeatedly(testing::Return(QuicTime::Delta::Zero()));
2449   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1);
2450   EXPECT_CALL(*send_algorithm_,
2451               OnPacketSent(_, 1, _, NOT_RETRANSMISSION, _));
2452   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2453   EXPECT_EQ(0u, connection_.NumQueuedPackets());
2454   // Advance the time for retransmission of lost packet.
2455   clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501));
2456   // Test that if we send a retransmit with a delay, it ends up queued in the
2457   // sent packet manager, but not yet serialized.
2458   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
2459   EXPECT_CALL(*send_algorithm_,
2460               TimeUntilSend(_, RTO_RETRANSMISSION, _, _)).WillOnce(
2461                   testing::Return(QuicTime::Delta::FromMicroseconds(1)));
2462   connection_.GetRetransmissionAlarm()->Fire();
2463   EXPECT_EQ(0u, connection_.NumQueuedPackets());
2464 
2465   // Advance the clock to fire the alarm, and configure the scheduler
2466   // to permit the packet to be sent.
2467   EXPECT_CALL(*send_algorithm_,
2468               TimeUntilSend(_, RTO_RETRANSMISSION, _, _)).Times(2).
2469                   WillRepeatedly(testing::Return(QuicTime::Delta::Zero()));
2470 
2471   // Ensure the scheduler is notified this is a retransmit.
2472   EXPECT_CALL(*send_algorithm_,
2473               OnPacketSent(_, _, _, RTO_RETRANSMISSION, _));
2474   clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1));
2475   connection_.GetSendAlarm()->Fire();
2476   EXPECT_EQ(0u, connection_.NumQueuedPackets());
2477 }
2478 
TEST_F(QuicConnectionTest,SendSchedulerDelayAndQueue)2479 TEST_F(QuicConnectionTest, SendSchedulerDelayAndQueue) {
2480   QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2481   EXPECT_CALL(*send_algorithm_,
2482               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
2483                   testing::Return(QuicTime::Delta::FromMicroseconds(1)));
2484   connection_.SendPacket(
2485       ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2486   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2487 
2488   // Attempt to send another packet and make sure that it gets queued.
2489   packet = ConstructDataPacket(2, 0, !kEntropyFlag);
2490   connection_.SendPacket(
2491       ENCRYPTION_NONE, 2, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2492   EXPECT_EQ(2u, connection_.NumQueuedPackets());
2493 }
2494 
TEST_F(QuicConnectionTest,SendSchedulerDelayThenAckAndSend)2495 TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) {
2496   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2497   QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2498   EXPECT_CALL(*send_algorithm_,
2499               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
2500                   testing::Return(QuicTime::Delta::FromMicroseconds(10)));
2501   connection_.SendPacket(
2502       ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2503   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2504 
2505   // Now send non-retransmitting information, that we're not going to
2506   // retransmit 3. The far end should stop waiting for it.
2507   QuicAckFrame frame(0, QuicTime::Zero(), 1);
2508   EXPECT_CALL(*send_algorithm_,
2509               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillRepeatedly(
2510                   testing::Return(QuicTime::Delta::Zero()));
2511   EXPECT_CALL(*send_algorithm_,
2512               OnPacketSent(_, _, _, _, _));
2513   ProcessAckPacket(&frame);
2514 
2515   EXPECT_EQ(0u, connection_.NumQueuedPackets());
2516   // Ensure alarm is not set
2517   EXPECT_FALSE(connection_.GetSendAlarm()->IsSet());
2518 }
2519 
TEST_F(QuicConnectionTest,SendSchedulerDelayThenAckAndHold)2520 TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) {
2521   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2522   QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2523   EXPECT_CALL(*send_algorithm_,
2524               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
2525                   testing::Return(QuicTime::Delta::FromMicroseconds(10)));
2526   connection_.SendPacket(
2527       ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2528   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2529 
2530   // Now send non-retransmitting information, that we're not going to
2531   // retransmit 3.  The far end should stop waiting for it.
2532   QuicAckFrame frame(0, QuicTime::Zero(), 1);
2533   EXPECT_CALL(*send_algorithm_,
2534               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
2535                   testing::Return(QuicTime::Delta::FromMicroseconds(1)));
2536   ProcessAckPacket(&frame);
2537 
2538   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2539 }
2540 
TEST_F(QuicConnectionTest,SendSchedulerDelayThenOnCanWrite)2541 TEST_F(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) {
2542   QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2543   EXPECT_CALL(*send_algorithm_,
2544               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
2545                   testing::Return(QuicTime::Delta::FromMicroseconds(10)));
2546   connection_.SendPacket(
2547       ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2548   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2549 
2550   // OnCanWrite should not send the packet (because of the delay)
2551   // but should still return true.
2552   EXPECT_TRUE(connection_.OnCanWrite());
2553   EXPECT_EQ(1u, connection_.NumQueuedPackets());
2554 }
2555 
TEST_F(QuicConnectionTest,TestQueueLimitsOnSendStreamData)2556 TEST_F(QuicConnectionTest, TestQueueLimitsOnSendStreamData) {
2557   // All packets carry version info till version is negotiated.
2558   size_t payload_length;
2559   connection_.options()->max_packet_length =
2560       GetPacketLengthForOneStream(
2561           connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
2562           NOT_IN_FEC_GROUP, &payload_length);
2563 
2564   // Queue the first packet.
2565   EXPECT_CALL(*send_algorithm_,
2566               TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
2567                   testing::Return(QuicTime::Delta::FromMicroseconds(10)));
2568   const string payload(payload_length, 'a');
2569   EXPECT_EQ(0u,
2570             connection_.SendStreamDataWithString(3, payload, 0,
2571                                                  !kFin, NULL).bytes_consumed);
2572   EXPECT_EQ(0u, connection_.NumQueuedPackets());
2573 }
2574 
TEST_F(QuicConnectionTest,LoopThroughSendingPackets)2575 TEST_F(QuicConnectionTest, LoopThroughSendingPackets) {
2576   // All packets carry version info till version is negotiated.
2577   size_t payload_length;
2578   connection_.options()->max_packet_length =
2579       GetPacketLengthForOneStream(
2580           connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
2581           NOT_IN_FEC_GROUP, &payload_length);
2582 
2583   // Queue the first packet.
2584   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(7);
2585   // The first stream frame will consume 2 fewer bytes than the other six.
2586   const string payload(payload_length * 7 - 12, 'a');
2587   EXPECT_EQ(payload.size(),
2588             connection_.SendStreamDataWithString(1, payload, 0,
2589                                                  !kFin, NULL).bytes_consumed);
2590 }
2591 
TEST_F(QuicConnectionTest,SendDelayedAckOnTimer)2592 TEST_F(QuicConnectionTest, SendDelayedAckOnTimer) {
2593   QuicTime ack_time = clock_.ApproximateNow().Add(DefaultDelayedAckTime());
2594   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2595   EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2596   ProcessPacket(1);
2597   // Check if delayed ack timer is running for the expected interval.
2598   EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
2599   EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
2600   // Simulate delayed ack alarm firing.
2601   connection_.GetAckAlarm()->Fire();
2602   // Check that ack is sent and that delayed ack alarm is reset.
2603   EXPECT_EQ(1u, writer_->frame_count());
2604   EXPECT_TRUE(writer_->ack());
2605   EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2606 }
2607 
TEST_F(QuicConnectionTest,SendDelayedAckOnSecondPacket)2608 TEST_F(QuicConnectionTest, SendDelayedAckOnSecondPacket) {
2609   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2610   ProcessPacket(1);
2611   ProcessPacket(2);
2612   // Check that ack is sent and that delayed ack alarm is reset.
2613   EXPECT_EQ(1u, writer_->frame_count());
2614   EXPECT_TRUE(writer_->ack());
2615   EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2616 }
2617 
TEST_F(QuicConnectionTest,NoAckOnOldNacks)2618 TEST_F(QuicConnectionTest, NoAckOnOldNacks) {
2619   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2620   // Drop one packet, triggering a sequence of acks.
2621   ProcessPacket(2);
2622   EXPECT_EQ(1u, writer_->frame_count());
2623   EXPECT_TRUE(writer_->ack());
2624   writer_->Reset();
2625   ProcessPacket(3);
2626   EXPECT_EQ(1u, writer_->frame_count());
2627   EXPECT_TRUE(writer_->ack());
2628   writer_->Reset();
2629   ProcessPacket(4);
2630   EXPECT_EQ(1u, writer_->frame_count());
2631   EXPECT_TRUE(writer_->ack());
2632   writer_->Reset();
2633   ProcessPacket(5);
2634   EXPECT_EQ(1u, writer_->frame_count());
2635   EXPECT_TRUE(writer_->ack());
2636   // Now only set the timer on the 6th packet, instead of sending another ack.
2637   writer_->Reset();
2638   ProcessPacket(6);
2639   EXPECT_EQ(0u, writer_->frame_count());
2640   EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
2641 }
2642 
TEST_F(QuicConnectionTest,SendDelayedAckOnOutgoingPacket)2643 TEST_F(QuicConnectionTest, SendDelayedAckOnOutgoingPacket) {
2644   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2645   ProcessPacket(1);
2646   connection_.SendStreamDataWithString(kStreamId3, "foo", 0, !kFin, NULL);
2647   // Check that ack is bundled with outgoing data and that delayed ack
2648   // alarm is reset.
2649   EXPECT_EQ(2u, writer_->frame_count());
2650   EXPECT_TRUE(writer_->ack());
2651   EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2652 }
2653 
TEST_F(QuicConnectionTest,DontSendDelayedAckOnOutgoingCryptoPacket)2654 TEST_F(QuicConnectionTest, DontSendDelayedAckOnOutgoingCryptoPacket) {
2655   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2656   ProcessPacket(1);
2657   connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, !kFin, NULL);
2658   // Check that ack is not bundled with outgoing data.
2659   EXPECT_EQ(1u, writer_->frame_count());
2660   EXPECT_FALSE(writer_->ack());
2661   EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
2662 }
2663 
TEST_F(QuicConnectionTest,NoAckForClose)2664 TEST_F(QuicConnectionTest, NoAckForClose) {
2665   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2666   ProcessPacket(1);
2667   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(0);
2668   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, true));
2669   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
2670   ProcessClosePacket(2, 0);
2671 }
2672 
TEST_F(QuicConnectionTest,SendWhenDisconnected)2673 TEST_F(QuicConnectionTest, SendWhenDisconnected) {
2674   EXPECT_TRUE(connection_.connected());
2675   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, false));
2676   connection_.CloseConnection(QUIC_PEER_GOING_AWAY, false);
2677   EXPECT_FALSE(connection_.connected());
2678   QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2679   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 1, _, _, _)).Times(0);
2680   connection_.SendPacket(
2681       ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2682 }
2683 
TEST_F(QuicConnectionTest,PublicReset)2684 TEST_F(QuicConnectionTest, PublicReset) {
2685   QuicPublicResetPacket header;
2686   header.public_header.guid = guid_;
2687   header.public_header.reset_flag = true;
2688   header.public_header.version_flag = false;
2689   header.rejected_sequence_number = 10101;
2690   scoped_ptr<QuicEncryptedPacket> packet(
2691       framer_.BuildPublicResetPacket(header));
2692   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PUBLIC_RESET, true));
2693   connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *packet);
2694 }
2695 
TEST_F(QuicConnectionTest,GoAway)2696 TEST_F(QuicConnectionTest, GoAway) {
2697   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2698 
2699   QuicGoAwayFrame goaway;
2700   goaway.last_good_stream_id = 1;
2701   goaway.error_code = QUIC_PEER_GOING_AWAY;
2702   goaway.reason_phrase = "Going away.";
2703   EXPECT_CALL(visitor_, OnGoAway(_));
2704   ProcessGoAwayPacket(&goaway);
2705 }
2706 
TEST_F(QuicConnectionTest,InvalidPacket)2707 TEST_F(QuicConnectionTest, InvalidPacket) {
2708   EXPECT_CALL(visitor_,
2709               OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
2710   QuicEncryptedPacket encrypted(NULL, 0);
2711   connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), encrypted);
2712   // The connection close packet should have error details.
2713   ASSERT_TRUE(last_close() != NULL);
2714   EXPECT_EQ("Unable to read public flags.", last_close()->error_details);
2715 }
2716 
TEST_F(QuicConnectionTest,MissingPacketsBeforeLeastUnacked)2717 TEST_F(QuicConnectionTest, MissingPacketsBeforeLeastUnacked) {
2718   QuicAckFrame ack(0, QuicTime::Zero(), 4);
2719   // Set the sequence number of the ack packet to be least unacked (4).
2720   creator_.set_sequence_number(3);
2721   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2722   ProcessAckPacket(&ack);
2723   EXPECT_TRUE(outgoing_ack()->received_info.missing_packets.empty());
2724 }
2725 
TEST_F(QuicConnectionTest,ReceivedEntropyHashCalculation)2726 TEST_F(QuicConnectionTest, ReceivedEntropyHashCalculation) {
2727   EXPECT_CALL(visitor_, OnStreamFrames(_)).WillRepeatedly(Return(true));
2728   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2729   ProcessDataPacket(1, 1, kEntropyFlag);
2730   ProcessDataPacket(4, 1, kEntropyFlag);
2731   ProcessDataPacket(3, 1, !kEntropyFlag);
2732   ProcessDataPacket(7, 1, kEntropyFlag);
2733   EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash);
2734 }
2735 
TEST_F(QuicConnectionTest,UpdateEntropyForReceivedPackets)2736 TEST_F(QuicConnectionTest, UpdateEntropyForReceivedPackets) {
2737   EXPECT_CALL(visitor_, OnStreamFrames(_)).WillRepeatedly(Return(true));
2738   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2739   ProcessDataPacket(1, 1, kEntropyFlag);
2740   ProcessDataPacket(5, 1, kEntropyFlag);
2741   ProcessDataPacket(4, 1, !kEntropyFlag);
2742   EXPECT_EQ(34u, outgoing_ack()->received_info.entropy_hash);
2743   // Make 4th packet my least unacked, and update entropy for 2, 3 packets.
2744   QuicAckFrame ack(0, QuicTime::Zero(), 4);
2745   QuicPacketEntropyHash kRandomEntropyHash = 129u;
2746   ack.sent_info.entropy_hash = kRandomEntropyHash;
2747   creator_.set_sequence_number(5);
2748   QuicPacketEntropyHash six_packet_entropy_hash = 0;
2749   if (ProcessAckPacket(&ack)) {
2750     six_packet_entropy_hash = 1 << 6;
2751   }
2752 
2753   EXPECT_EQ((kRandomEntropyHash + (1 << 5) + six_packet_entropy_hash),
2754             outgoing_ack()->received_info.entropy_hash);
2755 }
2756 
TEST_F(QuicConnectionTest,UpdateEntropyHashUptoCurrentPacket)2757 TEST_F(QuicConnectionTest, UpdateEntropyHashUptoCurrentPacket) {
2758   EXPECT_CALL(visitor_, OnStreamFrames(_)).WillRepeatedly(Return(true));
2759   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2760   ProcessDataPacket(1, 1, kEntropyFlag);
2761   ProcessDataPacket(5, 1, !kEntropyFlag);
2762   ProcessDataPacket(22, 1, kEntropyFlag);
2763   EXPECT_EQ(66u, outgoing_ack()->received_info.entropy_hash);
2764   creator_.set_sequence_number(22);
2765   QuicPacketEntropyHash kRandomEntropyHash = 85u;
2766   // Current packet is the least unacked packet.
2767   QuicAckFrame ack(0, QuicTime::Zero(), 23);
2768   ack.sent_info.entropy_hash = kRandomEntropyHash;
2769   QuicPacketEntropyHash ack_entropy_hash =  ProcessAckPacket(&ack);
2770   EXPECT_EQ((kRandomEntropyHash + ack_entropy_hash),
2771             outgoing_ack()->received_info.entropy_hash);
2772   ProcessDataPacket(25, 1, kEntropyFlag);
2773   EXPECT_EQ((kRandomEntropyHash + ack_entropy_hash + (1 << (25 % 8))),
2774             outgoing_ack()->received_info.entropy_hash);
2775 }
2776 
TEST_F(QuicConnectionTest,EntropyCalculationForTruncatedAck)2777 TEST_F(QuicConnectionTest, EntropyCalculationForTruncatedAck) {
2778   EXPECT_CALL(visitor_, OnStreamFrames(_)).WillRepeatedly(Return(true));
2779   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2780   QuicPacketEntropyHash entropy[51];
2781   entropy[0] = 0;
2782   for (int i = 1; i < 51; ++i) {
2783     bool should_send = i % 10 != 0;
2784     bool entropy_flag = (i & (i - 1)) != 0;
2785     if (!should_send) {
2786       entropy[i] = entropy[i - 1];
2787       continue;
2788     }
2789     if (entropy_flag) {
2790       entropy[i] = entropy[i - 1] ^ (1 << (i % 8));
2791     } else {
2792       entropy[i] = entropy[i - 1];
2793     }
2794     ProcessDataPacket(i, 1, entropy_flag);
2795   }
2796   // Till 50 since 50th packet is not sent.
2797   for (int i = 1; i < 50; ++i) {
2798     EXPECT_EQ(entropy[i], QuicConnectionPeer::ReceivedEntropyHash(
2799         &connection_, i));
2800   }
2801 }
2802 
TEST_F(QuicConnectionTest,CheckSentEntropyHash)2803 TEST_F(QuicConnectionTest, CheckSentEntropyHash) {
2804   creator_.set_sequence_number(1);
2805   SequenceNumberSet missing_packets;
2806   QuicPacketEntropyHash entropy_hash = 0;
2807   QuicPacketSequenceNumber max_sequence_number = 51;
2808   for (QuicPacketSequenceNumber i = 1; i <= max_sequence_number; ++i) {
2809     bool is_missing = i % 10 != 0;
2810     bool entropy_flag = (i & (i - 1)) != 0;
2811     QuicPacketEntropyHash packet_entropy_hash = 0;
2812     if (entropy_flag) {
2813       packet_entropy_hash = 1 << (i % 8);
2814     }
2815     QuicPacket* packet = ConstructDataPacket(i, 0, entropy_flag);
2816     connection_.SendPacket(
2817         ENCRYPTION_NONE, i, packet, packet_entropy_hash,
2818         HAS_RETRANSMITTABLE_DATA);
2819 
2820     if (is_missing)  {
2821       missing_packets.insert(i);
2822       continue;
2823     }
2824 
2825     entropy_hash ^= packet_entropy_hash;
2826   }
2827   EXPECT_TRUE(QuicConnectionPeer::IsValidEntropy(
2828       &connection_, max_sequence_number, missing_packets, entropy_hash))
2829       << "";
2830 }
2831 
TEST_F(QuicConnectionTest,ServerSendsVersionNegotiationPacket)2832 TEST_F(QuicConnectionTest, ServerSendsVersionNegotiationPacket) {
2833   framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
2834 
2835   QuicPacketHeader header;
2836   header.public_header.guid = guid_;
2837   header.public_header.reset_flag = false;
2838   header.public_header.version_flag = true;
2839   header.entropy_flag = false;
2840   header.fec_flag = false;
2841   header.packet_sequence_number = 12;
2842   header.fec_group = 0;
2843 
2844   QuicFrames frames;
2845   QuicFrame frame(&frame1_);
2846   frames.push_back(frame);
2847   scoped_ptr<QuicPacket> packet(
2848       framer_.BuildUnsizedDataPacket(header, frames).packet);
2849   scoped_ptr<QuicEncryptedPacket> encrypted(
2850       framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
2851 
2852   framer_.set_version(QuicVersionMax());
2853   connection_.set_is_server(true);
2854   connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
2855   EXPECT_TRUE(writer_->version_negotiation_packet() != NULL);
2856 
2857   size_t num_versions = arraysize(kSupportedQuicVersions);
2858   EXPECT_EQ(num_versions,
2859             writer_->version_negotiation_packet()->versions.size());
2860 
2861   // We expect all versions in kSupportedQuicVersions to be
2862   // included in the packet.
2863   for (size_t i = 0; i < num_versions; ++i) {
2864     EXPECT_EQ(kSupportedQuicVersions[i],
2865               writer_->version_negotiation_packet()->versions[i]);
2866   }
2867 }
2868 
TEST_F(QuicConnectionTest,ServerSendsVersionNegotiationPacketSocketBlocked)2869 TEST_F(QuicConnectionTest, ServerSendsVersionNegotiationPacketSocketBlocked) {
2870   framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
2871 
2872   QuicPacketHeader header;
2873   header.public_header.guid = guid_;
2874   header.public_header.reset_flag = false;
2875   header.public_header.version_flag = true;
2876   header.entropy_flag = false;
2877   header.fec_flag = false;
2878   header.packet_sequence_number = 12;
2879   header.fec_group = 0;
2880 
2881   QuicFrames frames;
2882   QuicFrame frame(&frame1_);
2883   frames.push_back(frame);
2884   scoped_ptr<QuicPacket> packet(
2885       framer_.BuildUnsizedDataPacket(header, frames).packet);
2886   scoped_ptr<QuicEncryptedPacket> encrypted(
2887       framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
2888 
2889   framer_.set_version(QuicVersionMax());
2890   connection_.set_is_server(true);
2891   writer_->set_blocked(true);
2892   connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
2893   EXPECT_EQ(0u, writer_->last_packet_size());
2894   EXPECT_TRUE(connection_.HasQueuedData());
2895   EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_));
2896 
2897   writer_->set_blocked(false);
2898   connection_.OnCanWrite();
2899   EXPECT_TRUE(writer_->version_negotiation_packet() != NULL);
2900 
2901   size_t num_versions = arraysize(kSupportedQuicVersions);
2902   EXPECT_EQ(num_versions,
2903             writer_->version_negotiation_packet()->versions.size());
2904 
2905   // We expect all versions in kSupportedQuicVersions to be
2906   // included in the packet.
2907   for (size_t i = 0; i < num_versions; ++i) {
2908     EXPECT_EQ(kSupportedQuicVersions[i],
2909               writer_->version_negotiation_packet()->versions[i]);
2910   }
2911 }
2912 
TEST_F(QuicConnectionTest,ServerSendsVersionNegotiationPacketSocketBlockedDataBuffered)2913 TEST_F(QuicConnectionTest,
2914        ServerSendsVersionNegotiationPacketSocketBlockedDataBuffered) {
2915   framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
2916 
2917   QuicPacketHeader header;
2918   header.public_header.guid = guid_;
2919   header.public_header.reset_flag = false;
2920   header.public_header.version_flag = true;
2921   header.entropy_flag = false;
2922   header.fec_flag = false;
2923   header.packet_sequence_number = 12;
2924   header.fec_group = 0;
2925 
2926   QuicFrames frames;
2927   QuicFrame frame(&frame1_);
2928   frames.push_back(frame);
2929   scoped_ptr<QuicPacket> packet(
2930       framer_.BuildUnsizedDataPacket(header, frames).packet);
2931   scoped_ptr<QuicEncryptedPacket> encrypted(
2932       framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
2933 
2934   framer_.set_version(QuicVersionMax());
2935   connection_.set_is_server(true);
2936   writer_->set_blocked(true);
2937   writer_->set_is_write_blocked_data_buffered(true);
2938   connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
2939   EXPECT_EQ(0u, writer_->last_packet_size());
2940   EXPECT_FALSE(connection_.HasQueuedData());
2941   EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_));
2942 }
2943 
TEST_F(QuicConnectionTest,ClientHandlesVersionNegotiation)2944 TEST_F(QuicConnectionTest, ClientHandlesVersionNegotiation) {
2945   // Start out with some unsupported version.
2946   QuicConnectionPeer::GetFramer(&connection_)->set_version_for_tests(
2947       QUIC_VERSION_UNSUPPORTED);
2948 
2949   QuicPacketHeader header;
2950   header.public_header.guid = guid_;
2951   header.public_header.reset_flag = false;
2952   header.public_header.version_flag = true;
2953   header.entropy_flag = false;
2954   header.fec_flag = false;
2955   header.packet_sequence_number = 12;
2956   header.fec_group = 0;
2957 
2958   QuicVersionVector supported_versions;
2959   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
2960     supported_versions.push_back(kSupportedQuicVersions[i]);
2961   }
2962 
2963   // Send a version negotiation packet.
2964   scoped_ptr<QuicEncryptedPacket> encrypted(
2965       framer_.BuildVersionNegotiationPacket(
2966           header.public_header, supported_versions));
2967   connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
2968 
2969   // Now force another packet.  The connection should transition into
2970   // NEGOTIATED_VERSION state and tell the packet creator to StopSendingVersion.
2971   header.public_header.version_flag = false;
2972   QuicFrames frames;
2973   QuicFrame frame(&frame1_);
2974   frames.push_back(frame);
2975   scoped_ptr<QuicPacket> packet(
2976       framer_.BuildUnsizedDataPacket(header, frames).packet);
2977   encrypted.reset(framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
2978   EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
2979   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2980   connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
2981 
2982   ASSERT_FALSE(QuicPacketCreatorPeer::SendVersionInPacket(
2983       QuicConnectionPeer::GetPacketCreator(&connection_)));
2984 }
2985 
TEST_F(QuicConnectionTest,BadVersionNegotiation)2986 TEST_F(QuicConnectionTest, BadVersionNegotiation) {
2987   QuicPacketHeader header;
2988   header.public_header.guid = guid_;
2989   header.public_header.reset_flag = false;
2990   header.public_header.version_flag = true;
2991   header.entropy_flag = false;
2992   header.fec_flag = false;
2993   header.packet_sequence_number = 12;
2994   header.fec_group = 0;
2995 
2996   QuicVersionVector supported_versions;
2997   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
2998     supported_versions.push_back(kSupportedQuicVersions[i]);
2999   }
3000 
3001   // Send a version negotiation packet with the version the client started with.
3002   // It should be rejected.
3003   EXPECT_CALL(visitor_,
3004               OnConnectionClosed(QUIC_INVALID_VERSION_NEGOTIATION_PACKET,
3005                                  false));
3006   scoped_ptr<QuicEncryptedPacket> encrypted(
3007       framer_.BuildVersionNegotiationPacket(
3008           header.public_header, supported_versions));
3009   connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3010 }
3011 
TEST_F(QuicConnectionTest,CheckSendStats)3012 TEST_F(QuicConnectionTest, CheckSendStats) {
3013   EXPECT_CALL(*send_algorithm_,
3014               OnPacketSent(_, _, _, NOT_RETRANSMISSION, _));
3015   connection_.SendStreamDataWithString(3, "first", 0, !kFin, NULL);
3016   size_t first_packet_size = last_sent_packet_size();
3017 
3018   EXPECT_CALL(*send_algorithm_,
3019               OnPacketSent(_, _, _, NOT_RETRANSMISSION, _));
3020   connection_.SendStreamDataWithString(5, "second", 0, !kFin, NULL);
3021   size_t second_packet_size = last_sent_packet_size();
3022 
3023   // 2 retransmissions due to rto, 1 due to explicit nack.
3024   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
3025   EXPECT_CALL(*send_algorithm_,
3026               OnPacketSent(_, _, _, RTO_RETRANSMISSION, _)).Times(2);
3027   EXPECT_CALL(*send_algorithm_,
3028               OnPacketSent(_, _, _, NACK_RETRANSMISSION, _));
3029   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(3);
3030   EXPECT_CALL(visitor_, OnCanWrite()).WillRepeatedly(Return(true));
3031 
3032   // Retransmit due to RTO.
3033   clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
3034   connection_.GetRetransmissionAlarm()->Fire();
3035 
3036   // Retransmit due to explicit nacks.
3037   QuicAckFrame nack_three(4, QuicTime::Zero(), 0);
3038   nack_three.received_info.missing_packets.insert(3);
3039   nack_three.received_info.missing_packets.insert(1);
3040   nack_three.received_info.entropy_hash =
3041       QuicConnectionPeer::GetSentEntropyHash(&connection_, 4) ^
3042       QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
3043       QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
3044       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
3045   QuicFrame frame(&nack_three);
3046   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
3047   EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1);
3048   EXPECT_CALL(visitor_, OnCanWrite()).Times(4).WillRepeatedly(Return(true));
3049   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3050 
3051   ProcessFramePacket(frame);
3052   ProcessFramePacket(frame);
3053   ProcessFramePacket(frame);
3054 
3055   EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillOnce(
3056       Return(QuicTime::Delta::Zero()));
3057   EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(
3058       Return(QuicBandwidth::Zero()));
3059 
3060   const QuicConnectionStats& stats = connection_.GetStats();
3061   EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize,
3062             stats.bytes_sent);
3063   EXPECT_EQ(5u, stats.packets_sent);
3064   EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize,
3065             stats.bytes_retransmitted);
3066   EXPECT_EQ(3u, stats.packets_retransmitted);
3067   EXPECT_EQ(1u, stats.rto_count);
3068 }
3069 
TEST_F(QuicConnectionTest,CheckReceiveStats)3070 TEST_F(QuicConnectionTest, CheckReceiveStats) {
3071   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3072 
3073   size_t received_bytes = 0;
3074   received_bytes += ProcessFecProtectedPacket(1, false, !kEntropyFlag);
3075   received_bytes += ProcessFecProtectedPacket(3, false, !kEntropyFlag);
3076   // Should be counted against dropped packets.
3077   received_bytes += ProcessDataPacket(3, 1, !kEntropyFlag);
3078   received_bytes += ProcessFecPacket(4, 1, true, !kEntropyFlag, NULL);
3079 
3080   EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillOnce(
3081       Return(QuicTime::Delta::Zero()));
3082   EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(
3083       Return(QuicBandwidth::Zero()));
3084 
3085   const QuicConnectionStats& stats = connection_.GetStats();
3086   EXPECT_EQ(received_bytes, stats.bytes_received);
3087   EXPECT_EQ(4u, stats.packets_received);
3088 
3089   EXPECT_EQ(1u, stats.packets_revived);
3090   EXPECT_EQ(1u, stats.packets_dropped);
3091 }
3092 
TEST_F(QuicConnectionTest,TestFecGroupLimits)3093 TEST_F(QuicConnectionTest, TestFecGroupLimits) {
3094   // Create and return a group for 1.
3095   ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 1) != NULL);
3096 
3097   // Create and return a group for 2.
3098   ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) != NULL);
3099 
3100   // Create and return a group for 4.  This should remove 1 but not 2.
3101   ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 4) != NULL);
3102   ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 1) == NULL);
3103   ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) != NULL);
3104 
3105   // Create and return a group for 3.  This will kill off 2.
3106   ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 3) != NULL);
3107   ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) == NULL);
3108 
3109   // Verify that adding 5 kills off 3, despite 4 being created before 3.
3110   ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 5) != NULL);
3111   ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 4) != NULL);
3112   ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 3) == NULL);
3113 }
3114 
TEST_F(QuicConnectionTest,ProcessFramesIfPacketClosedConnection)3115 TEST_F(QuicConnectionTest, ProcessFramesIfPacketClosedConnection) {
3116   // Construct a packet with stream frame and connection close frame.
3117   header_.public_header.guid = guid_;
3118   header_.packet_sequence_number = 1;
3119   header_.public_header.reset_flag = false;
3120   header_.public_header.version_flag = false;
3121   header_.entropy_flag = false;
3122   header_.fec_flag = false;
3123   header_.fec_group = 0;
3124 
3125   QuicConnectionCloseFrame qccf;
3126   qccf.error_code = QUIC_PEER_GOING_AWAY;
3127   QuicFrame close_frame(&qccf);
3128   QuicFrame stream_frame(&frame1_);
3129 
3130   QuicFrames frames;
3131   frames.push_back(stream_frame);
3132   frames.push_back(close_frame);
3133   scoped_ptr<QuicPacket> packet(
3134       framer_.BuildUnsizedDataPacket(header_, frames).packet);
3135   EXPECT_TRUE(NULL != packet.get());
3136   scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
3137       ENCRYPTION_NONE, 1, *packet));
3138 
3139   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, true));
3140   EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
3141   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3142 
3143   connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3144 }
3145 
TEST_F(QuicConnectionTest,SelectMutualVersion)3146 TEST_F(QuicConnectionTest, SelectMutualVersion) {
3147   // Set the connection to speak the lowest quic version.
3148   connection_.set_version(QuicVersionMin());
3149   EXPECT_EQ(QuicVersionMin(), connection_.version());
3150 
3151   // Pass in available versions which includes a higher mutually supported
3152   // version.  The higher mutually supported version should be selected.
3153   QuicVersionVector supported_versions;
3154   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
3155     supported_versions.push_back(kSupportedQuicVersions[i]);
3156   }
3157   EXPECT_TRUE(connection_.SelectMutualVersion(supported_versions));
3158   EXPECT_EQ(QuicVersionMax(), connection_.version());
3159 
3160   // Expect that the lowest version is selected.
3161   // Ensure the lowest supported version is less than the max, unless they're
3162   // the same.
3163   EXPECT_LE(QuicVersionMin(), QuicVersionMax());
3164   QuicVersionVector lowest_version_vector;
3165   lowest_version_vector.push_back(QuicVersionMin());
3166   EXPECT_TRUE(connection_.SelectMutualVersion(lowest_version_vector));
3167   EXPECT_EQ(QuicVersionMin(), connection_.version());
3168 
3169   // Shouldn't be able to find a mutually supported version.
3170   QuicVersionVector unsupported_version;
3171   unsupported_version.push_back(QUIC_VERSION_UNSUPPORTED);
3172   EXPECT_FALSE(connection_.SelectMutualVersion(unsupported_version));
3173 }
3174 
TEST_F(QuicConnectionTest,ConnectionCloseWhenNotWriteBlocked)3175 TEST_F(QuicConnectionTest, ConnectionCloseWhenNotWriteBlocked) {
3176   writer_->set_blocked(false);  // Already default.
3177 
3178   // Send a packet (but write will not block).
3179   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3180   EXPECT_EQ(0u, connection_.NumQueuedPackets());
3181   EXPECT_EQ(1u, writer_->packets_write_attempts());
3182 
3183   // Send an erroneous packet to close the connection.
3184   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
3185   ProcessDataPacket(6000, 0, !kEntropyFlag);
3186   EXPECT_EQ(2u, writer_->packets_write_attempts());
3187 }
3188 
TEST_F(QuicConnectionTest,ConnectionCloseWhenWriteBlocked)3189 TEST_F(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) {
3190   EXPECT_EQ(0u, connection_.NumQueuedPackets());
3191   writer_->set_blocked(true);
3192 
3193   // Send a packet to so that write will really block.
3194   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3195   EXPECT_EQ(1u, connection_.NumQueuedPackets());
3196   EXPECT_EQ(1u, writer_->packets_write_attempts());
3197 
3198   // Send an erroneous packet to close the connection.
3199   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
3200   ProcessDataPacket(6000, 0, !kEntropyFlag);
3201   EXPECT_EQ(1u, writer_->packets_write_attempts());
3202 }
3203 
TEST_F(QuicConnectionTest,ConnectionCloseWhenNothingPending)3204 TEST_F(QuicConnectionTest, ConnectionCloseWhenNothingPending) {
3205   writer_->set_blocked(true);
3206 
3207   // Send an erroneous packet to close the connection.
3208   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
3209   ProcessDataPacket(6000, 0, !kEntropyFlag);
3210   EXPECT_EQ(1u, writer_->packets_write_attempts());
3211 }
3212 
TEST_F(QuicConnectionTest,AckNotifierTriggerCallback)3213 TEST_F(QuicConnectionTest, AckNotifierTriggerCallback) {
3214   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3215 
3216   // Create a delegate which we expect to be called.
3217   MockAckNotifierDelegate delegate;
3218   EXPECT_CALL(delegate, OnAckNotification()).Times(1);;
3219 
3220   // Send some data, which will register the delegate to be notified.
3221   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, &delegate);
3222 
3223   // Process an ACK from the server which should trigger the callback.
3224   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
3225   QuicAckFrame frame(1, QuicTime::Zero(), 0);
3226   frame.received_info.entropy_hash =
3227       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
3228   ProcessAckPacket(&frame);
3229 }
3230 
TEST_F(QuicConnectionTest,AckNotifierFailToTriggerCallback)3231 TEST_F(QuicConnectionTest, AckNotifierFailToTriggerCallback) {
3232   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3233 
3234   // Create a delegate which we don't expect to be called.
3235   MockAckNotifierDelegate delegate;
3236   EXPECT_CALL(delegate, OnAckNotification()).Times(0);;
3237 
3238   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
3239 
3240   // Send some data, which will register the delegate to be notified. This will
3241   // not be ACKed and so the delegate should never be called.
3242   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, &delegate);
3243 
3244   // Send some other data which we will ACK.
3245   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3246   connection_.SendStreamDataWithString(1, "bar", 0, !kFin, NULL);
3247 
3248   // Now we receive ACK for packets 2 and 3, but importantly missing packet 1
3249   // which we registered to be notified about.
3250   QuicAckFrame frame(3, QuicTime::Zero(), 0);
3251   frame.received_info.missing_packets.insert(1);
3252   frame.received_info.entropy_hash =
3253       QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
3254       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
3255   EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _));
3256   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _));
3257   ProcessAckPacket(&frame);
3258 }
3259 
TEST_F(QuicConnectionTest,AckNotifierCallbackAfterRetransmission)3260 TEST_F(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) {
3261   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3262 
3263   // Create a delegate which we expect to be called.
3264   MockAckNotifierDelegate delegate;
3265   EXPECT_CALL(delegate, OnAckNotification()).Times(1);;
3266 
3267   // In total expect ACKs for all 4 packets.
3268   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(4);
3269 
3270   // Send four packets, and register to be notified on ACK of packet 2.
3271   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3272   connection_.SendStreamDataWithString(1, "bar", 0, !kFin, &delegate);
3273   connection_.SendStreamDataWithString(1, "baz", 0, !kFin, NULL);
3274   connection_.SendStreamDataWithString(1, "qux", 0, !kFin, NULL);
3275 
3276   // Now we receive ACK for packets 1, 3, and 4, which invokes fast retransmit.
3277   QuicAckFrame frame(4, QuicTime::Zero(), 0);
3278   frame.received_info.missing_packets.insert(2);
3279   frame.received_info.entropy_hash =
3280       QuicConnectionPeer::GetSentEntropyHash(&connection_, 4) ^
3281       QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
3282       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
3283   EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _));
3284   EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _));
3285   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
3286   ProcessAckPacket(&frame);
3287 
3288   // Now we get an ACK for packet 5 (retransmitted packet 2), which should
3289   // trigger the callback.
3290   QuicAckFrame second_ack_frame(5, QuicTime::Zero(), 0);
3291   second_ack_frame.received_info.entropy_hash =
3292       QuicConnectionPeer::GetSentEntropyHash(&connection_, 5);
3293   ProcessAckPacket(&second_ack_frame);
3294 }
3295 
3296 // TODO(rjshade): Add a similar test that FEC recovery on peer (and resulting
3297 //                ACK) triggers notification on our end.
TEST_F(QuicConnectionTest,AckNotifierCallbackAfterFECRecovery)3298 TEST_F(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) {
3299   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3300   EXPECT_CALL(visitor_, OnCanWrite()).Times(1).WillOnce(Return(true));
3301 
3302   // Create a delegate which we expect to be called.
3303   MockAckNotifierDelegate delegate;
3304   EXPECT_CALL(delegate, OnAckNotification()).Times(1);;
3305 
3306   // Expect ACKs for 1 packet.
3307   EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
3308 
3309   // Send one packet, and register to be notified on ACK.
3310   connection_.SendStreamDataWithString(1, "foo", 0, !kFin, &delegate);
3311 
3312   // Ack packet gets dropped, but we receive an FEC packet that covers it.
3313   // Should recover the Ack packet and trigger the notification callback.
3314   QuicFrames frames;
3315 
3316   QuicAckFrame ack_frame(1, QuicTime::Zero(), 0);
3317   ack_frame.received_info.entropy_hash =
3318       QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
3319   frames.push_back(QuicFrame(&ack_frame));
3320 
3321   // Dummy stream frame to satisfy expectations set elsewhere.
3322   frames.push_back(QuicFrame(&frame1_));
3323 
3324   QuicPacketHeader ack_header;
3325   ack_header.public_header.guid = guid_;
3326   ack_header.public_header.reset_flag = false;
3327   ack_header.public_header.version_flag = false;
3328   ack_header.entropy_flag = !kEntropyFlag;
3329   ack_header.fec_flag = true;
3330   ack_header.packet_sequence_number = 1;
3331   ack_header.is_in_fec_group = IN_FEC_GROUP;
3332   ack_header.fec_group = 1;
3333 
3334   QuicPacket* packet =
3335       framer_.BuildUnsizedDataPacket(ack_header, frames).packet;
3336 
3337   // Take the packet which contains the ACK frame, and construct and deliver an
3338   // FEC packet which allows the ACK packet to be recovered.
3339   ProcessFecPacket(2, 1, true, !kEntropyFlag, packet);
3340 }
3341 
3342 class MockQuicConnectionDebugVisitor
3343     : public QuicConnectionDebugVisitorInterface {
3344  public:
3345   MOCK_METHOD1(OnFrameAddedToPacket,
3346                void(const QuicFrame&));
3347 
3348   MOCK_METHOD4(OnPacketSent,
3349                void(QuicPacketSequenceNumber,
3350                     EncryptionLevel,
3351                     const QuicEncryptedPacket&,
3352                     WriteResult));
3353 
3354   MOCK_METHOD2(OnPacketRetransmitted,
3355                void(QuicPacketSequenceNumber,
3356                     QuicPacketSequenceNumber));
3357 
3358   MOCK_METHOD3(OnPacketReceived,
3359                void(const IPEndPoint&,
3360                     const IPEndPoint&,
3361                     const QuicEncryptedPacket&));
3362 
3363   MOCK_METHOD1(OnProtocolVersionMismatch,
3364                void(QuicVersion));
3365 
3366   MOCK_METHOD1(OnPacketHeader,
3367                void(const QuicPacketHeader& header));
3368 
3369   MOCK_METHOD1(OnStreamFrame,
3370                void(const QuicStreamFrame&));
3371 
3372   MOCK_METHOD1(OnAckFrame,
3373                void(const QuicAckFrame& frame));
3374 
3375   MOCK_METHOD1(OnCongestionFeedbackFrame,
3376                void(const QuicCongestionFeedbackFrame&));
3377 
3378   MOCK_METHOD1(OnRstStreamFrame,
3379                void(const QuicRstStreamFrame&));
3380 
3381   MOCK_METHOD1(OnConnectionCloseFrame,
3382                void(const QuicConnectionCloseFrame&));
3383 
3384   MOCK_METHOD1(OnPublicResetPacket,
3385                void(const QuicPublicResetPacket&));
3386 
3387   MOCK_METHOD1(OnVersionNegotiationPacket,
3388                void(const QuicVersionNegotiationPacket&));
3389 
3390   MOCK_METHOD2(OnRevivedPacket,
3391                void(const QuicPacketHeader&, StringPiece payload));
3392 };
3393 
TEST_F(QuicConnectionTest,OnPacketHeaderDebugVisitor)3394 TEST_F(QuicConnectionTest, OnPacketHeaderDebugVisitor) {
3395   QuicPacketHeader header;
3396 
3397   scoped_ptr<MockQuicConnectionDebugVisitor>
3398       debug_visitor(new StrictMock<MockQuicConnectionDebugVisitor>);
3399   connection_.set_debug_visitor(debug_visitor.get());
3400   EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1);
3401   connection_.OnPacketHeader(header);
3402 }
3403 
TEST_F(QuicConnectionTest,Pacing)3404 TEST_F(QuicConnectionTest, Pacing) {
3405   ValueRestore<bool> old_flag(&FLAGS_enable_quic_pacing, true);
3406 
3407   TestConnection server(guid_, IPEndPoint(), helper_.get(), writer_.get(),
3408                         true);
3409   TestConnection client(guid_, IPEndPoint(), helper_.get(), writer_.get(),
3410                         false);
3411   EXPECT_TRUE(client.sent_packet_manager().using_pacing());
3412   EXPECT_FALSE(server.sent_packet_manager().using_pacing());
3413 }
3414 
3415 }  // namespace
3416 }  // namespace test
3417 }  // namespace net
3418