15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_connection.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/stl_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/quic/congestion_control/loss_detection_interface.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/congestion_control/receive_algorithm_interface.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/congestion_control/send_algorithm_interface.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/crypto/null_encrypter.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/quic_decrypter.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/quic_encrypter.h"
17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/quic/quic_flags.h"
18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "net/quic/quic_protocol.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/quic/quic_utils.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/test_tools/mock_clock.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/mock_random.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/quic_connection_peer.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/quic_framer_peer.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/quic_packet_creator_peer.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/test_tools/quic_sent_packet_manager_peer.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/test_tools/quic_test_utils.h"
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "net/quic/test_tools/simple_quic_framer.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::StringPiece;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::map;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using std::vector;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::AnyNumber;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using testing::AtLeast;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ContainerEq;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using testing::Contains;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::DoAll;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::InSequence;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::InvokeWithoutArgs;
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using testing::Ref;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::SaveArg;
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using testing::StrictMock;
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using testing::_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char data1[] = "foo";
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char data2[] = "bar";
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const bool kFin = true;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const bool kEntropyFlag = true;
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicPacketEntropyHash kTestEntropyHash = 76;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int kDefaultRetransmissionTimeMs = 500;
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int kMinRetransmissionTimeMs = 200;
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestReceiveAlgorithm : public ReceiveAlgorithmInterface {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit TestReceiveAlgorithm(QuicCongestionFeedbackFrame* feedback)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : feedback_(feedback) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GenerateCongestionFeedback(
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicCongestionFeedbackFrame* congestion_feedback) {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (feedback_ == NULL) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *congestion_feedback = *feedback_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD3(RecordIncomingPacket,
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               void(QuicByteCount, QuicPacketSequenceNumber, QuicTime));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCongestionFeedbackFrame* feedback_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestReceiveAlgorithm);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TaggingEncrypter : public QuicEncrypter {
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit TaggingEncrypter(uint8 tag)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : tag_(tag) {
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~TaggingEncrypter() {}
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // QuicEncrypter interface.
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool SetKey(StringPiece key) OVERRIDE { return true; }
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE {
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Encrypt(StringPiece nonce,
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       StringPiece associated_data,
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       StringPiece plaintext,
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       unsigned char* output) OVERRIDE {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memcpy(output, plaintext.data(), plaintext.size());
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    output += plaintext.size();
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memset(output, tag_, kTagSize);
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number,
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  StringPiece associated_data,
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  StringPiece plaintext) OVERRIDE {
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const size_t len = plaintext.size() + kTagSize;
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint8* buffer = new uint8[len];
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Encrypt(StringPiece(), associated_data, plaintext, buffer);
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return new QuicData(reinterpret_cast<char*>(buffer), len, true);
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual size_t GetKeySize() const OVERRIDE { return 0; }
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual size_t GetNoncePrefixSize() const OVERRIDE { return 0; }
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual size_t GetMaxPlaintextSize(size_t ciphertext_size) const OVERRIDE {
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return ciphertext_size - kTagSize;
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual size_t GetCiphertextSize(size_t plaintext_size) const OVERRIDE {
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return plaintext_size + kTagSize;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual StringPiece GetKey() const OVERRIDE {
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return StringPiece();
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual StringPiece GetNoncePrefix() const OVERRIDE {
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return StringPiece();
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum {
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    kTagSize = 12,
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const uint8 tag_;
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(TaggingEncrypter);
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// TaggingDecrypter ensures that the final kTagSize bytes of the message all
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// have the same value and then removes them.
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TaggingDecrypter : public QuicDecrypter {
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~TaggingDecrypter() {}
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // QuicDecrypter interface
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool SetKey(StringPiece key) OVERRIDE { return true; }
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE {
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Decrypt(StringPiece nonce,
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       StringPiece associated_data,
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       StringPiece ciphertext,
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       unsigned char* output,
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       size_t* output_length) OVERRIDE {
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (ciphertext.size() < kTagSize) {
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!CheckTag(ciphertext, GetTag(ciphertext))) {
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *output_length = ciphertext.size() - kTagSize;
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memcpy(output, ciphertext.data(), *output_length);
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number,
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  StringPiece associated_data,
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  StringPiece ciphertext) OVERRIDE {
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (ciphertext.size() < kTagSize) {
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return NULL;
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!CheckTag(ciphertext, GetTag(ciphertext))) {
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return NULL;
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const size_t len = ciphertext.size() - kTagSize;
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint8* buf = new uint8[len];
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memcpy(buf, ciphertext.data(), len);
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return new QuicData(reinterpret_cast<char*>(buf), len,
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        true /* owns buffer */);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual StringPiece GetKey() const OVERRIDE { return StringPiece(); }
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual StringPiece GetNoncePrefix() const OVERRIDE { return StringPiece(); }
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual uint8 GetTag(StringPiece ciphertext) {
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return ciphertext.data()[ciphertext.size()-1];
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum {
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    kTagSize = 12,
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool CheckTag(StringPiece ciphertext, uint8 tag) {
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (size_t i = ciphertext.size() - kTagSize; i < ciphertext.size(); i++) {
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (ciphertext.data()[i] != tag) {
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return false;
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// StringTaggingDecrypter ensures that the final kTagSize bytes of the message
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// match the expected value.
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class StrictTaggingDecrypter : public TaggingDecrypter {
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  explicit StrictTaggingDecrypter(uint8 tag) : tag_(tag) {}
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~StrictTaggingDecrypter() {}
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // TaggingQuicDecrypter
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual uint8 GetTag(StringPiece ciphertext) OVERRIDE {
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return tag_;
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const uint8 tag_;
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestConnectionHelper : public QuicConnectionHelperInterface {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  class TestAlarm : public QuicAlarm {
236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch   public:
237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    explicit TestAlarm(QuicAlarm::Delegate* delegate)
238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        : QuicAlarm(delegate) {
239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    virtual void SetImpl() OVERRIDE {}
242ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    virtual void CancelImpl() OVERRIDE {}
24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    using QuicAlarm::Fire;
244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  };
245ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestConnectionHelper(MockClock* clock, MockRandom* random_generator)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : clock_(clock),
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        random_generator_(random_generator) {
249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // QuicConnectionHelperInterface
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const QuicClock* GetClock() const OVERRIDE {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clock_;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual QuicRandom* GetRandomGenerator() OVERRIDE {
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return random_generator_;
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) OVERRIDE {
2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return new TestAlarm(delegate);
2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  MockClock* clock_;
2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  MockRandom* random_generator_;
2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper);
2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
2711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class TestPacketWriter : public QuicPacketWriter {
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit TestPacketWriter(QuicVersion version)
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      : version_(version),
2760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        framer_(SupportedVersions(version_)),
277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        last_packet_size_(0),
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        write_blocked_(false),
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        block_on_next_write_(false),
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        is_write_blocked_data_buffered_(false),
281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        final_bytes_of_last_packet_(0),
282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        final_bytes_of_previous_packet_(0),
2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        use_tagging_decrypter_(false),
2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        packets_write_attempts_(0) {
2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // QuicPacketWriter interface
2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual WriteResult WritePacket(
2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const char* buffer, size_t buf_len,
2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const IPAddressNumber& self_address,
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const IPEndPoint& peer_address) OVERRIDE {
2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    QuicEncryptedPacket packet(buffer, buf_len);
293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ++packets_write_attempts_;
294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (packet.length() >= sizeof(final_bytes_of_last_packet_)) {
296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      final_bytes_of_previous_packet_ = final_bytes_of_last_packet_;
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      memcpy(&final_bytes_of_last_packet_, packet.data() + packet.length() - 4,
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             sizeof(final_bytes_of_last_packet_));
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (use_tagging_decrypter_) {
3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      framer_.framer()->SetDecrypter(new TaggingDecrypter, ENCRYPTION_NONE);
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
3040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_TRUE(framer_.ProcessPacket(packet));
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (block_on_next_write_) {
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      write_blocked_ = true;
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      block_on_next_write_ = false;
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (IsWriteBlocked()) {
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return WriteResult(WRITE_STATUS_BLOCKED, -1);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_packet_size_ = packet.length();
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return WriteResult(WRITE_STATUS_OK, last_packet_size_);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual bool IsWriteBlockedDataBuffered() const OVERRIDE {
3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return is_write_blocked_data_buffered_;
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool IsWriteBlocked() const OVERRIDE { return write_blocked_; }
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetWritable() OVERRIDE { write_blocked_ = false; }
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void BlockOnNextWrite() { block_on_next_write_ = true; }
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const QuicPacketHeader& header() { return framer_.header(); }
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  size_t frame_count() const { return framer_.num_frames(); }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const vector<QuicAckFrame>& ack_frames() const {
3310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return framer_.ack_frames();
3320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const vector<QuicCongestionFeedbackFrame>& feedback_frames() const {
3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return framer_.feedback_frames();
3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const vector<QuicStopWaitingFrame>& stop_waiting_frames() const {
3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return framer_.stop_waiting_frames();
3400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const vector<QuicConnectionCloseFrame>& connection_close_frames() const {
3430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return framer_.connection_close_frames();
3440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const vector<QuicStreamFrame>& stream_frames() const {
3470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return framer_.stream_frames();
3480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const vector<QuicPingFrame>& ping_frames() const {
3510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return framer_.ping_frames();
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t last_packet_size() {
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return last_packet_size_;
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const QuicVersionNegotiationPacket* version_negotiation_packet() {
3590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return framer_.version_negotiation_packet();
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void set_is_write_blocked_data_buffered(bool buffered) {
3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    is_write_blocked_data_buffered_ = buffered;
3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void set_is_server(bool is_server) {
3670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // We invert is_server here, because the framer needs to parse packets
3680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // we send.
3690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    QuicFramerPeer::SetIsServer(framer_.framer(), !is_server);
3700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // final_bytes_of_last_packet_ returns the last four bytes of the previous
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // packet as a little-endian, uint32. This is intended to be used with a
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TaggingEncrypter so that tests can determine which encrypter was used for
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // a given packet.
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32 final_bytes_of_last_packet() { return final_bytes_of_last_packet_; }
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns the final bytes of the second to last packet.
379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 final_bytes_of_previous_packet() {
380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return final_bytes_of_previous_packet_;
381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void use_tagging_decrypter() {
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    use_tagging_decrypter_ = true;
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  uint32 packets_write_attempts() { return packets_write_attempts_; }
388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void Reset() { framer_.Reset(); }
3900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void SetSupportedVersions(const QuicVersionVector& versions) {
3920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    framer_.SetSupportedVersions(versions);
3930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicVersion version_;
3970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SimpleQuicFramer framer_;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t last_packet_size_;
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool write_blocked_;
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool block_on_next_write_;
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool is_write_blocked_data_buffered_;
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32 final_bytes_of_last_packet_;
403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 final_bytes_of_previous_packet_;
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool use_tagging_decrypter_;
405a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  uint32 packets_write_attempts_;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestPacketWriter);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestConnection : public QuicConnection {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TestConnection(QuicConnectionId connection_id,
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 IPEndPoint address,
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 TestConnectionHelper* helper,
4151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 TestPacketWriter* writer,
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 bool is_server,
417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 QuicVersion version)
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      : QuicConnection(connection_id, address, helper, writer, is_server,
419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       SupportedVersions(version)),
4201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        writer_(writer) {
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Disable tail loss probes for most tests.
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicSentPacketManagerPeer::SetMaxTailLossProbes(
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        QuicConnectionPeer::GetSentPacketManager(this), 0);
4241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    writer_->set_is_server(is_server);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendAck() {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicConnectionPeer::SendAck(this);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetReceiveAlgorithm(TestReceiveAlgorithm* receive_algorithm) {
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) {
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetLossAlgorithm(LossDetectionInterface* loss_algorithm) {
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicSentPacketManagerPeer::SetLossAlgorithm(
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        QuicConnectionPeer::GetSentPacketManager(this), loss_algorithm);
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
44468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void SendPacket(EncryptionLevel level,
44568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  QuicPacketSequenceNumber sequence_number,
44668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  QuicPacket* packet,
44768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  QuicPacketEntropyHash entropy_hash,
44868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  HasRetransmittableData retransmittable) {
44968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    RetransmittableFrames* retransmittable_frames =
45068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        retransmittable == HAS_RETRANSMITTABLE_DATA ?
45168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            new RetransmittableFrames() : NULL;
45268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    OnSerializedPacket(
45368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER,
45468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                         packet, entropy_hash, retransmittable_frames));
455d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
456d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicConsumedData SendStreamDataWithString(
458d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      QuicStreamId id,
459d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      StringPiece data,
460d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      QuicStreamOffset offset,
461d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      bool fin,
462d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      QuicAckNotifier::DelegateInterface* delegate) {
463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return SendStreamDataWithStringHelper(id, data, offset, fin,
464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          MAY_FEC_PROTECT, delegate);
465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuicConsumedData SendStreamDataWithStringWithFec(
468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      QuicStreamId id,
469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      StringPiece data,
470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      QuicStreamOffset offset,
471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      bool fin,
472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      QuicAckNotifier::DelegateInterface* delegate) {
473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return SendStreamDataWithStringHelper(id, data, offset, fin,
474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          MUST_FEC_PROTECT, delegate);
475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuicConsumedData SendStreamDataWithStringHelper(
478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      QuicStreamId id,
479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      StringPiece data,
480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      QuicStreamOffset offset,
481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      bool fin,
482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      FecProtection fec_protection,
483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      QuicAckNotifier::DelegateInterface* delegate) {
4841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    IOVector data_iov;
4851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!data.empty()) {
4861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      data_iov.Append(const_cast<char*>(data.data()), data.size());
4871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return QuicConnection::SendStreamData(id, data_iov, offset, fin,
489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                          fec_protection, delegate);
490d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
491d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
4923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  QuicConsumedData SendStreamData3() {
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return SendStreamDataWithString(kClientDataStreamId1, "food", 0, !kFin,
494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    NULL);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuicConsumedData SendStreamData3WithFec() {
498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return SendStreamDataWithStringWithFec(kClientDataStreamId1, "food", 0,
499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           !kFin, NULL);
500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  QuicConsumedData SendStreamData5() {
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return SendStreamDataWithString(kClientDataStreamId2, "food2", 0,
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    !kFin, NULL);
5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
5063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuicConsumedData SendStreamData5WithFec() {
508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return SendStreamDataWithStringWithFec(kClientDataStreamId2, "food2", 0,
509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                           !kFin, NULL);
510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ensures the connection can write stream data before writing.
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicConsumedData EnsureWritableAndSendStreamData5() {
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(CanWriteStreamData());
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return SendStreamData5();
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The crypto stream has special semantics so that it is not blocked by a
5183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // congestion window limitation, and also so that it gets put into a separate
5193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // packet (so that it is easier to reason about a crypto frame not being
5203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // split needlessly across packet boundaries).  As a result, we have separate
5213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // tests for some cases for this stream.
5223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  QuicConsumedData SendCryptoStreamData() {
5236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return SendStreamDataWithString(kCryptoStreamId, "chlo", 0, !kFin, NULL);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_server() {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return QuicConnectionPeer::IsServer(this);
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
530558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void set_version(QuicVersion version) {
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicConnectionPeer::GetFramer(this)->set_version(version);
532558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
533558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetSupportedVersions(const QuicVersionVector& versions) {
535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicConnectionPeer::GetFramer(this)->SetSupportedVersions(versions);
5360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    writer_->SetSupportedVersions(versions);
537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_is_server(bool is_server) {
5401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    writer_->set_is_server(is_server);
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicConnectionPeer::SetIsServer(this, is_server);
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
54468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  TestConnectionHelper::TestAlarm* GetAckAlarm() {
54568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
54668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        QuicConnectionPeer::GetAckAlarm(this));
547ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
548ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
5490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestConnectionHelper::TestAlarm* GetPingAlarm() {
5500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
5510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        QuicConnectionPeer::GetPingAlarm(this));
5520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
5530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestConnectionHelper::TestAlarm* GetResumeWritesAlarm() {
5550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
5560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        QuicConnectionPeer::GetResumeWritesAlarm(this));
5570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
5580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
55968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  TestConnectionHelper::TestAlarm* GetRetransmissionAlarm() {
56068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
56168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        QuicConnectionPeer::GetRetransmissionAlarm(this));
562ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
563ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
56468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  TestConnectionHelper::TestAlarm* GetSendAlarm() {
56568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
56668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        QuicConnectionPeer::GetSendAlarm(this));
567ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
568ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
56968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  TestConnectionHelper::TestAlarm* GetTimeoutAlarm() {
57068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
57168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        QuicConnectionPeer::GetTimeoutAlarm(this));
572ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
573ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
574558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  using QuicConnection::SelectMutualVersion;
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestPacketWriter* writer_;
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestConnection);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Used for testing packets revived from FEC packets.
5830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass FecQuicConnectionDebugVisitor
58446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : public QuicConnectionDebugVisitor {
5850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
5860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void OnRevivedPacket(const QuicPacketHeader& header,
5870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                               StringPiece data) OVERRIDE {
5880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    revived_header_ = header;
5890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
5900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Public accessor method.
5920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicPacketHeader revived_header() const {
5930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return revived_header_;
5940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
5950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private:
5970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicPacketHeader revived_header_;
5980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
5990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicConnectionTest()
603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      : connection_id_(42),
604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        framer_(SupportedVersions(version()), QuicTime::Zero(), false),
605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        peer_creator_(connection_id_, &framer_, &random_generator_),
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        send_algorithm_(new StrictMock<MockSendAlgorithm>),
607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        loss_algorithm_(new MockLossAlgorithm()),
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        helper_(new TestConnectionHelper(&clock_, &random_generator_)),
609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        writer_(new TestPacketWriter(version())),
610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        connection_(connection_id_, IPEndPoint(), helper_.get(),
611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    writer_.get(), false, version()),
612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        frame1_(1, false, 0, MakeIOVector(data1)),
613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        frame2_(1, false, 3, MakeIOVector(data2)),
6140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER),
6150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        connection_id_length_(PACKET_8BYTE_CONNECTION_ID) {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    connection_.set_visitor(&visitor_);
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_.SetSendAlgorithm(send_algorithm_);
618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    connection_.SetLossAlgorithm(loss_algorithm_);
6190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    framer_.set_received_entropy_calculator(&entropy_calculator_);
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Simplify tests by not sending feedback unless specifically configured.
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetFeedback(NULL);
622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(
623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        *send_algorithm_, TimeUntilSend(_, _, _)).WillRepeatedly(Return(
624a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            QuicTime::Delta::Zero()));
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*receive_algorithm_,
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                RecordIncomingPacket(_, _, _)).Times(AnyNumber());
627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
62868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        .Times(AnyNumber());
629558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly(
630558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        Return(QuicTime::Delta::Zero()));
6310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly(
6320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        Return(kMaxPacketSize));
633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
634d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        .WillByDefault(Return(true));
635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_CALL(visitor_, WillingAndAbleToWrite()).Times(AnyNumber());
636d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber());
637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(visitor_, OnCanWrite()).Times(AnyNumber());
6380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_CALL(visitor_, HasOpenDataStreams()).WillRepeatedly(Return(false));
639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*loss_algorithm_, GetLossTimeout())
641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .WillRepeatedly(Return(QuicTime::Zero()));
642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
643a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .WillRepeatedly(Return(SequenceNumberSet()));
644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicVersion version() {
647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return GetParam();
64858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
64958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame* outgoing_ack() {
6512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    outgoing_ack_.reset(QuicConnectionPeer::CreateAckFrame(&connection_));
6522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return outgoing_ack_.get();
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicPacketSequenceNumber least_unacked() {
656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (version() <= QUIC_VERSION_15) {
6570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      if (writer_->ack_frames().empty()) {
658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        return 0;
659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      }
6600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return writer_->ack_frames()[0].sent_info.least_unacked;
661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
6620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (writer_->stop_waiting_frames().empty()) {
663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return 0;
664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
6650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return writer_->stop_waiting_frames()[0].least_unacked;
666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void use_tagging_decrypter() {
6691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    writer_->use_tagging_decrypter();
670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessPacket(QuicPacketSequenceNumber number) {
6735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProcessDataPacket(number, 0, !kEntropyFlag);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) {
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicFrames frames;
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frames.push_back(QuicFrame(frame));
68046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    QuicPacketCreatorPeer::SetSendVersionInPacket(&peer_creator_,
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  connection_.is_server());
68246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SerializedPacket serialized_packet =
68346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        peer_creator_.SerializeAllFrames(frames);
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicPacket> packet(serialized_packet.packet);
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicEncryptedPacket> encrypted(
686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        framer_.EncryptPacket(ENCRYPTION_NONE,
687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              serialized_packet.sequence_number, *packet));
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return serialized_packet.entropy_hash;
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t ProcessDataPacket(QuicPacketSequenceNumber number,
6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           QuicFecGroupNumber fec_group,
6947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           bool entropy_flag) {
6957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return ProcessDataPacketAtLevel(number, fec_group, entropy_flag,
6967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    ENCRYPTION_NONE);
6977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
6987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t ProcessDataPacketAtLevel(QuicPacketSequenceNumber number,
7007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  QuicFecGroupNumber fec_group,
7017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  bool entropy_flag,
7027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  EncryptionLevel level) {
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicPacket> packet(ConstructDataPacket(number, fec_group,
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      entropy_flag));
705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
7067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        level, number, *packet));
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return encrypted->length();
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ProcessClosePacket(QuicPacketSequenceNumber number,
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          QuicFecGroupNumber fec_group) {
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group));
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ENCRYPTION_NONE, number, *packet));
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number,
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   bool expect_revival, bool entropy_flag) {
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (expect_revival) {
7225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1).
7255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          RetiresOnSaturation();
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ProcessDataPacket(number, 1, entropy_flag);
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Processes an FEC packet that covers the packets that would have been
73058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // received.
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t ProcessFecPacket(QuicPacketSequenceNumber number,
732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          QuicPacketSequenceNumber min_protected_packet,
733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          bool expect_revival,
73458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          bool entropy_flag,
73558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          QuicPacket* packet) {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expect_revival) {
7375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Construct the decrypted data packet so we can compute the correct
74158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // redundancy. If |packet| has been provided then use that, otherwise
74258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // construct a default data packet.
74358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<QuicPacket> data_packet;
74458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (packet) {
74558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      data_packet.reset(packet);
74658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } else {
74758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      data_packet.reset(ConstructDataPacket(number, 1, !kEntropyFlag));
74858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
750a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    header_.public_header.connection_id = connection_id_;
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.reset_flag = false;
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.version_flag = false;
7530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    header_.public_header.sequence_number_length = sequence_number_length_;
7540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    header_.public_header.connection_id_length = connection_id_length_;
7550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    header_.packet_sequence_number = number;
756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    header_.entropy_flag = entropy_flag;
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_flag = true;
758868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    header_.is_in_fec_group = IN_FEC_GROUP;
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_group = min_protected_packet;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicFecData fec_data;
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fec_data.fec_group = header_.fec_group;
76258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Since all data packets in this test have the same payload, the
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // redundancy is either equal to that payload or the xor of that payload
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // with itself, depending on the number of packets.
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((number - min_protected_packet) % 2) == 0) {
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (size_t i = GetStartOfFecProtectedData(
768a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               header_.public_header.connection_id_length,
769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               header_.public_header.version_flag,
770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               header_.public_header.sequence_number_length);
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           i < data_packet->length(); ++i) {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_packet->mutable_data()[i] ^= data_packet->data()[i];
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fec_data.redundancy = data_packet->FecProtectedData();
77658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicPacket> fec_packet(
7782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        framer_.BuildFecPacket(header_, fec_data).packet);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<QuicEncryptedPacket> encrypted(
780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        framer_.EncryptPacket(ENCRYPTION_NONE, number, *fec_packet));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return encrypted->length();
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  QuicByteCount SendStreamDataToPeer(QuicStreamId id,
7871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     StringPiece data,
7881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     QuicStreamOffset offset,
7891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     bool fin,
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     QuicPacketSequenceNumber* last_packet) {
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicByteCount packet_size;
792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillOnce(DoAll(SaveArg<3>(&packet_size), Return(true)));
794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    connection_.SendStreamDataWithString(id, data, offset, fin, NULL);
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (last_packet != NULL) {
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *last_packet =
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          QuicConnectionPeer::GetPacketCreator(&connection_)->sequence_number();
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
80068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        .Times(AnyNumber());
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return packet_size;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendAckPacketToPeer() {
805010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_.SendAck();
807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
80868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        .Times(AnyNumber());
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  QuicPacketEntropyHash ProcessAckPacket(QuicAckFrame* frame) {
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ProcessFramePacket(QuicFrame(frame));
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicPacketEntropyHash ProcessStopWaitingPacket(QuicStopWaitingFrame* frame) {
816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return ProcessFramePacket(QuicFrame(frame));
817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash ProcessGoAwayPacket(QuicGoAwayFrame* frame) {
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ProcessFramePacket(QuicFrame(frame));
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsMissing(QuicPacketSequenceNumber number) {
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return IsAwaitingPacket(outgoing_ack()->received_info, number);
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number,
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  QuicFecGroupNumber fec_group,
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool entropy_flag) {
830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    header_.public_header.connection_id = connection_id_;
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.reset_flag = false;
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.version_flag = false;
8330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    header_.public_header.sequence_number_length = sequence_number_length_;
8340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    header_.public_header.connection_id_length = connection_id_length_;
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.entropy_flag = entropy_flag;
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_flag = false;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    header_.packet_sequence_number = number;
838868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP;
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    header_.fec_group = fec_group;
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicFrames frames;
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicFrame frame(&frame1_);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frames.push_back(frame);
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacket* packet =
84546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        BuildUnsizedDataPacket(&framer_, header_, frames).packet;
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(packet != NULL);
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return packet;
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number,
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   QuicFecGroupNumber fec_group) {
852a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    header_.public_header.connection_id = connection_id_;
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.packet_sequence_number = number;
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.reset_flag = false;
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.version_flag = false;
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.entropy_flag = false;
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_flag = false;
858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP;
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_group = fec_group;
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicConnectionCloseFrame qccf;
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    qccf.error_code = QUIC_PEER_GOING_AWAY;
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicFrames frames;
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicFrame frame(&qccf);
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frames.push_back(frame);
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacket* packet =
86846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        BuildUnsizedDataPacket(&framer_, header_, frames).packet;
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(packet != NULL);
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return packet;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetFeedback(QuicCongestionFeedbackFrame* feedback) {
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    receive_algorithm_ = new TestReceiveAlgorithm(feedback);
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_.SetReceiveAlgorithm(receive_algorithm_);
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  QuicTime::Delta DefaultRetransmissionTime() {
8793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs);
8803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
8813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
88268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  QuicTime::Delta DefaultDelayedAckTime() {
88368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs/2);
88468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
88568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Initialize a frame acknowledging all packets up to largest_observed.
8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const QuicAckFrame InitAckFrame(QuicPacketSequenceNumber largest_observed,
8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  QuicPacketSequenceNumber least_unacked) {
8890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    QuicAckFrame frame(MakeAckFrame(largest_observed, least_unacked));
8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (largest_observed > 0) {
8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      frame.received_info.entropy_hash =
8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        QuicConnectionPeer::GetSentEntropyHash(&connection_, largest_observed);
8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return frame;
8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
897a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const QuicStopWaitingFrame InitStopWaitingFrame(
898a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      QuicPacketSequenceNumber least_unacked) {
899a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicStopWaitingFrame frame;
900a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    frame.least_unacked = least_unacked;
901a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return frame;
902a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Explicitly nack a packet.
9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void NackPacket(QuicPacketSequenceNumber missing, QuicAckFrame* frame) {
9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frame->received_info.missing_packets.insert(missing);
9065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frame->received_info.entropy_hash ^=
9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, missing);
9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (missing > 1) {
9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      frame->received_info.entropy_hash ^=
9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        QuicConnectionPeer::GetSentEntropyHash(&connection_, missing - 1);
9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
9125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Undo nacking a packet within the frame.
9155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void AckPacket(QuicPacketSequenceNumber arrived, QuicAckFrame* frame) {
9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_THAT(frame->received_info.missing_packets, Contains(arrived));
9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frame->received_info.missing_packets.erase(arrived);
9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frame->received_info.entropy_hash ^=
9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, arrived);
9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (arrived > 1) {
9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      frame->received_info.entropy_hash ^=
9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        QuicConnectionPeer::GetSentEntropyHash(&connection_, arrived - 1);
9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void TriggerConnectionClose() {
9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Send an erroneous packet to close the connection.
9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(visitor_,
9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Call ProcessDataPacket rather than ProcessPacket, as we should not get a
9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // packet call to the visitor.
9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ProcessDataPacket(6000, 0, !kEntropyFlag);
9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(
9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void BlockOnNextWrite() {
9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    writer_->BlockOnNextWrite();
9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1));
9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
9415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
94246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void CongestionBlockWrites() {
94346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_,
94446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                TimeUntilSend(_, _, _)).WillRepeatedly(
94546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    testing::Return(QuicTime::Delta::FromSeconds(1)));
94646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
94746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
94846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void CongestionUnblockWrites() {
94946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_,
95046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                TimeUntilSend(_, _, _)).WillRepeatedly(
95146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    testing::Return(QuicTime::Delta::Zero()));
95246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
95346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
954a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicConnectionId connection_id_;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFramer framer_;
95646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  QuicPacketCreator peer_creator_;
9570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  MockEntropyCalculator entropy_calculator_;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockSendAlgorithm* send_algorithm_;
960a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockLossAlgorithm* loss_algorithm_;
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestReceiveAlgorithm* receive_algorithm_;
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockClock clock_;
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockRandom random_generator_;
9641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<TestConnectionHelper> helper_;
9651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<TestPacketWriter> writer_;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestConnection connection_;
9673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  StrictMock<MockConnectionVisitor> visitor_;
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketHeader header_;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame frame1_;
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame frame2_;
9722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  scoped_ptr<QuicAckFrame> outgoing_ack_;
9730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicSequenceNumberLength sequence_number_length_;
9740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicConnectionIdLength connection_id_length_;
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicConnectionTest);
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
980a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Run all end to end tests with all supported versions.
981a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(SupportedVersion,
982a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        QuicConnectionTest,
983a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        ::testing::ValuesIn(QuicSupportedVersions()));
984a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
985a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, PacketsInOrder) {
986d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
987d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(1);
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, outgoing_ack()->received_info.largest_observed);
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(2);
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, outgoing_ack()->received_info.largest_observed);
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(3);
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1001a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, PacketsOutOfOrder) {
1002d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1003d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(3);
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(2));
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(2);
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsMissing(2));
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(1);
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsMissing(2));
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsMissing(1));
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, DuplicatePacket) {
1021d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1022d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(3);
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(2));
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send packet 3 again, but do not set the expectation that
1029d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // the visitor OnStreamFrames() will be called.
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(3, 0, !kEntropyFlag);
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(2));
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1036a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, PacketsOutOfOrderWithAdditionsAndLeastAwaiting) {
1037d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1038d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(3);
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(2));
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(2);
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(5);
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(5u, outgoing_ack()->received_info.largest_observed);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(4));
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend at this point the client has gotten acks for 2 and 3 and 1 is a
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // packet the peer will not retransmit.  It indicates this by sending 'least
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // awaiting' is 4.  The connection should then realize 1 will not be
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // retransmitted, and will remove it from the missing list.
105746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(5);
1058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QuicAckFrame frame = InitAckFrame(1, 4);
1059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(_, _, _, _));
106068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force an ack to be sent.
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(4));
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1067a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, RejectPacketTooFarOut) {
10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(visitor_,
10695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call ProcessDataPacket rather than ProcessPacket, as we should not get a
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // packet call to the visitor.
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(6000, 0, !kEntropyFlag);
10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(
10745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_P(QuicConnectionTest, RejectUnencryptedStreamData) {
10785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Process an unencrypted packet from the non-crypto stream.
10795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  frame1_.stream_id = 3;
10805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
10815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_UNENCRYPTED_STREAM_DATA,
10825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                           false));
10835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ProcessDataPacket(1, 0, !kEntropyFlag);
10845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(
10855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
10865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const vector<QuicConnectionCloseFrame>& connection_close_frames =
10875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      writer_->connection_close_frames();
10885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1u, connection_close_frames.size());
10895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(QUIC_UNENCRYPTED_STREAM_DATA,
10905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            connection_close_frames[0].error_code);
10915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
10925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1093a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, TruncatedAck) {
1094d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1095a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  QuicPacketSequenceNumber num_packets = 256 * 2 + 1;
1096a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (QuicPacketSequenceNumber i = 0; i < num_packets; ++i) {
10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SendStreamDataToPeer(3, "foo", i * 3, !kFin, NULL);
10980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
10990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame = InitAckFrame(num_packets, 1);
1101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
11020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Create an ack with 256 nacks, none adjacent to one another.
11030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  for (QuicPacketSequenceNumber i = 1; i <= 256; ++i) {
11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NackPacket(i * 2, &frame);
1105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (i < 256) {  // Last packet is nacked, but not lost.
1106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      lost_packets.insert(i * 2);
1107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
11080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
11110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_CALL(entropy_calculator_,
11120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              EntropyHash(511)).WillOnce(testing::Return(0));
1113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
11140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ProcessAckPacket(&frame);
11150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  QuicReceivedPacketManager* received_packet_manager =
1117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      QuicConnectionPeer::GetReceivedPacketManager(&connection_);
1118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // A truncated ack will not have the true largest observed.
1119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_GT(num_packets,
1120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            received_packet_manager->peer_largest_observed_packet());
11210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
11225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AckPacket(192, &frame);
11230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
11245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Removing one missing packet allows us to ack 192 and one more range, but
11255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // 192 has already been declared lost, so it doesn't register as an ack.
1126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(SequenceNumberSet()));
1128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
11290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ProcessAckPacket(&frame);
1130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(num_packets,
1131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            received_packet_manager->peer_largest_observed_packet());
11320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
11330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, AckReceiptCausesAckSendBadEntropy) {
1135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1137558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ProcessPacket(1);
1138558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Delay sending, then queue up an ack.
1139558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_CALL(*send_algorithm_,
1140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillOnce(
1141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  testing::Return(QuicTime::Delta::FromMicroseconds(1)));
1142558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  QuicConnectionPeer::SendAck(&connection_);
1143558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1144558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Process an ack with a least unacked of the received ack.
1145558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // This causes an ack to be sent when TimeUntilSend returns 0.
1146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_CALL(*send_algorithm_,
1147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillRepeatedly(
1148558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  testing::Return(QuicTime::Delta::Zero()));
1149558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Skip a packet and then record an ack.
115046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(2);
11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame = InitAckFrame(0, 3);
115268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
115368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
115468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, OutOfOrderReceiptCausesAckSend) {
115668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
115768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
115868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessPacket(3);
115968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Should ack immediately since we have missing packets.
11601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(1u, writer_->packets_write_attempts());
116168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
116268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessPacket(2);
116368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Should ack immediately since we have missing packets.
11641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(2u, writer_->packets_write_attempts());
116568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
116668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessPacket(1);
116768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Should ack immediately, since this fills the last hole.
11681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(3u, writer_->packets_write_attempts());
116968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
117068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessPacket(4);
117168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Should not cause an ack.
11721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(3u, writer_->packets_write_attempts());
1173558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
1174558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, AckReceiptCausesAckSend) {
1176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
117868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  QuicPacketSequenceNumber original;
1179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  QuicByteCount packet_size;
1180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
1181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(DoAll(SaveArg<2>(&original), SaveArg<3>(&packet_size),
1182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      Return(true)));
1183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
11845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame = InitAckFrame(original, 1);
11855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(original, &frame);
1186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // First nack triggers early retransmit.
1187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
1188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  lost_packets.insert(1);
1189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
1191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
119268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  QuicPacketSequenceNumber retransmission;
119368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _))
1195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(DoAll(SaveArg<2>(&retransmission), Return(true)));
119668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
119768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
1198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame2 = InitAckFrame(retransmission, 1);
12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(original, &frame2);
1201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(SequenceNumberSet()));
120468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame2);
1205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Now if the peer sends an ack which still reports the retransmitted packet
1207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // as missing, that will bundle an ack with data after two acks in a row
1208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // indicate the high water mark needs to be raised.
1209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _,
1210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             HAS_RETRANSMITTABLE_DATA));
1211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL);
1212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // No ack sent.
1213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, writer_->frame_count());
12140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->stream_frames().size());
1215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // No more packet loss for the rest of the test.
1217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillRepeatedly(Return(SequenceNumberSet()));
121968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame2);
1220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _,
1221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             HAS_RETRANSMITTABLE_DATA));
1222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL);
1223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ack bundled.
1224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
1225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3u, writer_->frame_count());
1226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
1227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(2u, writer_->frame_count());
1228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
12290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->stream_frames().size());
12300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
1231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
123268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // But an ack with no missing packets will not send an ack.
12335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AckPacket(original, &frame2);
123468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame2);
123568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame2);
1236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, LeastUnackedLower) {
1239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 3, !kFin, NULL);
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "eep", 6, !kFin, NULL);
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Start out saying the least unacked is 2.
124646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(5);
1247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
1248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicStopWaitingFrame frame = InitStopWaitingFrame(2);
1249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProcessStopWaitingPacket(&frame);
1250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
1251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicAckFrame frame = InitAckFrame(0, 2);
1252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProcessAckPacket(&frame);
1253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change it to 1, but lower the sequence number to fake out-of-order packets.
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should be fine.
125746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(1);
12585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The scheduler will not process out of order acks, but all packet processing
12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // causes the connection to try to write.
1260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite());
1261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
1262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicStopWaitingFrame frame2 = InitStopWaitingFrame(1);
1263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProcessStopWaitingPacket(&frame2);
1264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
1265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicAckFrame frame2 = InitAckFrame(0, 1);
1266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProcessAckPacket(&frame2);
1267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now claim it's one, but set the ordering so it was sent "after" the first
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one.  This should cause a connection error.
1271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
127246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(7);
1273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
1274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(visitor_,
1275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                OnConnectionClosed(QUIC_INVALID_STOP_WAITING_DATA, false));
1276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicStopWaitingFrame frame2 = InitStopWaitingFrame(1);
1277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProcessStopWaitingPacket(&frame2);
1278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
1279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, false));
1280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicAckFrame frame2 = InitAckFrame(0, 1);
1281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProcessAckPacket(&frame2);
1282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, LargestObservedLower) {
1286d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1287d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 3, !kFin, NULL);
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "eep", 6, !kFin, NULL);
1291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start out saying the largest observed is 2.
12945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame1 = InitAckFrame(1, 0);
12955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame2 = InitAckFrame(2, 0);
12965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessAckPacket(&frame2);
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now change it to 1, and it should cause a connection error.
12991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, false));
130068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).Times(0);
13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessAckPacket(&frame1);
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, AckUnsentData) {
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ack a packet which has not been sent.
13061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, false));
1307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
13090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicAckFrame frame(MakeAckFrame(1, 0));
131068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).Times(0);
131168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, AckAll) {
1315d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(1);
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(1);
13195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame1 = InitAckFrame(0, 1);
132068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame1);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendingDifferentSequenceNumberLengthsBandwidth) {
13243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  QuicPacketSequenceNumber last_packet;
132546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  QuicPacketCreator* creator =
132646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      QuicConnectionPeer::GetPacketCreator(&connection_);
13273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);
13283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1u, last_packet);
13293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
133046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            creator->next_sequence_number_length());
13313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
13320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->header().public_header.sequence_number_length);
13333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly(
13350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      Return(kMaxPacketSize * 256));
13363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet);
13383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(2u, last_packet);
13393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
134046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            creator->next_sequence_number_length());
13413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The 1 packet lag is due to the sequence number length being recalculated in
13423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // QuicConnection after a packet is sent.
13433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
13440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->header().public_header.sequence_number_length);
13453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly(
13470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      Return(kMaxPacketSize * 256 * 256));
13483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SendStreamDataToPeer(1, "foo", 6, !kFin, &last_packet);
13503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(3u, last_packet);
13513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
135246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            creator->next_sequence_number_length());
13533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
13540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->header().public_header.sequence_number_length);
13553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly(
13570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      Return(kMaxPacketSize * 256 * 256 * 256));
13583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 9, !kFin, &last_packet);
13603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(4u, last_packet);
13613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
136246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            creator->next_sequence_number_length());
13633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
13640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->header().public_header.sequence_number_length);
13653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly(
13670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      Return(kMaxPacketSize * 256 * 256 * 256 * 256));
13683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet);
13703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(5u, last_packet);
13713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
137246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            creator->next_sequence_number_length());
13733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
13740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->header().public_header.sequence_number_length);
13753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
13763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendingDifferentSequenceNumberLengthsUnackedDelta) {
13783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  QuicPacketSequenceNumber last_packet;
137946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  QuicPacketCreator* creator =
138046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      QuicConnectionPeer::GetPacketCreator(&connection_);
13813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);
13823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1u, last_packet);
13833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
138446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            creator->next_sequence_number_length());
13853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
13860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->header().public_header.sequence_number_length);
13873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
138846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  creator->set_sequence_number(100);
13893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet);
13913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
139246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            creator->next_sequence_number_length());
13933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
13940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->header().public_header.sequence_number_length);
13953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
139646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  creator->set_sequence_number(100 * 256);
13973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
13983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SendStreamDataToPeer(1, "foo", 6, !kFin, &last_packet);
13993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
140046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            creator->next_sequence_number_length());
14013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
14020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->header().public_header.sequence_number_length);
14033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
140446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  creator->set_sequence_number(100 * 256 * 256);
14053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 9, !kFin, &last_packet);
14073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
140846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            creator->next_sequence_number_length());
14093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
14100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->header().public_header.sequence_number_length);
14113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
141246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  creator->set_sequence_number(100 * 256 * 256 * 256);
14133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet);
14153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
141646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            creator->next_sequence_number_length());
14173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
14180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->header().public_header.sequence_number_length);
14193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
14203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, BasicSending) {
1422d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber last_packet;
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);  // Packet 1
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, last_packet);
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 2
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, least_unacked());
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 3
1431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, least_unacked());
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet);  // Packet 4
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4u, last_packet);
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 5
1436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, least_unacked());
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
14395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1440ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Peer acks up to packet 3.
14415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame = InitAckFrame(3, 0);
144268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 6
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // As soon as we've acked one, we skip ack packets 2 and 3 and note lack of
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ack for 4.
1447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(4u, least_unacked());
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
14505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1451ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Peer acks up to packet 4, the last packet.
14525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame2 = InitAckFrame(6, 0);
145368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame2);  // Acks don't instigate acks.
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Verify that we did not send an ack.
14560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(6u, writer_->header().packet_sequence_number);
1457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // So the last ack has not changed.
1459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(4u, least_unacked());
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we force an ack, we shouldn't change our retransmit state.
1462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendAckPacketToPeer();  // Packet 7
1463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(7u, least_unacked());
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But if we send more data it should.
1466ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet);  // Packet 8
1467ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(8u, last_packet);
1468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SendAckPacketToPeer();  // Packet 9
1469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(7u, least_unacked());
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, FECSending) {
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All packets carry version info till version is negotiated.
147446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  QuicPacketCreator* creator =
147546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      QuicConnectionPeer::GetPacketCreator(&connection_);
14767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t payload_length;
1477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining
1478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // packet length. The size of the offset field in a stream frame is 0 for
147946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // offset 0, and 2 for non-zero offsets up through 64K. Increase
1480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // max_packet_length by 2 so that subsequent packets containing subsequent
1481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // stream frames with non-zero offets will fit within the packet length.
148246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  size_t length = 2 + GetPacketLengthForOneStream(
14833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
14843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          IN_FEC_GROUP, &payload_length);
148546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  creator->set_max_packet_length(length);
148646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Enable FEC.
1488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  creator->set_max_packets_per_fec_group(2);
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Send 4 protected data packets, which will also trigger 2 FEC packets.
1491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The first stream frame will have 2 fewer overhead bytes than the other 3.
1493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const string payload(payload_length * 4 + 2, 'a');
1494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, NULL);
14951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Expect the FEC group to be closed after SendStreamDataWithString.
1496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(creator->IsFecGroupOpen());
1497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(creator->IsFecProtected());
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, FECQueueing) {
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All packets carry version info till version is negotiated.
15027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t payload_length;
150346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  QuicPacketCreator* creator =
150446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      QuicConnectionPeer::GetPacketCreator(&connection_);
150546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  size_t length = GetPacketLengthForOneStream(
150646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
150746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      IN_FEC_GROUP, &payload_length);
150846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  creator->set_max_packet_length(length);
1509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Enable FEC.
1510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  creator->set_max_packets_per_fec_group(1);
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
15135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
15147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const string payload(payload_length, 'a');
1515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, NULL);
1516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(creator->IsFecGroupOpen());
1517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(creator->IsFecProtected());
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Expect the first data packet and the fec packet to be queued.
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, connection_.NumQueuedPackets());
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, AbandonFECFromCongestionWindow) {
1523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Enable FEC.
1524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuicConnectionPeer::GetPacketCreator(
1525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &connection_)->set_max_packets_per_fec_group(1);
1526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 1 Data and 1 FEC packet.
1528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
1529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, NULL);
1530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const QuicTime::Delta retransmission_time =
1532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      QuicTime::Delta::FromMilliseconds(5000);
1533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  clock_.AdvanceTime(retransmission_time);
1534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
15355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Abandon FEC packet and data packet.
15365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
153868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite());
15395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.OnRetransmissionTimeout();
1540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, DontAbandonAckedFEC) {
1543d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1544f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Enable FEC.
1545f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuicConnectionPeer::GetPacketCreator(
1546f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &connection_)->set_max_packets_per_fec_group(1);
1547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 1 Data and 1 FEC packet.
1549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, NULL);
1551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Send some more data afterwards to ensure early retransmit doesn't trigger.
1552f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamDataWithStringWithFec(3, "foo", 3, !kFin, NULL);
1553f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamDataWithStringWithFec(3, "foo", 6, !kFin, NULL);
1554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
15555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame ack_fec = InitAckFrame(2, 1);
1556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Data packet missing.
1557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // TODO(ianswett): Note that this is not a sensible ack, since if the FEC was
1558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // received, it would cause the covered packet to be acked as well.
15595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(1, &ack_fec);
1560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
156168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&ack_fec);
15623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  clock_.AdvanceTime(DefaultRetransmissionTime());
1563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Don't abandon the acked FEC packet, but it will abandon 2 the subsequent
1565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // FEC packets.
15665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
15685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
15695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
15705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, AbandonAllFEC) {
15725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Enable FEC.
1574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuicConnectionPeer::GetPacketCreator(
1575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &connection_)->set_max_packets_per_fec_group(1);
15765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // 1 Data and 1 FEC packet.
1578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, NULL);
15805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Send some more data afterwards to ensure early retransmit doesn't trigger.
1581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamDataWithStringWithFec(3, "foo", 3, !kFin, NULL);
15825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Advance the time so not all the FEC packets are abandoned.
15835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
1584f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamDataWithStringWithFec(3, "foo", 6, !kFin, NULL);
15855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame ack_fec = InitAckFrame(5, 1);
15875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ack all data packets, but no fec packets.
15885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(2, &ack_fec);
15895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(4, &ack_fec);
15905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Lose the first FEC packet and ack the three data packets.
1592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
1593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  lost_packets.insert(2);
1594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
1596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
15975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessAckPacket(&ack_fec);
15985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  clock_.AdvanceTime(DefaultRetransmissionTime().Subtract(
16005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicTime::Delta::FromMilliseconds(1)));
16015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Abandon all packets
16035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(false));
16045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
16055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ensure the alarm is not set since all packets have been abandoned.
16075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
1608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, FramePacking) {
161146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionBlockWrites();
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send an ack and two stream frames in 1 packet by queueing them.
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendAck();
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
16173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     &TestConnection::SendStreamData3)),
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
1619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     &TestConnection::SendStreamData5))));
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
162246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionUnblockWrites();
162368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetSendAlarm()->Fire();
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(connection_.HasQueuedData());
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parse the last packet and ensure it's an ack and two stream frames from
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // two different streams.
1629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
1630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(4u, writer_->frame_count());
16310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_FALSE(writer_->stop_waiting_frames().empty());
1632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
1633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3u, writer_->frame_count());
1634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
16350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
163646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(2u, writer_->stream_frames().size());
1637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id);
1638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1].stream_id);
16393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
16403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, FramePackingNonCryptoThenCrypto) {
164246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionBlockWrites();
16433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
16443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Send an ack and two stream frames (one non-crypto, then one crypto) in 2
16453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // packets by queueing them.
16463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  connection_.SendAck();
16473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
16483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
16493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     &TestConnection::SendStreamData3)),
16503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
1651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     &TestConnection::SendCryptoStreamData))));
16523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
165446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionUnblockWrites();
165568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetSendAlarm()->Fire();
16563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
16573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(connection_.HasQueuedData());
16583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
16593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Parse the last packet and ensure it's the crypto stream frame.
16601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(1u, writer_->frame_count());
166146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(1u, writer_->stream_frames().size());
16620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0].stream_id);
16633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
16643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, FramePackingCryptoThenNonCrypto) {
166646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionBlockWrites();
16673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
16686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Send an ack and two stream frames (one crypto, then one non-crypto) in 2
16693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // packets by queueing them.
16703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  connection_.SendAck();
16713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
16723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
16733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     &TestConnection::SendCryptoStreamData)),
16743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
1675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     &TestConnection::SendStreamData3))));
16763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
16776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
167846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionUnblockWrites();
167968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetSendAlarm()->Fire();
16803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
16813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(connection_.HasQueuedData());
16823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
16833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Parse the last packet and ensure it's the stream frame from stream 3.
16841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(1u, writer_->frame_count());
168546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(1u, writer_->stream_frames().size());
1686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id);
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, FramePackingFEC) {
1690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Enable FEC.
1691f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuicConnectionPeer::GetPacketCreator(
1692f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &connection_)->set_max_packets_per_fec_group(6);
1693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
169446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionBlockWrites();
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1696f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Queue an ack and two stream frames. Ack gets flushed when FEC is turned on
1697f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // for sending protected data; two stream frames are packing in 1 packet.
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1699f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(
1700f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          &connection_, &TestConnection::SendStreamData3WithFec)),
1701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(
1702f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          &connection_, &TestConnection::SendStreamData5WithFec))));
1703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendAck();
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1705f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
170646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionUnblockWrites();
170768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetSendAlarm()->Fire();
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(connection_.HasQueuedData());
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parse the last packet and ensure it's in an fec group.
1712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2u, writer_->header().fec_group);
17131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(0u, writer_->frame_count());
17141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
17151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, FramePackingAckResponse) {
17171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
17181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Process a data packet to queue up a pending ack.
17195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
17201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ProcessDataPacket(1, 1, kEntropyFlag);
17211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
17231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
17241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                     &TestConnection::SendStreamData3)),
17251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
1726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     &TestConnection::SendStreamData5))));
17271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
17291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Process an ack to cause the visitor's OnCanWrite to be invoked.
173146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(2);
17325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame ack_one = InitAckFrame(0, 0);
17331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ProcessAckPacket(&ack_one);
17341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
17361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(connection_.HasQueuedData());
17371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
17381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Parse the last packet and ensure it's an ack and two stream frames from
17391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // two different streams.
1740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
1741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(4u, writer_->frame_count());
17420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_FALSE(writer_->stop_waiting_frames().empty());
1743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
1744a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3u, writer_->frame_count());
1745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
17460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
17470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(2u, writer_->stream_frames().size());
1748cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id);
1749cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1].stream_id);
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, FramePackingSendv) {
1753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Send data in 1 packet by writing multiple blocks in a single iovector
1754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // using writev.
1755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1756d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1757d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  char data[] = "ABCD";
17581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  IOVector data_iov;
17591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  data_iov.AppendNoCoalesce(data, 2);
17601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  data_iov.AppendNoCoalesce(data + 2, 2);
1761f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamData(1, data_iov, 0, !kFin, MAY_FEC_PROTECT, NULL);
1762d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1763d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
1764d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(connection_.HasQueuedData());
1765d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Parse the last packet and ensure multiple iovector blocks have
1767f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // been packed into a single stream frame from one stream.
1768f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1u, writer_->frame_count());
17690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->stream_frames().size());
17700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicStreamFrame frame = writer_->stream_frames()[0];
1771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1u, frame.stream_id);
1772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("ABCD", string(static_cast<char*>
1773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           (frame.data.iovec()[0].iov_base),
1774f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           (frame.data.iovec()[0].iov_len)));
1775d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1776d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1777a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, FramePackingSendvQueued) {
1778d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Try to send two stream frames in 1 packet by using writev.
1779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1780d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
17815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
1782d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  char data[] = "ABCD";
17831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  IOVector data_iov;
17841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  data_iov.AppendNoCoalesce(data, 2);
17851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  data_iov.AppendNoCoalesce(data + 2, 2);
1786f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamData(1, data_iov, 0, !kFin, MAY_FEC_PROTECT, NULL);
1787d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1788d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
1789d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(connection_.HasQueuedData());
1790d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1791d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Unblock the writes and actually send.
17925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->SetWritable();
1793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  connection_.OnCanWrite();
1794d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
1795d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Parse the last packet and ensure it's one stream frame from one stream.
1797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1u, writer_->frame_count());
17980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->stream_frames().size());
17990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->stream_frames()[0].stream_id);
1800d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1801d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1802a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendingZeroBytes) {
1803d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Send a zero byte write with a fin using writev.
1804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
18051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  IOVector empty_iov;
1806f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.SendStreamData(1, empty_iov, 0, kFin, MAY_FEC_PROTECT, NULL);
1807d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1808d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
1809d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(connection_.HasQueuedData());
1810d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Parse the last packet and ensure it's one stream frame from one stream.
18121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(1u, writer_->frame_count());
18130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->stream_frames().size());
18140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->stream_frames()[0].stream_id);
18150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(writer_->stream_frames()[0].fin);
1816d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1817d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, OnCanWrite) {
1819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Visitor's OnCanWrite will send data, but will have more pending writes.
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
18223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     &TestConnection::SendStreamData3)),
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
1824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     &TestConnection::SendStreamData5))));
1825cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(visitor_, WillingAndAbleToWrite()).WillOnce(Return(true));
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillRepeatedly(
18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::Zero()));
18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.OnCanWrite();
1831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parse the last packet and ensure it's the two stream frames from
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // two different streams.
18341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(2u, writer_->frame_count());
18350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(2u, writer_->stream_frames().size());
1836cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id);
1837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1].stream_id);
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1840a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, RetransmitOnNack) {
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber last_packet;
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount second_packet_size;
1843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(3, "foo", 0, !kFin, &last_packet);  // Packet 1
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_packet_size =
1845f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SendStreamDataToPeer(3, "foos", 3, !kFin, &last_packet);  // Packet 2
1846f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(3, "fooos", 7, !kFin, &last_packet);  // Packet 3
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1848d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1850a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Don't lose a packet on an ack, and nothing is retransmitted.
1851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
18525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame ack_one = InitAckFrame(1, 0);
185368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&ack_one);
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1855a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Lose a packet and ensure it triggers retransmission.
18565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame nack_two = InitAckFrame(3, 0);
18575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(2, &nack_two);
1858a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
1859a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  lost_packets.insert(2);
1860a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1861a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
1862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              OnPacketSent(_, _, _, second_packet_size - kQuicVersionSize, _)).
1865e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                  Times(1);
186668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&nack_two);
186768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
186868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1869a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, DiscardRetransmit) {
187068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  QuicPacketSequenceNumber last_packet;
187168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);  // Packet 1
187268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet);  // Packet 2
187368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet);  // Packet 3
187468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
187568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
187668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1877a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Instigate a loss with an ack.
18785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame nack_two = InitAckFrame(3, 0);
18795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(2, &nack_two);
1880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The first nack should trigger a fast retransmission, but we'll be
188168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // write blocked, so the packet will be queued.
18825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
1883a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
1884a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  lost_packets.insert(2);
1885a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1886a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
1887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
188868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&nack_two);
188968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
189068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
189168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Now, ack the previous transmission.
1892a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1893a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(SequenceNumberSet()));
18945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame ack_all = InitAckFrame(3, 0);
189568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&ack_all);
189668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
189768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Unblock the socket and attempt to send the queued packets.  However,
189868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // since the previous transmission has been acked, we will not
189968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // send the retransmission.
190068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              OnPacketSent(_, _, _, _, _)).Times(0);
190268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
19035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->SetWritable();
190468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.OnCanWrite();
190568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
190668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1909a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, RetransmitNackedLargestObserved) {
1910d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber largest_observed;
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount packet_size;
1913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
1914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(DoAll(SaveArg<2>(&largest_observed), SaveArg<3>(&packet_size),
1915d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      Return(true)));
1916f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
1917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
19185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame = InitAckFrame(1, largest_observed);
19195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(largest_observed, &frame);
1920f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The first nack should retransmit the largest observed packet.
1921a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
1922a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  lost_packets.insert(1);
1923a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1924a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
1925010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
192668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1927010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _));
192868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1931a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, QueueAfterTwoRTOs) {
193268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  for (int i = 0; i < 10; ++i) {
1933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
19345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    connection_.SendStreamDataWithString(3, "foo", i * 3, !kFin, NULL);
193590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
193690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
193768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Block the congestion window and ensure they're queued.
19385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
19393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  clock_.AdvanceTime(DefaultRetransmissionTime());
194068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Only one packet should be retransmitted.
19415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
194268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
194368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(connection_.HasQueuedData());
194490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
194568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Unblock the congestion window.
19465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->SetWritable();
194790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(
19483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      2 * DefaultRetransmissionTime().ToMicroseconds()));
194990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Retransmit already retransmitted packets event though the sequence number
195090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // greater than the largest observed.
1951010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(10);
195268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
195368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.OnCanWrite();
195490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
195590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1956a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, WriteBlockedThenSent) {
19575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
19581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  writer_->set_is_write_blocked_data_buffered(true);
1959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
19601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
19611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1962010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
19631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0));
19641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
19651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
19661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1967a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, WriteBlockedAckedThenSent) {
19685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
19695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
19705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->set_is_write_blocked_data_buffered(true);
19715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
19725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
19735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
19745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ack the sent packet before the callback returns, which happens in
19755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // rare circumstances with write blocked sockets.
19765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame ack = InitAckFrame(1, 0);
19775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessAckPacket(&ack);
19785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1979010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
19805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0));
19815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
19825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
19835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1984a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) {
19855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
19865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
19875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
19885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
19895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
19905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->set_is_write_blocked_data_buffered(true);
19915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate the retransmission alarm firing.
19925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(_));
19935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  clock_.AdvanceTime(DefaultRetransmissionTime());
19945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
19955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
19965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ack the sent packet before the callback returns, which happens in
19975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // rare circumstances with write blocked sockets.
19985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame ack = InitAckFrame(1, 0);
1999010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
20005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessAckPacket(&ack);
20015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
20025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0));
2003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // There is now a pending packet, but with no retransmittable frames.
2004cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
2005cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(connection_.sent_packet_manager().HasRetransmittableFrames(2));
20065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
20075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, AlarmsWhenWriteBlocked) {
20095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Block the connection.
20105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
20115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
20125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, writer_->packets_write_attempts());
20135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(writer_->IsWriteBlocked());
20145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
20155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Set the send and resumption alarms. Fire the alarms and ensure they don't
20165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // attempt to write.
20174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  connection_.GetResumeWritesAlarm()->Set(clock_.ApproximateNow());
20184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  connection_.GetSendAlarm()->Set(clock_.ApproximateNow());
20194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  connection_.GetResumeWritesAlarm()->Fire();
20204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  connection_.GetSendAlarm()->Fire();
20215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(writer_->IsWriteBlocked());
20225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, writer_->packets_write_attempts());
20234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
20244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, NoLimitPacketsPerNack) {
2026d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int offset = 0;
2028f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Send packets 1 to 15.
2029f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (int i = 0; i < 15; ++i) {
20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendStreamDataToPeer(1, "foo", offset, !kFin, NULL);
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    offset += 3;
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2034f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Ack 15, nack 1-14.
2035a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
20365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame nack = InitAckFrame(15, 0);
2037f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (int i = 1; i < 15; ++i) {
20385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NackPacket(i, &nack);
2039a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    lost_packets.insert(i);
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // 14 packets have been NACK'd and lost.  In TCP cubic, PRR limits
20435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the retransmission rate in the case of burst losses.
2044a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
2045a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
2046010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(14);
204868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&nack);
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test sending multiple acks from the connection to the session.
2052a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, MultipleAcks) {
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber last_packet;
2054f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);  // Packet 1
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, last_packet);
2056f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(3, "foo", 0, !kFin, &last_packet);  // Packet 2
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, last_packet);
20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 3
2059f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(5, "foo", 0, !kFin, &last_packet);  // Packet 4
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4u, last_packet);
2061f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 3, !kFin, &last_packet);  // Packet 5
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5u, last_packet);
2063f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendStreamDataToPeer(3, "foo", 3, !kFin, &last_packet);  // Packet 6
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(6u, last_packet);
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2066f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Client will ack packets 1, 2, [!3], 4, 5.
2067010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
20685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame1 = InitAckFrame(5, 0);
20695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(3, &frame1);
2070d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
207168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame1);
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2073f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Now the client implicitly acks 3, and explicitly acks 6.
2074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
20755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame2 = InitAckFrame(6, 0);
207668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame2);
20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2079a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, DontLatchUnackedPacket) {
20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);  // Packet 1;
2081e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // From now on, we send acks, so the send algorithm won't mark them pending.
2082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
20835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              .WillByDefault(Return(false));
20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 2
20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2086d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2087010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
20885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame = InitAckFrame(1, 0);
208968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2091e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Verify that our internal state has least-unacked as 2, because we're still
2092e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // waiting for a potential ack for 2.
2093e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(2u, outgoing_ack()->sent_info.least_unacked);
2094e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2095010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2096e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  frame = InitAckFrame(2, 0);
2097e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ProcessAckPacket(&frame);
20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->sent_info.least_unacked);
20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When we send an ack, we make sure our least-unacked makes sense.  In this
21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // case since we're not waiting on an ack for 2 and all packets are acked, we
21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // set it to 3.
21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 3
2104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Least_unacked remains at 3 until another ack is received.
2105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(3u, outgoing_ack()->sent_info.least_unacked);
21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that the outgoing ack had its sequence number as least_unacked.
2107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(3u, least_unacked());
21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Ack the ack, which updates the rtt and raises the least unacked.
2110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  frame = InitAckFrame(3, 0);
2112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ProcessAckPacket(&frame);
2113e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
21155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              .WillByDefault(Return(true));
21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 3, false, NULL);  // Packet 4
21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4u, outgoing_ack()->sent_info.least_unacked);
2118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
21195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              .WillByDefault(Return(false));
21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 5
2121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(4u, least_unacked());
2122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Send two data packets at the end, and ensure if the last one is acked,
2124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // the least unacked is raised above the ack packets.
2125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2126e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch              .WillByDefault(Return(true));
2127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SendStreamDataToPeer(1, "bar", 6, false, NULL);  // Packet 6
2128e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SendStreamDataToPeer(1, "bar", 9, false, NULL);  // Packet 7
2129e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2131e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  frame = InitAckFrame(7, 0);
2132e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  NackPacket(5, &frame);
2133e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  NackPacket(6, &frame);
2134e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ProcessAckPacket(&frame);
2135e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2136e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_EQ(6u, outgoing_ack()->sent_info.least_unacked);
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ReviveMissingPacketAfterFecPacket) {
2140d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2141d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 1.
214358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL);
2144d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Entropy flag should be false, so entropy should be 0.
2145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21480529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingSeqNumLengths) {
21490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
21500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
21510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Set up a debug visitor to the connection.
21520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<FecQuicConnectionDebugVisitor>
21530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      fec_visitor(new FecQuicConnectionDebugVisitor);
21540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  connection_.set_debug_visitor(fec_visitor.get());
21550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
21560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicPacketSequenceNumber fec_packet = 0;
21570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicSequenceNumberLength lengths[] = {PACKET_6BYTE_SEQUENCE_NUMBER,
21580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                        PACKET_4BYTE_SEQUENCE_NUMBER,
21590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                        PACKET_2BYTE_SEQUENCE_NUMBER,
21600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                        PACKET_1BYTE_SEQUENCE_NUMBER};
21610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // For each sequence number length size, revive a packet and check sequence
21620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // number length in the revived packet.
21630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (size_t i = 0; i < arraysize(lengths); ++i) {
21640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Set sequence_number_length_ (for data and FEC packets).
21650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    sequence_number_length_ = lengths[i];
21660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    fec_packet += 2;
21670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Don't send missing packet, but send fec packet right after it.
2168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ProcessFecPacket(fec_packet, fec_packet - 1, true, !kEntropyFlag, NULL);
21690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Sequence number length in the revived header should be the same as
21700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // in the original data/fec packet headers.
21710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(sequence_number_length_, fec_visitor->revived_header().
21720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                       public_header.sequence_number_length);
21730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
21740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
21750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
21760529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingConnectionIdLengths) {
21770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
21780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
21790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Set up a debug visitor to the connection.
21800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<FecQuicConnectionDebugVisitor>
21810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      fec_visitor(new FecQuicConnectionDebugVisitor);
21820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  connection_.set_debug_visitor(fec_visitor.get());
21830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
21840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicPacketSequenceNumber fec_packet = 0;
21850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicConnectionIdLength lengths[] = {PACKET_8BYTE_CONNECTION_ID,
21860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                      PACKET_4BYTE_CONNECTION_ID,
21870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                      PACKET_1BYTE_CONNECTION_ID,
21880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                      PACKET_0BYTE_CONNECTION_ID};
21890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // For each connection id length size, revive a packet and check connection
21900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // id length in the revived packet.
21910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (size_t i = 0; i < arraysize(lengths); ++i) {
21920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Set connection id length (for data and FEC packets).
21930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    connection_id_length_ = lengths[i];
21940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    fec_packet += 2;
21950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Don't send missing packet, but send fec packet right after it.
2196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ProcessFecPacket(fec_packet, fec_packet - 1, true, !kEntropyFlag, NULL);
21970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Connection id length in the revived header should be the same as
21980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // in the original data/fec packet headers.
21990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(connection_id_length_,
22000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch              fec_visitor->revived_header().public_header.connection_id_length);
22010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
22020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
22030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketThenFecPacket) {
2205d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2206d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(1, false, kEntropyFlag);
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 2.
220958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ProcessFecPacket(3, 1, true, !kEntropyFlag, NULL);
2210d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Entropy flag should be true, so entropy should not be 0.
2211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketsThenFecPacket) {
2215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(1, false, !kEntropyFlag);
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 2.
22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(3, false, !kEntropyFlag);
222058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ProcessFecPacket(4, 1, true, kEntropyFlag, NULL);
22215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ensure QUIC no longer revives entropy for lost packets.
22225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
22235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 4));
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacket) {
2227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 1.
223058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ProcessFecPacket(3, 1, false, !kEntropyFlag, NULL);
223168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Out of order.
22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(2, true, !kEntropyFlag);
2233d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Entropy flag should be false, so entropy should be 0.
2234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPackets) {
2238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(1, false, !kEntropyFlag);
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 2.
224258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ProcessFecPacket(6, 1, false, kEntropyFlag, NULL);
22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(3, false, kEntropyFlag);
22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(4, false, kEntropyFlag);
22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(5, true, !kEntropyFlag);
22465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ensure entropy is not revived for the missing packet.
22475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
22485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 3));
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_P(QuicConnectionTest, TLP) {
2252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuicSentPacketManagerPeer::SetMaxTailLossProbes(
2253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      QuicConnectionPeer::GetSentPacketManager(&connection_), 1);
2254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SendStreamDataToPeer(3, "foo", 0, !kFin, NULL);
2256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, outgoing_ack()->sent_info.least_unacked);
2257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuicTime retransmission_time =
2258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      connection_.GetRetransmissionAlarm()->deadline();
2259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_NE(QuicTime::Zero(), retransmission_time);
2260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, writer_->header().packet_sequence_number);
2262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Simulate the retransmission alarm firing and sending a tlp,
2263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // so send algorithm's OnRetransmissionTimeout is not called.
2264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  clock_.AdvanceTime(retransmission_time.Subtract(clock_.Now()));
2265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _));
2266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
2267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2u, writer_->header().packet_sequence_number);
2268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // We do not raise the high water mark yet.
2269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1u, outgoing_ack()->sent_info.least_unacked);
2270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
2271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, RTO) {
22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
22743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      DefaultRetransmissionTime());
22755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendStreamDataToPeer(3, "foo", 0, !kFin, NULL);
22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, outgoing_ack()->sent_info.least_unacked);
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->header().packet_sequence_number);
2279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(default_retransmission_time,
2280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            connection_.GetRetransmissionAlarm()->deadline());
2281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Simulate the retransmission alarm firing.
22823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  clock_.AdvanceTime(DefaultRetransmissionTime());
22835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _));
2285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
22860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(2u, writer_->header().packet_sequence_number);
228768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // We do not raise the high water mark yet.
228868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, outgoing_ack()->sent_info.least_unacked);
22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, RTOWithSameEncryptionLevel) {
2292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
22933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      DefaultRetransmissionTime());
2294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  use_tagging_decrypter();
2295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
229690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at
229790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // the end of the packet. We can test this to check which encrypter was used.
2298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
22995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendStreamDataToPeer(3, "foo", 0, !kFin, NULL);
23000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet());
2301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
2303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
23045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendStreamDataToPeer(3, "foo", 0, !kFin, NULL);
23050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet());
2306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(default_retransmission_time,
2308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            connection_.GetRetransmissionAlarm()->deadline());
2309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  {
2310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    InSequence s;
23115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 3, _, _));
2313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 4, _, _));
2314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
2315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Simulate the retransmission alarm firing.
23173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  clock_.AdvanceTime(DefaultRetransmissionTime());
2318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
2319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Packet should have been sent with ENCRYPTION_NONE.
23210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0x01010101u, writer_->final_bytes_of_previous_packet());
2322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Packet should have been sent with ENCRYPTION_INITIAL.
23240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet());
2325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendHandshakeMessages) {
232868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  use_tagging_decrypter();
232968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at
233068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // the end of the packet. We can test this to check which encrypter was used.
233168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
233268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2333e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Attempt to send a handshake message and have the socket block.
233468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillRepeatedly(
2336e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                  testing::Return(QuicTime::Delta::Zero()));
2337e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  BlockOnNextWrite();
2338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
233968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // The packet should be serialized, but not queued.
234068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
234168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
234268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Switch to the new encrypter.
234368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
234468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
234568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
234668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Now become writeable and flush the packets.
2347e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  writer_->SetWritable();
234868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite());
234968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.OnCanWrite();
235068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
235168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
235268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Verify that the handshake packet went out at the null encryption.
23530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet());
235468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
235568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest,
235790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       DropRetransmitsForNullEncryptedPacketAfterForwardSecure) {
235890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  use_tagging_decrypter();
235990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
236090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicPacketSequenceNumber sequence_number;
23615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendStreamDataToPeer(3, "foo", 0, !kFin, &sequence_number);
236290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Simulate the retransmission alarm firing and the socket blocking.
2364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BlockOnNextWrite();
2365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  clock_.AdvanceTime(DefaultRetransmissionTime());
2367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
2368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Go forward secure.
237090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_FORWARD_SECURE,
237190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                           new TaggingEncrypter(0x02));
237290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
2373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  connection_.NeuterUnencryptedPackets();
237490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(QuicTime::Zero(),
2376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            connection_.GetRetransmissionAlarm()->deadline());
2377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Unblock the socket and ensure that no packets are sent.
2378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
2379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  writer_->SetWritable();
2380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  connection_.OnCanWrite();
238190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
238290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, RetransmitPacketsWithInitialEncryption) {
238490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  use_tagging_decrypter();
238590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
238690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetDefaultEncryptionLevel(ENCRYPTION_NONE);
238790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
238890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
238990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
239090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
239190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
239290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
239390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendStreamDataToPeer(2, "bar", 0, !kFin, NULL);
2394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
239590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  connection_.RetransmitUnackedPackets(INITIAL_ENCRYPTION_ONLY);
239790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
239890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, BufferNonDecryptablePackets) {
2400d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
24017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  use_tagging_decrypter();
24027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
24037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const uint8 tag = 0x07;
24047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag));
24057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
24067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Process an encrypted packet which can not yet be decrypted
24077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // which should result in the packet being buffered.
24085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ProcessDataPacketAtLevel(1, 0, kEntropyFlag, ENCRYPTION_INITIAL);
24097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
24107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Transition to the new encryption state and process another
24117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // encrypted packet which should result in the original packet being
24127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // processed.
24135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  connection_.SetDecrypter(new StrictTaggingDecrypter(tag),
24145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                           ENCRYPTION_INITIAL);
24157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
24167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag));
24175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(2);
24185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ProcessDataPacketAtLevel(2, 0, kEntropyFlag, ENCRYPTION_INITIAL);
24197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
24207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Finally, process a third packet and note that we do not
24217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // reprocess the buffered packet.
24225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
24235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ProcessDataPacketAtLevel(3, 0, kEntropyFlag, ENCRYPTION_INITIAL);
24247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
24257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, TestRetransmitOrder) {
24272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount first_packet_size;
2428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).WillOnce(
2429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      DoAll(SaveArg<3>(&first_packet_size), Return(true)));
24302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(3, "first_packet", 0, !kFin, NULL);
24322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount second_packet_size;
2433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).WillOnce(
2434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      DoAll(SaveArg<3>(&second_packet_size), Return(true)));
2435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(3, "second_packet", 12, !kFin, NULL);
24362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(first_packet_size, second_packet_size);
24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Advance the clock by huge time to make sure packets will be retransmitted.
24382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
24395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InSequence s;
24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_,
2443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                OnPacketSent(_, _, _, first_packet_size, _));
24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_,
2445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                OnPacketSent(_, _, _, second_packet_size, _));
24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
244768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
244868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
244968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Advance again and expect the packets to be sent again in the same order.
245068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromSeconds(20));
24515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
245268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  {
245368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    InSequence s;
245468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_CALL(*send_algorithm_,
2455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                OnPacketSent(_, _, _, first_packet_size, _));
245668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_CALL(*send_algorithm_,
2457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                OnPacketSent(_, _, _, second_packet_size, _));
245868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
245968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
24602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, RetransmissionCountCalculation) {
2463d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
24642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber original_sequence_number;
2465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(DoAll(SaveArg<2>(&original_sequence_number), Return(true)));
24675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
246868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
24702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, original_sequence_number));
2471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(QuicConnectionPeer::IsRetransmission(
24722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, original_sequence_number));
24732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Force retransmission due to RTO.
24742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
24755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
24762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber rto_sequence_number;
2477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(DoAll(SaveArg<2>(&rto_sequence_number), Return(true)));
247968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
24802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission(
24812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, original_sequence_number));
24822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, rto_sequence_number));
2484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(QuicConnectionPeer::IsRetransmission(
24852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, rto_sequence_number));
24862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Once by explicit nack.
2487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
2488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  lost_packets.insert(rto_sequence_number);
2489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
2490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
2491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
249268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  QuicPacketSequenceNumber nack_sequence_number = 0;
24932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ack packets might generate some other packets, which are not
24942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // retransmissions. (More ack packets).
2495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
24962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AnyNumber());
2497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(DoAll(SaveArg<2>(&nack_sequence_number), Return(true)));
24995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame ack = InitAckFrame(rto_sequence_number, 0);
2500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Nack the retransmitted packet.
25015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(original_sequence_number, &ack);
25025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(rto_sequence_number, &ack);
2503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ProcessAckPacket(&ack);
2504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
250568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_NE(0u, nack_sequence_number);
25062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission(
25072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, rto_sequence_number));
250868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
25092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, nack_sequence_number));
2510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(QuicConnectionPeer::IsRetransmission(
25112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, nack_sequence_number));
25122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SetRTOAfterWritingToSocket) {
25155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
2516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
25172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure that RTO is not started when the packet is queued.
251868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test that RTO is started once we write to the socket.
25215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->SetWritable();
25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.OnCanWrite();
252368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, DelayRTOWithAckReceipt) {
2527d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2529d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      .Times(2);
25305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(2, "foo", 0, !kFin, NULL);
25315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(3, "bar", 0, !kFin, NULL);
253268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  QuicAlarm* retransmission_alarm = connection_.GetRetransmissionAlarm();
253368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(retransmission_alarm->IsSet());
2534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(clock_.Now().Add(DefaultRetransmissionTime()),
2535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            retransmission_alarm->deadline());
2536d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2537d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Advance the time right before the RTO, then receive an ack for the first
2538d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // packet to delay the RTO.
2539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  clock_.AdvanceTime(DefaultRetransmissionTime());
2540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
25415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame ack = InitAckFrame(1, 0);
254268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&ack);
254368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(retransmission_alarm->IsSet());
2544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_GT(retransmission_alarm->deadline(), clock_.Now());
2545d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2546d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Move forward past the original RTO and ensure the RTO is still pending.
2547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  clock_.AdvanceTime(DefaultRetransmissionTime().Multiply(2));
2548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2549d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Ensure the second packet gets retransmitted when it finally fires.
255068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(retransmission_alarm->IsSet());
255168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_LT(retransmission_alarm->deadline(), clock_.ApproximateNow());
25525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
255468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Manually cancel the alarm to simulate a real test.
255568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
255668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
255768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // The new retransmitted sequence number should set the RTO to a larger value
255868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // than previously.
255968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(retransmission_alarm->IsSet());
256068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  QuicTime next_rto_time = retransmission_alarm->deadline();
25615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicTime expected_rto_time =
25625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      connection_.sent_packet_manager().GetRetransmissionTime();
25635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(next_rto_time, expected_rto_time);
256468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
256568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, TestQueued) {
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
25685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
2569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unblock the writes and actually send.
25735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->SetWritable();
2574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  connection_.OnCanWrite();
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, CloseFecGroup) {
2579d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
258068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Don't send missing packet 1.
258168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Don't send missing packet 2.
25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(3, false, !kEntropyFlag);
258368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Don't send missing FEC packet 3.
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, connection_.NumFecGroups());
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
258668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Now send non-fec protected ack packet and close the group.
258746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(4);
2588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
2589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicStopWaitingFrame frame = InitStopWaitingFrame(5);
2590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProcessStopWaitingPacket(&frame);
2591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
2592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicAckFrame frame = InitAckFrame(0, 5);
2593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProcessAckPacket(&frame);
2594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, connection_.NumFecGroups());
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, NoQuicCongestionFeedbackFrame) {
25992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
26000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(writer_->feedback_frames().empty());
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, WithQuicCongestionFeedbackFrame) {
26042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCongestionFeedbackFrame info;
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.type = kFixRate;
26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info.fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(123);
26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetFeedback(&info);
26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
26100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_FALSE(writer_->feedback_frames().empty());
26110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(kFixRate, writer_->feedback_frames()[0].type);
26120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(info.fix_rate.bitrate,
26130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->feedback_frames()[0].fix_rate.bitrate);
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, UpdateQuicCongestionFeedbackFrame) {
26172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
26185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _));
2619d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(1);
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, DontUpdateQuicCongestionFeedbackFrameForRevived) {
2624d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
26252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process an FEC packet, and revive the missing data packet
26272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but only contact the receive_algorithm once.
26285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _));
262958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL);
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, InitialTimeout) {
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connection_.connected());
26341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_CONNECTION_TIMED_OUT, false));
2635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicTime default_timeout = clock_.ApproximateNow().Add(
263890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
2639ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Simulate the timeout alarm firing.
264290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  clock_.AdvanceTime(
264390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
264468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetTimeoutAlarm()->Fire();
264568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet());
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(connection_.connected());
26470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
26480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
26490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(connection_.GetPingAlarm()->IsSet());
26500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_FALSE(connection_.GetResumeWritesAlarm()->IsSet());
26510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
26520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_FALSE(connection_.GetSendAlarm()->IsSet());
26530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet());
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26560529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_P(QuicConnectionTest, PingAfterSend) {
26570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(connection_.connected());
26580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(visitor_, HasOpenDataStreams()).WillRepeatedly(Return(true));
26590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(connection_.GetPingAlarm()->IsSet());
26600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
26610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Advance to 5ms, and send a packet to the peer, which will set
26620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // the ping alarm.
26630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
26640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
26650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SendStreamDataToPeer(1, "GET /", 0, kFin, NULL);
26660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(connection_.GetPingAlarm()->IsSet());
26670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(15)),
26680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            connection_.GetPingAlarm()->deadline());
26690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
26700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Now recevie and ACK of the previous packet, which will move the
26710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // ping alarm forward.
26720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
26730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicAckFrame frame = InitAckFrame(1, 0);
26740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
26760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ProcessAckPacket(&frame);
26770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(connection_.GetPingAlarm()->IsSet());
26780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(15)),
26790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            connection_.GetPingAlarm()->deadline());
26800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
26810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  writer_->Reset();
26820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  clock_.AdvanceTime(QuicTime::Delta::FromSeconds(15));
26830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  connection_.GetPingAlarm()->Fire();
26840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->frame_count());
26850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (version() > QUIC_VERSION_17) {
26860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ASSERT_EQ(1u, writer_->ping_frames().size());
26870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  } else {
26880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ASSERT_EQ(1u, writer_->stream_frames().size());
26890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0].stream_id);
26900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(0u, writer_->stream_frames()[0].offset);
26910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
26920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  writer_->Reset();
26930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
26940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(visitor_, HasOpenDataStreams()).WillRepeatedly(Return(false));
26950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
26960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SendAckPacketToPeer();
26970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
26980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(connection_.GetPingAlarm()->IsSet());
26990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
27000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2701a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, TimeoutAfterSend) {
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connection_.connected());
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicTime default_timeout = clock_.ApproximateNow().Add(
270590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
270790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // When we send a packet, the timeout will change to 5000 +
270890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // kDefaultInitialTimeoutSecs.
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Send an ack so we don't set the retransmission alarm.
27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
2713ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The original alarm will fire.  We should not time out because we had a
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // network event at t=5000.  The alarm will reregister.
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(
271890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kDefaultInitialTimeoutSecs * 1000000 - 5000));
27192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(default_timeout, clock_.ApproximateNow());
272068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetTimeoutAlarm()->Fire();
272168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet());
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connection_.connected());
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)),
2724ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            connection_.GetTimeoutAlarm()->deadline());
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This time, we should time out.
27271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_CONNECTION_TIMED_OUT, false));
2728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)),
27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            clock_.ApproximateNow());
273268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetTimeoutAlarm()->Fire();
273368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet());
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(connection_.connected());
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendScheduler) {
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that if we send a packet without delay, it is not queued.
27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2741010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillOnce(
27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::Zero()));
2743010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
274468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SendPacket(
2745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2749a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendSchedulerDelay) {
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that if we send a packet with a delay, it ends up queued.
27512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillOnce(
27542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(1)));
2755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0);
275668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SendPacket(
2757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) {
27622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
27635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
27642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillOnce(
27662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::Zero()));
2767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0);
276868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SendPacket(
2769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendSchedulerDelayThenSend) {
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that if we send a packet with a delay, it ends up queued.
27752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
27762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillOnce(
27782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(1)));
277968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SendPacket(
2780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Advance the clock to fire the alarm, and configure the scheduler
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to permit the packet to be sent.
27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillRepeatedly(
27872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::Zero()));
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1));
2789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
279068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetSendAlarm()->Fire();
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendSchedulerDelayThenRetransmit) {
279546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionUnblockWrites();
2796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _));
27975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
27982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
27992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Advance the time for retransmission of lost packet.
28002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501));
280168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Test that if we send a retransmit with a delay, it ends up queued in the
280268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // sent packet manager, but not yet serialized.
28035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
280446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionBlockWrites();
280568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
280668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Advance the clock to fire the alarm, and configure the scheduler
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to permit the packet to be sent.
281046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionUnblockWrites();
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the scheduler is notified this is a retransmit.
2813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1));
281568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetSendAlarm()->Fire();
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendSchedulerDelayAndQueue) {
28202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
28212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillOnce(
28232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(1)));
282468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SendPacket(
2825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt to send another packet and make sure that it gets queued.
28292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  packet = ConstructDataPacket(2, 0, !kEntropyFlag);
283068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SendPacket(
2831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 2, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, connection_.NumQueuedPackets());
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) {
2836d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
28372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
28382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2839010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillOnce(
28402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(10)));
284168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SendPacket(
2842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now send non-retransmitting information, that we're not going to
28462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // retransmit 3. The far end should stop waiting for it.
28475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame = InitAckFrame(0, 1);
28482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillRepeatedly(
28502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::Zero()));
28512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              OnPacketSent(_, _, _, _, _));
285368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure alarm is not set
2857ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(connection_.GetSendAlarm()->IsSet());
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2860a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) {
2861d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
28622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
28632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillOnce(
28652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(10)));
286668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SendPacket(
2867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now send non-retransmitting information, that we're not going to
28712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // retransmit 3.  The far end should stop waiting for it.
28725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame = InitAckFrame(0, 1);
28732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2874010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillOnce(
28752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(1)));
287668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2881a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) {
2882a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(ianswett): This test is unrealistic, because we would not serialize
2883a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // new data if the send algorithm said not to.
28842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
288546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CongestionBlockWrites();
288668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SendPacket(
2887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2890a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // OnCanWrite should send the packet, because it won't consult the send
2891a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // algorithm for queued packets.
2892a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  connection_.OnCanWrite();
2893a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2896a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) {
28972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All packets carry version info till version is negotiated.
28987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t payload_length;
289946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  size_t length = GetPacketLengthForOneStream(
290046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
290146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      NOT_IN_FEC_GROUP, &payload_length);
290246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length(
290346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      length);
29042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Queue the first packet.
29062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TimeUntilSend(_, _, _)).WillOnce(
29082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(10)));
29097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const string payload(payload_length, 'a');
29107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(0u,
29111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            connection_.SendStreamDataWithString(3, payload, 0,
2912f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                 !kFin, NULL).bytes_consumed);
29132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
29142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2916a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, LoopThroughSendingPackets) {
29172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All packets carry version info till version is negotiated.
29187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t payload_length;
2919cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining
2920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // packet length. The size of the offset field in a stream frame is 0 for
2921cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // offset 0, and 2 for non-zero offsets up through 16K. Increase
2922cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // max_packet_length by 2 so that subsequent packets containing subsequent
2923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // stream frames with non-zero offets will fit within the packet length.
292446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  size_t length = 2 + GetPacketLengthForOneStream(
29253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
29263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          NOT_IN_FEC_GROUP, &payload_length);
292746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length(
292846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      length);
29292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Queue the first packet.
2931010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(7);
2932cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The first stream frame will have 2 fewer overhead bytes than the other six.
2933cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const string payload(payload_length * 7 + 2, 'a');
29347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(payload.size(),
29351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            connection_.SendStreamDataWithString(1, payload, 0,
2936f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                 !kFin, NULL).bytes_consumed);
29372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2939c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_P(QuicConnectionTest, SendDelayedAck) {
294068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  QuicTime ack_time = clock_.ApproximateNow().Add(DefaultDelayedAckTime());
294168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
294268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
29435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const uint8 tag = 0x07;
29445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  connection_.SetDecrypter(new StrictTaggingDecrypter(tag),
29455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                           ENCRYPTION_INITIAL);
29465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag));
2947c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Process a packet from the non-crypto stream.
2948c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  frame1_.stream_id = 3;
29495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
29505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used
29515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // instead of ENCRYPTION_NONE.
29525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
29535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ProcessDataPacketAtLevel(1, 0, !kEntropyFlag, ENCRYPTION_INITIAL);
29545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2955c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Check if delayed ack timer is running for the expected interval.
2956c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
2957c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
2958c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Simulate delayed ack alarm firing.
2959c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  connection_.GetAckAlarm()->Fire();
2960c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Check that ack is sent and that delayed ack alarm is reset.
2961c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (version() > QUIC_VERSION_15) {
2962c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(2u, writer_->frame_count());
29630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_FALSE(writer_->stop_waiting_frames().empty());
2964c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } else {
2965c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(1u, writer_->frame_count());
2966c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
29670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
2968c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2969c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
2970c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2971c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_P(QuicConnectionTest, SendEarlyDelayedAckForCrypto) {
2972c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  QuicTime ack_time = clock_.ApproximateNow();
2973c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2974c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2975c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Process a packet from the crypto stream, which is frame1_'s default.
297668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessPacket(1);
297768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Check if delayed ack timer is running for the expected interval.
297868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
297968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
298068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Simulate delayed ack alarm firing.
298168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetAckAlarm()->Fire();
298268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Check that ack is sent and that delayed ack alarm is reset.
2983a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
2984a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(2u, writer_->frame_count());
29850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_FALSE(writer_->stop_waiting_frames().empty());
2986a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
2987a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1u, writer_->frame_count());
2988a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
29890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
299068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
299168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
299268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2993a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendDelayedAckOnSecondPacket) {
299468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
299568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessPacket(1);
299668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessPacket(2);
299768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Check that ack is sent and that delayed ack alarm is reset.
2998a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
2999a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(2u, writer_->frame_count());
30000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_FALSE(writer_->stop_waiting_frames().empty());
3001a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
3002a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1u, writer_->frame_count());
3003a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
30040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
300568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
300668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
300768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3008a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, NoAckOnOldNacks) {
30095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
30105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Drop one packet, triggering a sequence of acks.
30115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessPacket(2);
3012a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  size_t frames_per_ack = version() > QUIC_VERSION_15 ? 2 : 1;
3013a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(frames_per_ack, writer_->frame_count());
30140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
30155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->Reset();
30165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessPacket(3);
3017a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(frames_per_ack, writer_->frame_count());
30180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
30195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->Reset();
30205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessPacket(4);
3021a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(frames_per_ack, writer_->frame_count());
30220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
30235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->Reset();
30245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessPacket(5);
3025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(frames_per_ack, writer_->frame_count());
30260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
30275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->Reset();
30280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Now only set the timer on the 6th packet, instead of sending another ack.
30295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessPacket(6);
30305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, writer_->frame_count());
30315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
30325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
30335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3034a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendDelayedAckOnOutgoingPacket) {
303568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
303668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessPacket(1);
3037cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0,
3038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       !kFin, NULL);
303968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Check that ack is bundled with outgoing data and that delayed ack
304068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // alarm is reset.
3041a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
3042a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3u, writer_->frame_count());
30430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_FALSE(writer_->stop_waiting_frames().empty());
3044a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
3045a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(2u, writer_->frame_count());
3046a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
30470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
304868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
304968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
305068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3051c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_P(QuicConnectionTest, SendDelayedAckOnOutgoingCryptoPacket) {
3052f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3053f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProcessPacket(1);
3054f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, !kFin, NULL);
3055c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Check that ack is bundled with outgoing crypto data.
3056c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(version() <= QUIC_VERSION_15 ? 2u : 3u, writer_->frame_count());
30570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
3058c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
3059f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
3060f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
30616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(QuicConnectionTest, BundleAckForSecondCHLO) {
30626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
30636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
30646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(
30656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
30666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                     &TestConnection::SendCryptoStreamData)));
30676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Process a packet from the crypto stream, which is frame1_'s default.
30686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Receiving the CHLO as packet 2 first will cause the connection to
30696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // immediately send an ack, due to the packet gap.
30706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ProcessPacket(2);
30716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Check that ack is sent and that delayed ack alarm is reset.
30726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
30736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_EQ(3u, writer_->frame_count());
30746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_FALSE(writer_->stop_waiting_frames().empty());
30756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  } else {
30766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_EQ(2u, writer_->frame_count());
30776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
30786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(1u, writer_->stream_frames().size());
30796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_FALSE(writer_->ack_frames().empty());
30806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
30816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
30826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3083a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, BundleAckWithDataOnIncomingAck) {
30845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3085cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0,
3086cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       !kFin, NULL);
3087cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 3,
3088cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       !kFin, NULL);
30895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ack the second packet, which will retransmit the first packet.
30905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame ack = InitAckFrame(2, 0);
30915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(1, &ack);
3092a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
3093a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  lost_packets.insert(1);
3094a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3095a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
3096010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
30975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessAckPacket(&ack);
30985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, writer_->frame_count());
30990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->stream_frames().size());
31005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->Reset();
31015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
31025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Now ack the retransmission, which will both raise the high water mark
31035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // and see if there is more data to send.
31045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ack = InitAckFrame(3, 0);
31055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(1, &ack);
3106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(SequenceNumberSet()));
3108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
31095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessAckPacket(&ack);
31105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Check that no packet is sent and the ack alarm isn't set.
31125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0u, writer_->frame_count());
3113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
31145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->Reset();
31155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
31165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Send the same ack, but send both data and an ack together.
31175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ack = InitAckFrame(3, 0);
31185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(1, &ack);
3119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(SequenceNumberSet()));
3121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(
31225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(
31235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          &connection_,
3124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          &TestConnection::EnsureWritableAndSendStreamData5)));
31255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessAckPacket(&ack);
31265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
31275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that ack is bundled with outgoing data and the delayed ack
31285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // alarm is reset.
3129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
3130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(3u, writer_->frame_count());
31310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_FALSE(writer_->stop_waiting_frames().empty());
3132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
3133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(2u, writer_->frame_count());
3134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
31350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(writer_->ack_frames().empty());
31360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->stream_frames().size());
31375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
31385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
31395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(QuicConnectionTest, NoAckSentForClose) {
3141d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
31422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessPacket(1);
31431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, true));
3144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
31452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessClosePacket(2, 0);
31462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
31472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SendWhenDisconnected) {
31492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(connection_.connected());
31501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, false));
31512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.CloseConnection(QUIC_PEER_GOING_AWAY, false);
31522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(connection_.connected());
31532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
3154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0);
315568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.SendPacket(
3156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
31572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
31582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, PublicReset) {
31602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetPacket header;
3161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
31622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.public_header.reset_flag = true;
31632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.public_header.version_flag = false;
31642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.rejected_sequence_number = 10101;
31652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> packet(
31662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      framer_.BuildPublicResetPacket(header));
31671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PUBLIC_RESET, true));
31682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *packet);
31692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
31702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, GoAway) {
3172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
31742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame goaway;
31752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  goaway.last_good_stream_id = 1;
31762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  goaway.error_code = QUIC_PEER_GOING_AWAY;
31772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  goaway.reason_phrase = "Going away.";
31782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnGoAway(_));
31792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessGoAwayPacket(&goaway);
31802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
31812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, WindowUpdate) {
3183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicWindowUpdateFrame window_update;
3186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_update.stream_id = 3;
3187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_update.byte_offset = 1234;
3188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(visitor_, OnWindowUpdateFrames(_));
3189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ProcessFramePacket(QuicFrame(&window_update));
3190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
3191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, Blocked) {
3193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicBlockedFrame blocked;
3196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  blocked.stream_id = 3;
3197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(visitor_, OnBlockedFrames(_));
3198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ProcessFramePacket(QuicFrame(&blocked));
3199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
3200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, InvalidPacket) {
3202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(visitor_,
3203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
3204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicEncryptedPacket encrypted(NULL, 0);
3205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), encrypted);
3206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The connection close packet should have error details.
32070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_FALSE(writer_->connection_close_frames().empty());
32080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ("Unable to read public flags.",
32090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            writer_->connection_close_frames()[0].error_details);
3210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
3211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, MissingPacketsBeforeLeastUnacked) {
321368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Set the sequence number of the ack packet to be least unacked (4).
321446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(3);
3215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
3217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicStopWaitingFrame frame = InitStopWaitingFrame(4);
3218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProcessStopWaitingPacket(&frame);
3219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
3220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicAckFrame ack = InitAckFrame(0, 4);
3221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ProcessAckPacket(&ack);
3222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
32232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(outgoing_ack()->received_info.missing_packets.empty());
32242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
32252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculation) {
32275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
3228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
32292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(1, 1, kEntropyFlag);
32302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(4, 1, kEntropyFlag);
32312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(3, 1, !kEntropyFlag);
32322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(7, 1, kEntropyFlag);
32332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash);
32342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
32352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculationHalfFEC) {
32375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // FEC packets should not change the entropy hash calculation.
32385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
32395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
32405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessDataPacket(1, 1, kEntropyFlag);
32415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessFecPacket(4, 1, false, kEntropyFlag, NULL);
32425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessDataPacket(3, 3, !kEntropyFlag);
32435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProcessFecPacket(7, 3, false, kEntropyFlag, NULL);
32445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash);
32455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
32465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, UpdateEntropyForReceivedPackets) {
32485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
3249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
32502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(1, 1, kEntropyFlag);
32512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(5, 1, kEntropyFlag);
32522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(4, 1, !kEntropyFlag);
32532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(34u, outgoing_ack()->received_info.entropy_hash);
32542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make 4th packet my least unacked, and update entropy for 2, 3 packets.
325546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(5);
32562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash six_packet_entropy_hash = 0;
3257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicPacketEntropyHash kRandomEntropyHash = 129u;
3258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
3259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicStopWaitingFrame frame = InitStopWaitingFrame(4);
3260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    frame.entropy_hash = kRandomEntropyHash;
3261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (ProcessStopWaitingPacket(&frame)) {
3262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      six_packet_entropy_hash = 1 << 6;
3263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
3264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
3265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicAckFrame ack = InitAckFrame(0, 4);
3266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ack.sent_info.entropy_hash = kRandomEntropyHash;
3267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (ProcessAckPacket(&ack)) {
3268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      six_packet_entropy_hash = 1 << 6;
3269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
32703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
32712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ((kRandomEntropyHash + (1 << 5) + six_packet_entropy_hash),
32732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            outgoing_ack()->received_info.entropy_hash);
32742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
32752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, UpdateEntropyHashUptoCurrentPacket) {
32775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
3278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
32792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(1, 1, kEntropyFlag);
32802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(5, 1, !kEntropyFlag);
32812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(22, 1, kEntropyFlag);
32822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(66u, outgoing_ack()->received_info.entropy_hash);
328346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(22);
32842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash kRandomEntropyHash = 85u;
32852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Current packet is the least unacked packet.
3286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicPacketEntropyHash ack_entropy_hash;
3287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (version() > QUIC_VERSION_15) {
3288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicStopWaitingFrame frame = InitStopWaitingFrame(23);
3289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    frame.entropy_hash = kRandomEntropyHash;
3290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ack_entropy_hash = ProcessStopWaitingPacket(&frame);
3291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
3292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicAckFrame ack = InitAckFrame(0, 23);
3293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ack.sent_info.entropy_hash = kRandomEntropyHash;
3294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ack_entropy_hash = ProcessAckPacket(&ack);
3295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
32962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ((kRandomEntropyHash + ack_entropy_hash),
32972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            outgoing_ack()->received_info.entropy_hash);
32982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(25, 1, kEntropyFlag);
32992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ((kRandomEntropyHash + ack_entropy_hash + (1 << (25 % 8))),
33002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            outgoing_ack()->received_info.entropy_hash);
33012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
33022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, EntropyCalculationForTruncatedAck) {
33045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
3305d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
33062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy[51];
33072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  entropy[0] = 0;
33082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 1; i < 51; ++i) {
3309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool should_send = i % 10 != 1;
33102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool entropy_flag = (i & (i - 1)) != 0;
33112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!should_send) {
33122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entropy[i] = entropy[i - 1];
33132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
33142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
33152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (entropy_flag) {
33162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entropy[i] = entropy[i - 1] ^ (1 << (i % 8));
33172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
33182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entropy[i] = entropy[i - 1];
33192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
33202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProcessDataPacket(i, 1, entropy_flag);
33212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
33222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 1; i < 50; ++i) {
33232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(entropy[i], QuicConnectionPeer::ReceivedEntropyHash(
33242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &connection_, i));
33252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
33262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
33272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, CheckSentEntropyHash) {
332946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  peer_creator_.set_sequence_number(1);
33302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet missing_packets;
33312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash = 0;
33322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber max_sequence_number = 51;
33332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (QuicPacketSequenceNumber i = 1; i <= max_sequence_number; ++i) {
33342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool is_missing = i % 10 != 0;
33352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool entropy_flag = (i & (i - 1)) != 0;
33362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketEntropyHash packet_entropy_hash = 0;
33372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (entropy_flag) {
33382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      packet_entropy_hash = 1 << (i % 8);
33392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
33402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacket* packet = ConstructDataPacket(i, 0, entropy_flag);
334168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    connection_.SendPacket(
3342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ENCRYPTION_NONE, i, packet, packet_entropy_hash,
3343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        HAS_RETRANSMITTABLE_DATA);
33442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (is_missing)  {
33462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      missing_packets.insert(i);
33472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
33482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
33492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entropy_hash ^= packet_entropy_hash;
33512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
33522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(QuicConnectionPeer::IsValidEntropy(
33532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, max_sequence_number, missing_packets, entropy_hash))
33542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << "";
33552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
33562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacket) {
3358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  connection_.SetSupportedVersions(QuicSupportedVersions());
3359558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
33602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketHeader header;
3362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
33632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.public_header.reset_flag = false;
33642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.public_header.version_flag = true;
33652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.entropy_flag = false;
33662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.fec_flag = false;
33672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.packet_sequence_number = 12;
33682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.fec_group = 0;
33692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicFrames frames;
33712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicFrame frame(&frame1_);
33722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frames.push_back(frame);
33732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicPacket> packet(
337446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer_, header, frames).packet);
3375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> encrypted(
3376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
33772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  framer_.set_version(version());
33792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.set_is_server(true);
33802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
33811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(writer_->version_negotiation_packet() != NULL);
3382558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
3383558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  size_t num_versions = arraysize(kSupportedQuicVersions);
3384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(num_versions,
33851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            writer_->version_negotiation_packet()->versions.size());
3386558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
3387558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // We expect all versions in kSupportedQuicVersions to be
3388558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // included in the packet.
3389558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  for (size_t i = 0; i < num_versions; ++i) {
3390558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_EQ(kSupportedQuicVersions[i],
33911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              writer_->version_negotiation_packet()->versions[i]);
3392558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
33932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
33942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacketSocketBlocked) {
3396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  connection_.SetSupportedVersions(QuicSupportedVersions());
33974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
33984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
33994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  QuicPacketHeader header;
3400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
34014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  header.public_header.reset_flag = false;
34024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  header.public_header.version_flag = true;
34034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  header.entropy_flag = false;
34044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  header.fec_flag = false;
34054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  header.packet_sequence_number = 12;
34064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  header.fec_group = 0;
34074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
34084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  QuicFrames frames;
34094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  QuicFrame frame(&frame1_);
34104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  frames.push_back(frame);
34114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<QuicPacket> packet(
341246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer_, header, frames).packet);
34134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> encrypted(
34144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
34154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  framer_.set_version(version());
34174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  connection_.set_is_server(true);
34185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
34194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
34201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(0u, writer_->last_packet_size());
34214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(connection_.HasQueuedData());
34224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
34235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  writer_->SetWritable();
34244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  connection_.OnCanWrite();
34251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(writer_->version_negotiation_packet() != NULL);
34264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
34274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t num_versions = arraysize(kSupportedQuicVersions);
3428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(num_versions,
34291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            writer_->version_negotiation_packet()->versions.size());
34304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
34314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We expect all versions in kSupportedQuicVersions to be
34324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // included in the packet.
34334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (size_t i = 0; i < num_versions; ++i) {
34344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(kSupportedQuicVersions[i],
34351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              writer_->version_negotiation_packet()->versions[i]);
34364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
34374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
34384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest,
34401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       ServerSendsVersionNegotiationPacketSocketBlockedDataBuffered) {
3441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  connection_.SetSupportedVersions(QuicSupportedVersions());
34421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
34431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
34441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  QuicPacketHeader header;
3445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
34461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  header.public_header.reset_flag = false;
34471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  header.public_header.version_flag = true;
34481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  header.entropy_flag = false;
34491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  header.fec_flag = false;
34501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  header.packet_sequence_number = 12;
34511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  header.fec_group = 0;
34521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
34531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  QuicFrames frames;
34541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  QuicFrame frame(&frame1_);
34551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  frames.push_back(frame);
34561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<QuicPacket> packet(
345746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer_, header, frames).packet);
34581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> encrypted(
34591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
34601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  framer_.set_version(version());
34621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  connection_.set_is_server(true);
34635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
34641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  writer_->set_is_write_blocked_data_buffered(true);
34651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
34661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(0u, writer_->last_packet_size());
34671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(connection_.HasQueuedData());
34681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
34691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ClientHandlesVersionNegotiation) {
3471ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Start out with some unsupported version.
3472ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  QuicConnectionPeer::GetFramer(&connection_)->set_version_for_tests(
3473ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      QUIC_VERSION_UNSUPPORTED);
3474ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3475ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  QuicPacketHeader header;
3476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
3477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.public_header.reset_flag = false;
3478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.public_header.version_flag = true;
3479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.entropy_flag = false;
3480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.fec_flag = false;
3481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.packet_sequence_number = 12;
3482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.fec_group = 0;
3483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  QuicVersionVector supported_versions;
3485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
3486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    supported_versions.push_back(kSupportedQuicVersions[i]);
3487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
3488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3489ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Send a version negotiation packet.
3490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<QuicEncryptedPacket> encrypted(
3491ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      framer_.BuildVersionNegotiationPacket(
3492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          header.public_header, supported_versions));
3493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Now force another packet.  The connection should transition into
3496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // NEGOTIATED_VERSION state and tell the packet creator to StopSendingVersion.
3497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.public_header.version_flag = false;
3498ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  QuicFrames frames;
3499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  QuicFrame frame(&frame1_);
3500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  frames.push_back(frame);
3501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<QuicPacket> packet(
350246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer_, header, frames).packet);
3503ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  encrypted.reset(framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
3504d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
3505d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3506ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3507ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3508ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_FALSE(QuicPacketCreatorPeer::SendVersionInPacket(
3509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      QuicConnectionPeer::GetPacketCreator(&connection_)));
3510ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
3511ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, BadVersionNegotiation) {
3513ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  QuicPacketHeader header;
3514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
3515ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.public_header.reset_flag = false;
3516ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.public_header.version_flag = true;
3517ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.entropy_flag = false;
3518ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.fec_flag = false;
3519ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.packet_sequence_number = 12;
3520ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  header.fec_group = 0;
3521ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  QuicVersionVector supported_versions;
3523ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
3524ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    supported_versions.push_back(kSupportedQuicVersions[i]);
3525ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
3526ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3527ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Send a version negotiation packet with the version the client started with.
3528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // It should be rejected.
35291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(visitor_,
35301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              OnConnectionClosed(QUIC_INVALID_VERSION_NEGOTIATION_PACKET,
35311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                 false));
3532ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<QuicEncryptedPacket> encrypted(
3533ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      framer_.BuildVersionNegotiationPacket(
3534ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          header.public_header, supported_versions));
3535ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3536ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
3537ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, CheckSendStats) {
3539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
3540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(3, "first", 0, !kFin, NULL);
35410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  size_t first_packet_size = writer_->last_packet_size();
35422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
3544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(5, "second", 0, !kFin, NULL);
35450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  size_t second_packet_size = writer_->last_packet_size();
35462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 2 retransmissions due to rto, 1 due to explicit nack.
35485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
3549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
35502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retransmit due to RTO.
35522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
355368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
35542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
355568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Retransmit due to explicit nacks.
35565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame nack_three = InitAckFrame(4, 0);
35575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(3, &nack_three);
35585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(1, &nack_three);
3559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
3560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  lost_packets.insert(1);
3561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  lost_packets.insert(3);
3562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
3564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).Times(2);
3566d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ProcessAckPacket(&nack_three);
35682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(
35702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Return(QuicBandwidth::Zero()));
35712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicConnectionStats& stats = connection_.GetStats();
3573ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize,
3574ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            stats.bytes_sent);
3575ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(5u, stats.packets_sent);
35762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize,
35772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            stats.bytes_retransmitted);
35782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, stats.packets_retransmitted);
357968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, stats.rto_count);
35802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
35812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, CheckReceiveStats) {
3583d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3584d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
35852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t received_bytes = 0;
35862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  received_bytes += ProcessFecProtectedPacket(1, false, !kEntropyFlag);
35872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  received_bytes += ProcessFecProtectedPacket(3, false, !kEntropyFlag);
35882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Should be counted against dropped packets.
35892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  received_bytes += ProcessDataPacket(3, 1, !kEntropyFlag);
359058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  received_bytes += ProcessFecPacket(4, 1, true, !kEntropyFlag, NULL);
35912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(
35932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Return(QuicBandwidth::Zero()));
35942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicConnectionStats& stats = connection_.GetStats();
35962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(received_bytes, stats.bytes_received);
35972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4u, stats.packets_received);
35982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, stats.packets_revived);
36002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, stats.packets_dropped);
36012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
36022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, TestFecGroupLimits) {
360468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Create and return a group for 1.
360590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 1) != NULL);
360690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
360768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Create and return a group for 2.
360890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) != NULL);
360990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
361090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create and return a group for 4.  This should remove 1 but not 2.
361190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 4) != NULL);
361290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 1) == NULL);
361390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) != NULL);
361490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
361590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create and return a group for 3.  This will kill off 2.
361690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 3) != NULL);
361790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) == NULL);
361890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
361990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Verify that adding 5 kills off 3, despite 4 being created before 3.
362090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 5) != NULL);
362190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 4) != NULL);
362290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 3) == NULL);
362390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
362490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ProcessFramesIfPacketClosedConnection) {
362690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Construct a packet with stream frame and connection close frame.
3627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header_.public_header.connection_id = connection_id_;
362890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.packet_sequence_number = 1;
362990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.public_header.reset_flag = false;
363090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.public_header.version_flag = false;
363190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.entropy_flag = false;
363290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.fec_flag = false;
363390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.fec_group = 0;
363490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
363590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicConnectionCloseFrame qccf;
363690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  qccf.error_code = QUIC_PEER_GOING_AWAY;
363790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicFrame close_frame(&qccf);
363890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicFrame stream_frame(&frame1_);
363990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
364090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicFrames frames;
364190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  frames.push_back(stream_frame);
364290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  frames.push_back(close_frame);
364390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<QuicPacket> packet(
364446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer_, header_, frames).packet);
364590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(NULL != packet.get());
364690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
364790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ENCRYPTION_NONE, 1, *packet));
364890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
36491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, true));
36505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
3651d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
365290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
365390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
365490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
365590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, SelectMutualVersion) {
3657a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  connection_.SetSupportedVersions(QuicSupportedVersions());
3658c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // Set the connection to speak the lowest quic version.
3659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.set_version(QuicVersionMin());
3660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(QuicVersionMin(), connection_.version());
36612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
36622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Pass in available versions which includes a higher mutually supported
36632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // version.  The higher mutually supported version should be selected.
3664c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  QuicVersionVector supported_versions;
3665c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
3666c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    supported_versions.push_back(kSupportedQuicVersions[i]);
3667c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  }
3668c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(connection_.SelectMutualVersion(supported_versions));
3669c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_EQ(QuicVersionMax(), connection_.version());
3670c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
3671c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // Expect that the lowest version is selected.
3672c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // Ensure the lowest supported version is less than the max, unless they're
3673c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // the same.
3674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_LE(QuicVersionMin(), QuicVersionMax());
3675c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  QuicVersionVector lowest_version_vector;
3676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  lowest_version_vector.push_back(QuicVersionMin());
3677c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(connection_.SelectMutualVersion(lowest_version_vector));
3678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(QuicVersionMin(), connection_.version());
36792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
36802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Shouldn't be able to find a mutually supported version.
36812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  QuicVersionVector unsupported_version;
36822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  unsupported_version.push_back(QUIC_VERSION_UNSUPPORTED);
36832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_FALSE(connection_.SelectMutualVersion(unsupported_version));
36842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
3685558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
3686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ConnectionCloseWhenWritable) {
36875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(writer_->IsWriteBlocked());
3688a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
36895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Send a packet.
3690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3691a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
36921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(1u, writer_->packets_write_attempts());
3693a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
36945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TriggerConnectionClose();
36951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(2u, writer_->packets_write_attempts());
3696a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
3697a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ConnectionCloseGettingWriteBlocked) {
36995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
37005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TriggerConnectionClose();
37015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, writer_->packets_write_attempts());
37025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(writer_->IsWriteBlocked());
37035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3704a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) {
37065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BlockOnNextWrite();
3707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3708a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
37091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(1u, writer_->packets_write_attempts());
37105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(writer_->IsWriteBlocked());
37115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TriggerConnectionClose();
37121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(1u, writer_->packets_write_attempts());
3713a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
3714a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, AckNotifierTriggerCallback) {
3716d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3717d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
371858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Create a delegate which we expect to be called.
37195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
37200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*delegate, OnAckNotification(_, _, _, _, _)).Times(1);
372158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
372258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Send some data, which will register the delegate to be notified.
37235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
372458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
372558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Process an ACK from the server which should trigger the callback.
3726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
37275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame = InitAckFrame(1, 0);
372868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
372958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
373058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, AckNotifierFailToTriggerCallback) {
3732d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3733d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
373458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Create a delegate which we don't expect to be called.
37355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
37360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*delegate, OnAckNotification(_, _, _, _, _)).Times(0);
373758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
373858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Send some data, which will register the delegate to be notified. This will
373958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // not be ACKed and so the delegate should never be called.
37405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
374158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
374258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Send some other data which we will ACK.
3743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  connection_.SendStreamDataWithString(1, "bar", 0, !kFin, NULL);
374558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
374658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Now we receive ACK for packets 2 and 3, but importantly missing packet 1
374758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // which we registered to be notified about.
37485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame = InitAckFrame(3, 0);
37495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(1, &frame);
3750a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
3751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  lost_packets.insert(1);
3752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
3754010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
375568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
375658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
375758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) {
3759d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3760d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
376158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Create a delegate which we expect to be called.
37625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
37630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*delegate, OnAckNotification(_, _, _, _, _)).Times(1);
376458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
376558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Send four packets, and register to be notified on ACK of packet 2.
37665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
37675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(3, "bar", 0, !kFin, delegate.get());
37685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(3, "baz", 0, !kFin, NULL);
37695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(3, "qux", 0, !kFin, NULL);
377058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Now we receive ACK for packets 1, 3, and 4 and lose 2.
37725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame frame = InitAckFrame(4, 0);
37735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NackPacket(2, &frame);
3774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SequenceNumberSet lost_packets;
3775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  lost_packets.insert(2);
3776a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3777a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(Return(lost_packets));
3778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
378068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&frame);
378158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
378258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Now we get an ACK for packet 5 (retransmitted packet 2), which should
378358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // trigger the callback.
3784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillRepeatedly(Return(SequenceNumberSet()));
3786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
37875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame second_ack_frame = InitAckFrame(5, 0);
378868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProcessAckPacket(&second_ack_frame);
378958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
379058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
379123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// AckNotifierCallback is triggered by the ack of a packet that timed
379223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// out and was retransmitted, even though the retransmission has a
379323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// different sequence number.
379423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_P(QuicConnectionTest, AckNotifierCallbackForAckAfterRTO) {
379523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  InSequence s;
379623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
379723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Create a delegate which we expect to be called.
379823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<MockAckNotifierDelegate> delegate(
379923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new StrictMock<MockAckNotifierDelegate>);
380023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
380123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
380223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      DefaultRetransmissionTime());
380323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  connection_.SendStreamDataWithString(3, "foo", 0, !kFin, delegate.get());
380423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(1u, outgoing_ack()->sent_info.least_unacked);
380523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
38060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, writer_->header().packet_sequence_number);
380723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(default_retransmission_time,
380823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            connection_.GetRetransmissionAlarm()->deadline());
380923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Simulate the retransmission alarm firing.
381023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  clock_.AdvanceTime(DefaultRetransmissionTime());
381123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
3812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _));
381323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  connection_.GetRetransmissionAlarm()->Fire();
38140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(2u, writer_->header().packet_sequence_number);
381523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // We do not raise the high water mark yet.
381623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(1u, outgoing_ack()->sent_info.least_unacked);
381723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
381823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Ack the original packet.
381923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
38200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*delegate, OnAckNotification(1, _, 1, _, _));
3821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
382223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  QuicAckFrame ack_frame = InitAckFrame(1, 0);
382323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ProcessAckPacket(&ack_frame);
382423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
382523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Delegate is not notified again when the retransmit is acked.
3826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
382723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  QuicAckFrame second_ack_frame = InitAckFrame(2, 0);
382823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ProcessAckPacket(&second_ack_frame);
382923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
383023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
383123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// AckNotifierCallback is triggered by the ack of a packet that was
383223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// previously nacked, even though the retransmission has a different
383323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// sequence number.
383423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_P(QuicConnectionTest, AckNotifierCallbackForAckOfNackedPacket) {
383523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  InSequence s;
383623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
383723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Create a delegate which we expect to be called.
383823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<MockAckNotifierDelegate> delegate(
383923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new StrictMock<MockAckNotifierDelegate>);
384023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
384123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Send four packets, and register to be notified on ACK of packet 2.
384223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
384323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  connection_.SendStreamDataWithString(3, "bar", 0, !kFin, delegate.get());
384423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  connection_.SendStreamDataWithString(3, "baz", 0, !kFin, NULL);
384523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  connection_.SendStreamDataWithString(3, "qux", 0, !kFin, NULL);
384623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
384723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Now we receive ACK for packets 1, 3, and 4 and lose 2.
384823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  QuicAckFrame frame = InitAckFrame(4, 0);
384923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  NackPacket(2, &frame);
385023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SequenceNumberSet lost_packets;
385123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  lost_packets.insert(2);
385223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
385323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
385423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      .WillOnce(Return(lost_packets));
3855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
385723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ProcessAckPacket(&frame);
385823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
385923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Now we get an ACK for packet 2, which was previously nacked.
386023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SequenceNumberSet no_lost_packets;
38610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*delegate, OnAckNotification(1, _, 1, _, _));
386223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
386323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      .WillOnce(Return(no_lost_packets));
386423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  QuicAckFrame second_ack_frame = InitAckFrame(4, 0);
386523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ProcessAckPacket(&second_ack_frame);
386623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
386723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Verify that the delegate is not notified again when the
386823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // retransmit is acked.
386923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
387023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      .WillOnce(Return(no_lost_packets));
3871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
387223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  QuicAckFrame third_ack_frame = InitAckFrame(5, 0);
387323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ProcessAckPacket(&third_ack_frame);
387423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
387523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
38760529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_P(QuicConnectionTest, AckNotifierFECTriggerCallback) {
38770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
38780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
38790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Create a delegate which we expect to be called.
38800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_refptr<MockAckNotifierDelegate> delegate(
38810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      new MockAckNotifierDelegate);
38825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(*delegate, OnAckNotification(_, _, _, _, _)).Times(1);
38830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
38840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Send some data, which will register the delegate to be notified.
38850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
38860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  connection_.SendStreamDataWithString(2, "bar", 0, !kFin, NULL);
38870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
38880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Process an ACK from the server with a revived packet, which should trigger
38890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // the callback.
3890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
38910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  QuicAckFrame frame = InitAckFrame(2, 0);
38920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  NackPacket(1, &frame);
38930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  frame.received_info.revived_packets.insert(1);
38940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ProcessAckPacket(&frame);
38950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // If the ack is processed again, the notifier should not be called again.
38960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ProcessAckPacket(&frame);
38970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
38980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3899a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) {
3900d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3901a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite());
390258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
390358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Create a delegate which we expect to be called.
39045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
39050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*delegate, OnAckNotification(_, _, _, _, _)).Times(1);
390658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
390758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Expect ACKs for 1 packet.
3908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
390958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
391058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Send one packet, and register to be notified on ACK.
39115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
391258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
391358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Ack packet gets dropped, but we receive an FEC packet that covers it.
391458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Should recover the Ack packet and trigger the notification callback.
391558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  QuicFrames frames;
391658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
39175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicAckFrame ack_frame = InitAckFrame(1, 0);
391858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  frames.push_back(QuicFrame(&ack_frame));
391958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
392058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Dummy stream frame to satisfy expectations set elsewhere.
3921d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  frames.push_back(QuicFrame(&frame1_));
392258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
392358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  QuicPacketHeader ack_header;
3924a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ack_header.public_header.connection_id = connection_id_;
392558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ack_header.public_header.reset_flag = false;
392658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ack_header.public_header.version_flag = false;
392758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ack_header.entropy_flag = !kEntropyFlag;
392858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ack_header.fec_flag = true;
39290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ack_header.packet_sequence_number = 1;
393058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ack_header.is_in_fec_group = IN_FEC_GROUP;
393158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ack_header.fec_group = 1;
393258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
393358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  QuicPacket* packet =
393446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer_, ack_header, frames).packet;
393558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
393658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Take the packet which contains the ACK frame, and construct and deliver an
393758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // FEC packet which allows the ACK packet to be recovered.
393858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ProcessFecPacket(2, 1, true, !kEntropyFlag, packet);
393958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
394058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
39413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class MockQuicConnectionDebugVisitor
394246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : public QuicConnectionDebugVisitor {
39433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
39443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD1(OnFrameAddedToPacket,
39453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(const QuicFrame&));
39463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3947a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MOCK_METHOD5(OnPacketSent,
39483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(QuicPacketSequenceNumber,
39493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    EncryptionLevel,
3950a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    TransmissionType,
39513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const QuicEncryptedPacket&,
39524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    WriteResult));
39533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD2(OnPacketRetransmitted,
39553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(QuicPacketSequenceNumber,
39563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    QuicPacketSequenceNumber));
39573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD3(OnPacketReceived,
39593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(const IPEndPoint&,
39603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const IPEndPoint&,
39613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const QuicEncryptedPacket&));
39623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD1(OnProtocolVersionMismatch,
39643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(QuicVersion));
39653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD1(OnPacketHeader,
39673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(const QuicPacketHeader& header));
39683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD1(OnStreamFrame,
39703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(const QuicStreamFrame&));
39713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD1(OnAckFrame,
39733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(const QuicAckFrame& frame));
39743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD1(OnCongestionFeedbackFrame,
39763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(const QuicCongestionFeedbackFrame&));
39773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3978a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MOCK_METHOD1(OnStopWaitingFrame,
3979a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               void(const QuicStopWaitingFrame&));
3980a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
39813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD1(OnRstStreamFrame,
39823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(const QuicRstStreamFrame&));
39833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD1(OnConnectionCloseFrame,
39853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(const QuicConnectionCloseFrame&));
39863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD1(OnPublicResetPacket,
39883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(const QuicPublicResetPacket&));
39893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD1(OnVersionNegotiationPacket,
39913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(const QuicVersionNegotiationPacket&));
39923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
39933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MOCK_METHOD2(OnRevivedPacket,
39943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)               void(const QuicPacketHeader&, StringPiece payload));
39953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
39963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3997a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, OnPacketHeaderDebugVisitor) {
39983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  QuicPacketHeader header;
39993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
40003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<MockQuicConnectionDebugVisitor>
40013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      debug_visitor(new StrictMock<MockQuicConnectionDebugVisitor>);
40023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  connection_.set_debug_visitor(debug_visitor.get());
40033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1);
40043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  connection_.OnPacketHeader(header);
40053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
40063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4007a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, Pacing) {
4008f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ValueRestore<bool> old_flag(&FLAGS_enable_quic_pacing, true);
4009f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4010a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TestConnection server(connection_id_, IPEndPoint(), helper_.get(),
4011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        writer_.get(), true, version());
4012a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TestConnection client(connection_id_, IPEndPoint(), helper_.get(),
4013cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        writer_.get(), false, version());
4014a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(client.sent_packet_manager().using_pacing());
4015a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(server.sent_packet_manager().using_pacing());
4016f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
4017f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4018a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicConnectionTest, ControlFramesInstigateAcks) {
4019a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
4020a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4021a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Send a WINDOW_UPDATE frame.
4022a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicWindowUpdateFrame window_update;
4023a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_update.stream_id = 3;
4024a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window_update.byte_offset = 1234;
4025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(visitor_, OnWindowUpdateFrames(_));
4026a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ProcessFramePacket(QuicFrame(&window_update));
4027a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4028a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Ensure that this has caused the ACK alarm to be set.
4029a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_);
4030a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(ack_alarm->IsSet());
4031a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4032a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Cancel alarm, and try again with BLOCKED frame.
4033a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ack_alarm->Cancel();
4034a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicBlockedFrame blocked;
4035a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  blocked.stream_id = 3;
4036a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(visitor_, OnBlockedFrames(_));
4037a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ProcessFramePacket(QuicFrame(&blocked));
4038a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(ack_alarm->IsSet());
4039a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
4040a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
4044