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"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/congestion_control/receive_algorithm_interface.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/congestion_control/send_algorithm_interface.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/crypto/null_encrypter.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/quic_decrypter.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/quic_encrypter.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/quic_random.h"
16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "net/quic/quic_protocol.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/quic/quic_utils.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/test_tools/mock_clock.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/mock_random.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/quic_connection_peer.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/quic_framer_peer.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/quic_packet_creator_peer.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/test_tools/quic_test_utils.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::StringPiece;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::map;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using std::vector;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::AnyNumber;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Between;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ContainerEq;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::DoAll;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::InSequence;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::InvokeWithoutArgs;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::StrictMock;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::SaveArg;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char data1[] = "foo";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char data2[] = "bar";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const bool kFin = true;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const bool kEntropyFlag = true;
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicPacketEntropyHash kTestEntropyHash = 76;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestReceiveAlgorithm : public ReceiveAlgorithmInterface {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit TestReceiveAlgorithm(QuicCongestionFeedbackFrame* feedback)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : feedback_(feedback) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GenerateCongestionFeedback(
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicCongestionFeedbackFrame* congestion_feedback) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (feedback_ == NULL) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *congestion_feedback = *feedback_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD4(RecordIncomingPacket,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               void(QuicByteCount, QuicPacketSequenceNumber, QuicTime, bool));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCongestionFeedbackFrame* feedback_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestReceiveAlgorithm);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message.
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TaggingEncrypter : public QuicEncrypter {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit TaggingEncrypter(uint8 tag)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : tag_(tag) {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~TaggingEncrypter() {}
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // QuicEncrypter interface.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool SetKey(StringPiece key) OVERRIDE { return true; }
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE {
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Encrypt(StringPiece nonce,
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       StringPiece associated_data,
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       StringPiece plaintext,
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       unsigned char* output) OVERRIDE {
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memcpy(output, plaintext.data(), plaintext.size());
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    output += plaintext.size();
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memset(output, tag_, kTagSize);
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number,
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  StringPiece associated_data,
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  StringPiece plaintext) OVERRIDE {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const size_t len = plaintext.size() + kTagSize;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint8* buffer = new uint8[len];
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Encrypt(StringPiece(), associated_data, plaintext, buffer);
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return new QuicData(reinterpret_cast<char*>(buffer), len, true);
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual size_t GetKeySize() const OVERRIDE { return 0; }
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual size_t GetNoncePrefixSize() const OVERRIDE { return 0; }
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual size_t GetMaxPlaintextSize(size_t ciphertext_size) const OVERRIDE {
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return ciphertext_size - kTagSize;
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual size_t GetCiphertextSize(size_t plaintext_size) const OVERRIDE {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return plaintext_size + kTagSize;
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual StringPiece GetKey() const OVERRIDE {
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return StringPiece();
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual StringPiece GetNoncePrefix() const OVERRIDE {
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return StringPiece();
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum {
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    kTagSize = 12,
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const uint8 tag_;
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// TaggingDecrypter ensures that the final kTagSize bytes of the message all
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// have the same value and then removes them.
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TaggingDecrypter : public QuicDecrypter {
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~TaggingDecrypter() {}
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // QuicDecrypter interface
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool SetKey(StringPiece key) OVERRIDE { return true; }
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE {
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool Decrypt(StringPiece nonce,
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       StringPiece associated_data,
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       StringPiece ciphertext,
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       unsigned char* output,
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       size_t* output_length) OVERRIDE {
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (ciphertext.size() < kTagSize) {
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!CheckTag(ciphertext, GetTag(ciphertext))) {
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *output_length = ciphertext.size() - kTagSize;
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memcpy(output, ciphertext.data(), *output_length);
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number,
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  StringPiece associated_data,
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  StringPiece ciphertext) OVERRIDE {
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (ciphertext.size() < kTagSize) {
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return NULL;
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!CheckTag(ciphertext, GetTag(ciphertext))) {
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return NULL;
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const size_t len = ciphertext.size() - kTagSize;
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint8* buf = new uint8[len];
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memcpy(buf, ciphertext.data(), len);
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return new QuicData(reinterpret_cast<char*>(buf), len,
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        true /* owns buffer */);
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual StringPiece GetKey() const OVERRIDE { return StringPiece(); }
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual StringPiece GetNoncePrefix() const OVERRIDE { return StringPiece(); }
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual uint8 GetTag(StringPiece ciphertext) {
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return ciphertext.data()[ciphertext.size()-1];
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum {
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    kTagSize = 12,
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool CheckTag(StringPiece ciphertext, uint8 tag) {
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (size_t i = ciphertext.size() - kTagSize; i < ciphertext.size(); i++) {
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (ciphertext.data()[i] != tag) {
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return false;
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// StringTaggingDecrypter ensures that the final kTagSize bytes of the message
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// match the expected value.
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class StrictTaggingDecrypter : public TaggingDecrypter {
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  explicit StrictTaggingDecrypter(uint8 tag) : tag_(tag) {}
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~StrictTaggingDecrypter() {}
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // TaggingQuicDecrypter
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual uint8 GetTag(StringPiece ciphertext) OVERRIDE {
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return tag_;
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const uint8 tag_;
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestConnectionHelper : public QuicConnectionHelperInterface {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  class TestAlarm : public QuicAlarm {
2254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch   public:
2264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    explicit TestAlarm(QuicAlarm::Delegate* delegate)
2274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        : QuicAlarm(delegate) {
2284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    }
2294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
2304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    virtual void SetImpl() OVERRIDE {}
2314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    virtual void CancelImpl() OVERRIDE {}
2324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  };
2334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestConnectionHelper(MockClock* clock, MockRandom* random_generator)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : clock_(clock),
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        random_generator_(random_generator),
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        blocked_(false),
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        is_server_(true),
239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        use_tagging_decrypter_(false),
240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        packets_write_attempts_(0) {
2414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // QuicConnectionHelperInterface
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetConnection(QuicConnection* connection) OVERRIDE {}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const QuicClock* GetClock() const OVERRIDE {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return clock_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual QuicRandom* GetRandomGenerator() OVERRIDE {
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return random_generator_;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int WritePacketToWire(const QuicEncryptedPacket& packet,
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                int* error) OVERRIDE {
257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ++packets_write_attempts_;
258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (packet.length() >= sizeof(final_bytes_of_last_packet_)) {
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      memcpy(&final_bytes_of_last_packet_, packet.data() + packet.length() - 4,
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             sizeof(final_bytes_of_last_packet_));
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
264558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    QuicFramer framer(QuicVersionMax(), QuicTime::Zero(), is_server_);
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (use_tagging_decrypter_) {
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      framer.SetDecrypter(new TaggingDecrypter);
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FramerVisitorCapturingFrames visitor;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    framer.set_visitor(&visitor);
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(framer.ProcessPacket(packet));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    header_ = *visitor.header();
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame_count_ = visitor.frame_count();
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (visitor.ack()) {
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ack_.reset(new QuicAckFrame(*visitor.ack()));
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (visitor.feedback()) {
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      feedback_.reset(new QuicCongestionFeedbackFrame(*visitor.feedback()));
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (visitor.stream_frames() != NULL && !visitor.stream_frames()->empty()) {
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      stream_frames_ = *visitor.stream_frames();
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (visitor.version_negotiation_packet() != NULL) {
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          *visitor.version_negotiation_packet()));
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (blocked_) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *error = ERR_IO_PENDING;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return -1;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *error = 0;
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_packet_size_ = packet.length();
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return last_packet_size_;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsWriteBlockedDataBuffered() OVERRIDE {
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsWriteBlocked(int error) OVERRIDE {
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return error == ERR_IO_PENDING;
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) OVERRIDE {
3044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    return new TestAlarm(delegate);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketHeader* header() { return &header_; }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t frame_count() const { return frame_count_; }
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame* ack() { return ack_.get(); }
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCongestionFeedbackFrame* feedback() { return feedback_.get(); }
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const vector<QuicStreamFrame>* stream_frames() const {
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return &stream_frames_;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t last_packet_size() {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return last_packet_size_;
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicVersionNegotiationPacket* version_negotiation_packet() {
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return version_negotiation_packet_.get();
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_blocked(bool blocked) { blocked_ = blocked; }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_is_server(bool is_server) { is_server_ = is_server; }
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // final_bytes_of_last_packet_ returns the last four bytes of the previous
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // packet as a little-endian, uint32. This is intended to be used with a
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TaggingEncrypter so that tests can determine which encrypter was used for
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // a given packet.
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32 final_bytes_of_last_packet() { return final_bytes_of_last_packet_; }
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void use_tagging_decrypter() {
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    use_tagging_decrypter_ = true;
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
341a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  uint32 packets_write_attempts() { return packets_write_attempts_; }
342a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockClock* clock_;
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockRandom* random_generator_;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketHeader header_;
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t frame_count_;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicAckFrame> ack_;
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicCongestionFeedbackFrame> feedback_;
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  vector<QuicStreamFrame> stream_frames_;
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t last_packet_size_;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool blocked_;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_server_;
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32 final_bytes_of_last_packet_;
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool use_tagging_decrypter_;
357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  uint32 packets_write_attempts_;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestConnection : public QuicConnection {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestConnection(QuicGuid guid,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 IPEndPoint address,
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 TestConnectionHelper* helper,
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 bool is_server)
368558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      : QuicConnection(guid, address, helper, is_server, QuicVersionMax()),
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        helper_(helper) {
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    helper_->set_is_server(!is_server);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendAck() {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicConnectionPeer::SendAck(this);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetReceiveAlgorithm(TestReceiveAlgorithm* receive_algorithm) {
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) {
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicConsumedData SendStreamData1() {
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return SendStreamData(1u, "food", 0, !kFin);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicConsumedData SendStreamData2() {
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return SendStreamData(2u, "food2", 0, !kFin);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_server() {
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return QuicConnectionPeer::IsServer(this);
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
397558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void set_version(QuicVersion version) {
398558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    framer_.set_version(version);
399558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
400558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_is_server(bool is_server) {
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    helper_->set_is_server(!is_server);
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QuicPacketCreatorPeer::SetIsServer(
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        QuicConnectionPeer::GetPacketCreator(this), is_server);
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicConnectionPeer::SetIsServer(this, is_server);
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicAlarm* GetAckAlarm() {
4094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    return QuicConnectionPeer::GetAckAlarm(this);
4104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
4114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicAlarm* GetRetransmissionAlarm() {
4134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    return QuicConnectionPeer::GetRetransmissionAlarm(this);
4144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
4154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicAlarm* GetSendAlarm() {
4174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    return QuicConnectionPeer::GetSendAlarm(this);
4184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
4194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicAlarm* GetTimeoutAlarm() {
4214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    return QuicConnectionPeer::GetTimeoutAlarm(this);
4224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
4234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using QuicConnection::SendOrQueuePacket;
425558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  using QuicConnection::SelectMutualVersion;
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestConnectionHelper* helper_;
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestConnection);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuicConnectionTest : public ::testing::Test {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicConnectionTest()
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : guid_(42),
437558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        framer_(QuicVersionMax(), QuicTime::Zero(), false),
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        creator_(guid_, &framer_, QuicRandom::GetInstance(), false),
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        send_algorithm_(new StrictMock<MockSendAlgorithm>),
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        helper_(new TestConnectionHelper(&clock_, &random_generator_)),
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        connection_(guid_, IPEndPoint(), helper_, false),
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        frame1_(1, false, 0, data1),
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        frame2_(1, false, 3, data2),
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        accept_packet_(true) {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    connection_.set_visitor(&visitor_);
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_.SetSendAlgorithm(send_algorithm_);
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Simplify tests by not sending feedback unless specifically configured.
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetFeedback(NULL);
449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_CALL(
450a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        *send_algorithm_, TimeUntilSend(_, _, _, _)).WillRepeatedly(Return(
451a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            QuicTime::Delta::Zero()));
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*receive_algorithm_,
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                RecordIncomingPacket(_, _, _, _)).Times(AnyNumber());
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(AnyNumber());
455558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly(
456558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        Return(QuicTime::Delta::Zero()));
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame* outgoing_ack() {
4602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    outgoing_ack_.reset(QuicConnectionPeer::CreateAckFrame(&connection_));
4612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return outgoing_ack_.get();
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame* last_ack() {
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return helper_->ack();
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCongestionFeedbackFrame* last_feedback() {
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return helper_->feedback();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketHeader* last_header() {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return helper_->header();
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t last_sent_packet_size() {
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return helper_->last_packet_size();
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32 final_bytes_of_last_packet() {
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return helper_->final_bytes_of_last_packet();
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void use_tagging_decrypter() {
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    helper_->use_tagging_decrypter();
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessPacket(QuicPacketSequenceNumber number) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(visitor_, OnPacket(_, _, _, _))
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(accept_packet_));
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProcessDataPacket(number, 0, !kEntropyFlag);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) {
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicFrames frames;
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frames.push_back(QuicFrame(frame));
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketCreatorPeer::SetSendVersionInPacket(&creator_,
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                  connection_.is_server());
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SerializedPacket serialized_packet = creator_.SerializeAllFrames(frames);
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicPacket> packet(serialized_packet.packet);
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicEncryptedPacket> encrypted(
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        framer_.EncryptPacket(ENCRYPTION_NONE,
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              serialized_packet.sequence_number, *packet));
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return serialized_packet.entropy_hash;
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool expect_revival) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expect_revival) {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).Times(2).WillRepeatedly(
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Return(accept_packet_));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Return(accept_packet_));
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ProcessDataPacket(number, 1, !kEntropyFlag);
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t ProcessDataPacket(QuicPacketSequenceNumber number,
5217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           QuicFecGroupNumber fec_group,
5227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           bool entropy_flag) {
5237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return ProcessDataPacketAtLevel(number, fec_group, entropy_flag,
5247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    ENCRYPTION_NONE);
5257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
5267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t ProcessDataPacketAtLevel(QuicPacketSequenceNumber number,
5287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  QuicFecGroupNumber fec_group,
5297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  bool entropy_flag,
5307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  EncryptionLevel level) {
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicPacket> packet(ConstructDataPacket(number, fec_group,
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      entropy_flag));
533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
5347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        level, number, *packet));
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return encrypted->length();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ProcessClosePacket(QuicPacketSequenceNumber number,
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          QuicFecGroupNumber fec_group) {
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group));
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ENCRYPTION_NONE, number, *packet));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number,
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 bool expect_revival, bool entropy_flag) {
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (expect_revival) {
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(DoAll(
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          SaveArg<2>(&revived_header_), Return(accept_packet_)));
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(Return(accept_packet_))
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .RetiresOnSaturation();
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ProcessDataPacket(number, 1, entropy_flag);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends an FEC packet that covers the packets that would have been sent.
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t ProcessFecPacket(QuicPacketSequenceNumber number,
560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          QuicPacketSequenceNumber min_protected_packet,
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          bool expect_revival,
562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          bool entropy_flag) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expect_revival) {
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(DoAll(
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          SaveArg<2>(&revived_header_), Return(accept_packet_)));
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Construct the decrypted data packet so we can compute the correct
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // redundancy.
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicPacket> data_packet(ConstructDataPacket(number, 1,
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           !kEntropyFlag));
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.guid = guid_;
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.reset_flag = false;
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.version_flag = false;
576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    header_.entropy_flag = entropy_flag;
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_flag = true;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    header_.packet_sequence_number = number;
579868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    header_.is_in_fec_group = IN_FEC_GROUP;
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_group = min_protected_packet;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicFecData fec_data;
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fec_data.fec_group = header_.fec_group;
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Since all data packets in this test have the same payload, the
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // redundancy is either equal to that payload or the xor of that payload
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // with itself, depending on the number of packets.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((number - min_protected_packet) % 2) == 0) {
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (size_t i = GetStartOfFecProtectedData(
588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               header_.public_header.guid_length,
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               header_.public_header.version_flag,
590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               header_.public_header.sequence_number_length);
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           i < data_packet->length(); ++i) {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_packet->mutable_data()[i] ^= data_packet->data()[i];
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fec_data.redundancy = data_packet->FecProtectedData();
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<QuicPacket> fec_packet(
5972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        framer_.BuildFecPacket(header_, fec_data).packet);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<QuicEncryptedPacket> encrypted(
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        framer_.EncryptPacket(ENCRYPTION_NONE, number, *fec_packet));
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return encrypted->length();
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount SendStreamDataToPeer(QuicStreamId id, StringPiece data,
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     QuicStreamOffset offset, bool fin,
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     QuicPacketSequenceNumber* last_packet) {
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicByteCount packet_size;
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce(
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SaveArg<2>(&packet_size));
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_.SendStreamData(id, data, offset, fin);
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (last_packet != NULL) {
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *last_packet =
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          QuicConnectionPeer::GetPacketCreator(&connection_)->sequence_number();
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(AnyNumber());
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return packet_size;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendAckPacketToPeer() {
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(1);
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_.SendAck();
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(AnyNumber());
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  QuicPacketEntropyHash ProcessAckPacket(QuicAckFrame* frame,
627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                         bool expect_writes) {
628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (expect_writes) {
629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      EXPECT_CALL(visitor_, OnCanWrite()).Times(1).WillOnce(Return(true));
630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ProcessFramePacket(QuicFrame(frame));
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash ProcessGoAwayPacket(QuicGoAwayFrame* frame) {
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ProcessFramePacket(QuicFrame(frame));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsMissing(QuicPacketSequenceNumber number) {
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return IsAwaitingPacket(outgoing_ack()->received_info, number);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number,
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  QuicFecGroupNumber fec_group,
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool entropy_flag) {
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.guid = guid_;
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.reset_flag = false;
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.version_flag = false;
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.entropy_flag = entropy_flag;
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_flag = false;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    header_.packet_sequence_number = number;
651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    header_.fec_group = fec_group;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicFrames frames;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicFrame frame(&frame1_);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frames.push_back(frame);
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacket* packet =
6582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        framer_.BuildUnsizedDataPacket(header_, frames).packet;
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(packet != NULL);
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return packet;
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number,
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   QuicFecGroupNumber fec_group) {
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.guid = guid_;
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.packet_sequence_number = number;
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.reset_flag = false;
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.public_header.version_flag = false;
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.entropy_flag = false;
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_flag = false;
671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP;
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    header_.fec_group = fec_group;
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicConnectionCloseFrame qccf;
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    qccf.error_code = QUIC_PEER_GOING_AWAY;
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    qccf.ack_frame = QuicAckFrame(0, QuicTime::Zero(), 1);
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicFrames frames;
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicFrame frame(&qccf);
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frames.push_back(frame);
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacket* packet =
6822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        framer_.BuildUnsizedDataPacket(header_, frames).packet;
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(packet != NULL);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return packet;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetFeedback(QuicCongestionFeedbackFrame* feedback) {
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    receive_algorithm_ = new TestReceiveAlgorithm(feedback);
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connection_.SetReceiveAlgorithm(receive_algorithm_);
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicGuid guid_;
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFramer framer_;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketCreator creator_;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockSendAlgorithm* send_algorithm_;
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestReceiveAlgorithm* receive_algorithm_;
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockClock clock_;
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockRandom random_generator_;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestConnectionHelper* helper_;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestConnection connection_;
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testing::StrictMock<MockConnectionVisitor> visitor_;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketHeader header_;
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketHeader revived_header_;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame frame1_;
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame frame2_;
7082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  scoped_ptr<QuicAckFrame> outgoing_ack_;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool accept_packet_;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicConnectionTest);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, PacketsInOrder) {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(1);
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, outgoing_ack()->received_info.largest_observed);
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(2);
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, outgoing_ack()->received_info.largest_observed);
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(3);
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, PacketsRejected) {
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(1);
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, outgoing_ack()->received_info.largest_observed);
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accept_packet_ = false;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(2);
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should not have an ack for two.
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, outgoing_ack()->received_info.largest_observed);
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, outgoing_ack()->received_info.missing_packets.size());
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, PacketsOutOfOrder) {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(3);
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(2));
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(2);
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsMissing(2));
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(1);
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsMissing(2));
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(IsMissing(1));
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, DuplicatePacket) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(3);
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(2));
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send packet 3 again, but do not set the expectation that
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the visitor OnPacket() will be called.
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(3, 0, !kEntropyFlag);
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(2));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, PacketsOutOfOrderWithAdditionsAndLeastAwaiting) {
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(3);
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(2));
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(2);
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->received_info.largest_observed);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(5);
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(5u, outgoing_ack()->received_info.largest_observed);
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(1));
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(4));
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pretend at this point the client has gotten acks for 2 and 3 and 1 is a
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // packet the peer will not retransmit.  It indicates this by sending 'least
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // awaiting' is 4.  The connection should then realize 1 will not be
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // retransmitted, and will remove it from the missing list.
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  creator_.set_sequence_number(5);
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(0, QuicTime::Zero(), 4);
793868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force an ack to be sent.
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsMissing(4));
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, RejectPacketTooFarOut) {
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call ProcessDataPacket rather than ProcessPacket, as we should not get a
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // packet call to the visitor.
80390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_PACKET_HEADER, false));
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(6000, 0, !kEntropyFlag);
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, TruncatedAck) {
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(_)).Times(testing::AnyNumber());
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(2);
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 200; ++i) {
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendStreamDataToPeer(1, "foo", i * 3, !kFin, NULL);
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(0, QuicTime::Zero(), 1);
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame.received_info.largest_observed = 192;
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InsertMissingPacketsBetween(&frame.received_info, 1, 192);
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame.received_info.entropy_hash =
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 192) ^
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 191);
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(QuicConnectionPeer::GetReceivedTruncatedAck(&connection_));
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame.received_info.missing_packets.erase(191);
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame.received_info.entropy_hash =
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 192) ^
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 190);
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(QuicConnectionPeer::GetReceivedTruncatedAck(&connection_));
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochTEST_F(QuicConnectionTest, AckReceiptCausesAckSendBadEntropy) {
836558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ProcessPacket(1);
837558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Delay sending, then queue up an ack.
838558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_CALL(*send_algorithm_,
839a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
840558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  testing::Return(QuicTime::Delta::FromMicroseconds(1)));
841558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  QuicConnectionPeer::SendAck(&connection_);
842558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
843558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Process an ack with a least unacked of the received ack.
844558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // This causes an ack to be sent when TimeUntilSend returns 0.
845558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_CALL(*send_algorithm_,
846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillRepeatedly(
847558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  testing::Return(QuicTime::Delta::Zero()));
848558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Skip a packet and then record an ack.
849558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  creator_.set_sequence_number(2);
850558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  QuicAckFrame frame(0, QuicTime::Zero(), 3);
851558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ProcessAckPacket(&frame, true);
852558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
853558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
8544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochTEST_F(QuicConnectionTest, AckReceiptCausesAckSend) {
8554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
8564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicPacketSequenceNumber largest_observed;
8574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicByteCount packet_size;
8584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, NOT_RETRANSMISSION))
8594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      .WillOnce(DoAll(SaveArg<1>(&largest_observed), SaveArg<2>(&packet_size)));
8604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, _)).Times(1);
8614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.SendStreamData(1, "foo", 0, !kFin);
8624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicAckFrame frame(1, QuicTime::Zero(), largest_observed);
8634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  frame.received_info.missing_packets.insert(largest_observed);
8644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
8654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      &connection_, largest_observed - 1);
8664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ProcessAckPacket(&frame, true);
8674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ProcessAckPacket(&frame, true);
8684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Third nack should retransmit the largest observed packet.
8694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, packet_size - kQuicVersionSize,
8704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                           IS_RETRANSMISSION));
8714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ProcessAckPacket(&frame, true);
8724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Now if the peer sends an ack which still reports the retransmitted packet
8744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // as missing, then that will count as a packet which instigates an ack.
8754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ProcessAckPacket(&frame, true);
8764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, NOT_RETRANSMISSION));
8774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ProcessAckPacket(&frame, true);
8784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // But an ack with no new missing packest will not send an ack.
8804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  frame.received_info.missing_packets.clear();
8814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ProcessAckPacket(&frame, true);
8824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ProcessAckPacket(&frame, true);
8834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
8844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, LeastUnackedLower) {
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 3, !kFin, NULL);
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "eep", 6, !kFin, NULL);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start out saying the least unacked is 2
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creator_.set_sequence_number(5);
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(0, QuicTime::Zero(), 2);
893868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change it to 1, but lower the sequence number to fake out-of-order packets.
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should be fine.
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creator_.set_sequence_number(1);
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame2(0, QuicTime::Zero(), 1);
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The scheduler will not process out of order acks.
900868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame2, false);
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now claim it's one, but set the ordering so it was sent "after" the first
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one.  This should cause a connection error.
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false));
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creator_.set_sequence_number(7);
907868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame2, false);
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, LargestObservedLower) {
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 3, !kFin, NULL);
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "eep", 6, !kFin, NULL);
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(2);
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start out saying the largest observed is 2.
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(2, QuicTime::Zero(), 0);
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, 2);
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(_));
921868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now change it to 1, and it should cause a connection error.
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame2(1, QuicTime::Zero(), 0);
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false));
926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame2, false);
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, LeastUnackedGreaterThanPacketSequenceNumber) {
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false));
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create an ack with least_unacked is 2 in packet number 1.
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  creator_.set_sequence_number(0);
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(0, QuicTime::Zero(), 2);
935868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, false);
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest,
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       NackSequenceNumberGreaterThanLargestReceived) {
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 3, !kFin, NULL);
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "eep", 6, !kFin, NULL);
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false));
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(0, QuicTime::Zero(), 1);
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame.received_info.missing_packets.insert(3);
948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, false);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, AckUnsentData) {
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ack a packet which has not been sent.
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false));
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(1, QuicTime::Zero(), 0);
956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, false);
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, AckAll) {
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(1);
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creator_.set_sequence_number(1);
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame1(0, QuicTime::Zero(), 1);
964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame1, true);
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, BasicSending) {
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(6);
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber last_packet;
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);  // Packet 1
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, last_packet);
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 2
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, last_ack()->sent_info.least_unacked);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 3
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, last_ack()->sent_info.least_unacked);
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1u, "bar", 3, !kFin, &last_packet);  // Packet 4
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4u, last_packet);
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 5
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, last_ack()->sent_info.least_unacked);
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet expected_acks;
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_acks.insert(1);
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Peer acks up to packet 3.
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks)));
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(3, QuicTime::Zero(), 0);
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame.received_info.entropy_hash =
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 3);
992868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 6
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // As soon as we've acked one, we skip ack packets 2 and 3 and note lack of
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ack for 4.
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4u, last_ack()->sent_info.least_unacked);
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_acks.clear();
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_acks.insert(4);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Peer acks up to packet 4, the last packet.
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks)));
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame2(6, QuicTime::Zero(), 0);
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame2.received_info.entropy_hash =
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 6);
10074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ProcessAckPacket(&frame2, true);  // Acks don't instigate acks.
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Verify that we did not send an ack.
10104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(6u, last_header()->packet_sequence_number);
10114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
10124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // So the last ack has not changed.
10134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(4u, last_ack()->sent_info.least_unacked);
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we force an ack, we shouldn't change our retransmit state.
10164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SendAckPacketToPeer();  // Packet 7
10174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(7u, last_ack()->sent_info.least_unacked);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But if we send more data it should.
10204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet);  // Packet 8
10214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(8u, last_packet);
10224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SendAckPacketToPeer();  // Packet 9
10234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(8u, last_ack()->sent_info.least_unacked);
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, FECSending) {
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All packets carry version info till version is negotiated.
10287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t payload_length;
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.options()->max_packet_length =
10302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      GetPacketLengthForOneStream(connection_.version(), kIncludeVersion,
10312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                                  IN_FEC_GROUP, &payload_length);
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // And send FEC every two packets.
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.options()->max_packets_per_fec_group = 2;
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send 4 data packets and 2 FEC packets.
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(6);
10372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // The first stream frame will consume 2 fewer bytes than the other three.
10382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  const string payload(payload_length * 4 - 6, 'a');
10397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  connection_.SendStreamData(1, payload, 0, !kFin);
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Expect the FEC group to be closed after SendStreamData.
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(creator_.ShouldSendFec(true));
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, FECQueueing) {
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All packets carry version info till version is negotiated.
10467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t payload_length;
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.options()->max_packet_length =
10482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      GetPacketLengthForOneStream(connection_.version(), kIncludeVersion,
10492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                                  IN_FEC_GROUP, &payload_length);
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // And send FEC every two packets.
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.options()->max_packets_per_fec_group = 2;
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->set_blocked(true);
10557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const string payload(payload_length, 'a');
10567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  connection_.SendStreamData(1, payload, 0, !kFin);
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(creator_.ShouldSendFec(true));
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Expect the first data packet and the fec packet to be queued.
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, connection_.NumQueuedPackets());
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(QuicConnectionTest, AbandonFECFromCongestionWindow) {
1063868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  connection_.options()->max_packets_per_fec_group = 1;
1064868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 1 Data and 1 FEC packet.
1065868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(2);
1066868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  connection_.SendStreamData(1, "foo", 0, !kFin);
1067868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1068868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Larger timeout for FEC bytes to expire.
1069868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const QuicTime::Delta retransmission_time =
1070868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      QuicTime::Delta::FromMilliseconds(5000);
1071868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  clock_.AdvanceTime(retransmission_time);
1072868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1073868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Send only data packet.
1074868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(1);
1075868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Abandon both FEC and data packet.
1076868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(2);
1077868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1078868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  connection_.OnRetransmissionTimeout();
1079868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(QuicConnectionTest, DontAbandonAckedFEC) {
1082868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  connection_.options()->max_packets_per_fec_group = 1;
1083868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const QuicPacketSequenceNumber sequence_number =
1084868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      QuicConnectionPeer::GetPacketCreator(&connection_)->sequence_number() + 1;
1085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1086868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 1 Data and 1 FEC packet.
1087868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(2);
1088868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  connection_.SendStreamData(1, "foo", 0, !kFin);
1089868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1090868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  QuicAckFrame ack_fec(2, QuicTime::Zero(), 1);
1091868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Data packet missing.
1092868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ack_fec.received_info.missing_packets.insert(1);
1093868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ack_fec.received_info.entropy_hash =
1094868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
1095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1097868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(_)).Times(1);
1098868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(1);
1099868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
1100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&ack_fec, true);
1102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const QuicTime::Delta kDefaultRetransmissionTime =
1104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      QuicTime::Delta::FromMilliseconds(5000);
1105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  clock_.AdvanceTime(kDefaultRetransmissionTime);
1106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Abandon only data packet, FEC has been acked.
1108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(sequence_number, _)).Times(1);
1109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Send only data packet.
1110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(1);
1111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  connection_.OnRetransmissionTimeout();
1112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, FramePacking) {
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Block the connection.
11164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.GetSendAlarm()->Set(
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1)));
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send an ack and two stream frames in 1 packet by queueing them.
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendAck();
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     &TestConnection::SendStreamData1)),
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     &TestConnection::SendStreamData2)),
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Return(true)));
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Unblock the connection.
11294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.GetSendAlarm()->Cancel();
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SentPacket(_, _, _, NOT_RETRANSMISSION))
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(1);
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.OnCanWrite();
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(connection_.HasQueuedData());
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parse the last packet and ensure it's an ack and two stream frames from
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // two different streams.
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, helper_->frame_count());
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->ack());
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, helper_->stream_frames()->size());
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, (*helper_->stream_frames())[0].stream_id);
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, (*helper_->stream_frames())[1].stream_id);
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, FramePackingFEC) {
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable fec.
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.options()->max_packets_per_fec_group = 6;
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Block the connection.
11504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.GetSendAlarm()->Set(
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1)));
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send an ack and two stream frames in 1 packet by queueing them.
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendAck();
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     &TestConnection::SendStreamData1)),
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     &TestConnection::SendStreamData2)),
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Return(true)));
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Unblock the connection.
11634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.GetSendAlarm()->Cancel();
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SentPacket(_, _, _, NOT_RETRANSMISSION)).Times(2);
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.OnCanWrite();
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(connection_.HasQueuedData());
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parse the last packet and ensure it's in an fec group.
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, helper_->header()->fec_group);
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, helper_->frame_count());
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, OnCanWrite) {
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Visitor's OnCanWill send data, but will return false.
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     &TestConnection::SendStreamData1)),
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IgnoreResult(InvokeWithoutArgs(&connection_,
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     &TestConnection::SendStreamData2)),
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Return(false)));
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillRepeatedly(
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::Zero()));
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Unblock the connection.
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.OnCanWrite();
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parse the last packet and ensure it's the two stream frames from
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // two different streams.
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, helper_->frame_count());
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, helper_->stream_frames()->size());
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, (*helper_->stream_frames())[0].stream_id);
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, (*helper_->stream_frames())[1].stream_id);
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, RetransmitOnNack) {
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(2);
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(2, _)).Times(1);
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber last_packet;
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount second_packet_size;
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);  // Packet 1
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_packet_size =
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet);  // Packet 2
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet);  // Packet 3
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet expected_acks;
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_acks.insert(1);
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks)));
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Peer acks one but not two or three.  Right now we only retransmit on
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // explicit nack, so it should not trigger a retransimission.
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame ack_one(1, QuicTime::Zero(), 0);
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ack_one.received_info.entropy_hash =
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&ack_one, true);
1219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&ack_one, true);
1220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&ack_one, true);
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_acks.clear();
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_acks.insert(3);
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks)));
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Peer acks up to 3 with two explicitly missing.  Two nacks should cause no
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // change.
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame nack_two(3, QuicTime::Zero(), 0);
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  nack_two.received_info.missing_packets.insert(2);
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  nack_two.received_info.entropy_hash =
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&nack_two, true);
1235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&nack_two, true);
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The third nack should trigger a retransimission.
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              SentPacket(_, _, second_packet_size - kQuicVersionSize,
1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         IS_RETRANSMISSION)).Times(1);
1241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&nack_two, true);
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, RetransmitNackedLargestObserved) {
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber largest_observed;
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount packet_size;
1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, NOT_RETRANSMISSION))
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(DoAll(SaveArg<1>(&largest_observed), SaveArg<2>(&packet_size)));
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, _)).Times(1);
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendStreamData(1, "foo", 0, !kFin);
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(1, QuicTime::Zero(), largest_observed);
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame.received_info.missing_packets.insert(largest_observed);
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, largest_observed - 1);
1256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
1257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Third nack should retransmit the largest observed packet.
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, packet_size - kQuicVersionSize,
1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           IS_RETRANSMISSION));
1261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
126490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(QuicConnectionTest, RetransmitNackedPacketsOnTruncatedAck) {
126590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (int i = 0; i < 200; ++i) {
126690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(1);
126790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    connection_.SendStreamData(1, "foo", i * 3, !kFin);
126890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
126990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
127090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Make a truncated ack frame.
127190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicAckFrame frame(0, QuicTime::Zero(), 1);
127290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  frame.received_info.largest_observed = 192;
127390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  InsertMissingPacketsBetween(&frame.received_info, 1, 192);
127490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  frame.received_info.entropy_hash =
127590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 192) ^
127690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 191);
127790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
127890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
127990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(1);
128090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
128190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(_)).Times(1);
1282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
128390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(QuicConnectionPeer::GetReceivedTruncatedAck(&connection_));
128490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
128590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicConnectionPeer::SetMaxPacketsPerRetransmissionAlarm(&connection_, 200);
128690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const QuicTime::Delta kDefaultRetransmissionTime =
128790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      QuicTime::Delta::FromMilliseconds(500);
128890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  clock_.AdvanceTime(kDefaultRetransmissionTime);
128990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only packets that are less than largest observed should be retransmitted.
129090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(191);
129190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(191);
129290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.OnRetransmissionTimeout();
129390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
129490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(
129590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      2 * kDefaultRetransmissionTime.ToMicroseconds()));
129690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Retransmit already retransmitted packets event though the sequence number
129790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // greater than the largest observed.
129890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(191);
129990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(191);
130090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.OnRetransmissionTimeout();
130190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
130290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, LimitPacketsPerNack) {
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingAck(12, _, _)).Times(1);
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(11);
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int offset = 0;
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send packets 1 to 12
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 12; ++i) {
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendStreamDataToPeer(1, "foo", offset, !kFin, NULL);
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    offset += 3;
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ack 12, nack 1-11
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame nack(12, QuicTime::Zero(), 0);
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 1; i < 12; ++i) {
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    nack.received_info.missing_packets.insert(i);
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  nack.received_info.entropy_hash =
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 12) ^
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 11);
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet expected_acks;
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_acks.insert(12);
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks)));
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Nack three times.
1328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&nack, true);
1329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&nack, true);
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The third call should trigger retransmitting 10 packets.
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(10);
1332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&nack, true);
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // The fourth call should trigger retransmitting the 11th packet.
13354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(1);
1336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&nack, true);
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test sending multiple acks from the connection to the session.
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, MultipleAcks) {
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(6);
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber last_packet;
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1u, "foo", 0, !kFin, &last_packet);  // Packet 1
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, last_packet);
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(3u, "foo", 0, !kFin, &last_packet);  // Packet 2
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, last_packet);
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 3
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(5u, "foo", 0, !kFin, &last_packet);  // Packet 4
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4u, last_packet);
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1u, "foo", 3, !kFin, &last_packet);  // Packet 5
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5u, last_packet);
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(3u, "foo", 3, !kFin, &last_packet);  // Packet 6
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(6u, last_packet);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Client will ack packets 1, [!2], 3, 4, 5
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame1(5, QuicTime::Zero(), 0);
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frame1.received_info.missing_packets.insert(2);
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame1.received_info.entropy_hash =
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 5) ^
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The connection should pass up acks for 1, 4, 5.  2 is not acked, and 3 was
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an ackframe so should not be passed up.
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet expected_acks;
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_acks.insert(1);
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_acks.insert(4);
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_acks.insert(5);
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks)));
1372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame1, true);
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now the client implicitly acks 2, and explicitly acks 6
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame2(6, QuicTime::Zero(), 0);
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame2.received_info.entropy_hash =
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 6);
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_acks.clear();
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both acks should be passed up.
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_acks.insert(2);
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_acks.insert(6);
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks)));
1384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame2, true);
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, DontLatchUnackedPacket) {
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(1);
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);  // Packet 1;
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 2
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This sets least unacked to 3 (unsent packet), since we don't need
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // an ack for Packet 2 (ack packet).
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet expected_acks;
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_acks.insert(1);
13964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Peer acks packet 1.
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks)));
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(1, QuicTime::Zero(), 0);
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, 1);
1401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify that our internal state has least-unacked as 3.
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, outgoing_ack()->sent_info.least_unacked);
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When we send an ack, we make sure our least-unacked makes sense.  In this
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // case since we're not waiting on an ack for 2 and all packets are acked, we
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // set it to 3.
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 3
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Since this was an ack packet, we set least_unacked to 4.
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4u, outgoing_ack()->sent_info.least_unacked);
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that the outgoing ack had its sequence number as least_unacked.
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, last_ack()->sent_info.least_unacked);
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "bar", 3, false, NULL);  // Packet 4
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4u, outgoing_ack()->sent_info.least_unacked);
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();  // Packet 5
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4u, last_ack()->sent_info.least_unacked);
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, ReviveMissingPacketAfterFecPacket) {
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 1.
1423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessFecPacket(2, 1, true, !kEntropyFlag);
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(revived_header_.entropy_flag);
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacketThenFecPacket) {
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(1, false, kEntropyFlag);
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 2.
1430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessFecPacket(3, 1, true, !kEntropyFlag);
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(revived_header_.entropy_flag);
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacketsThenFecPacket) {
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(1, false, !kEntropyFlag);
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 2.
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(3, false, !kEntropyFlag);
1438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessFecPacket(4, 1, true, kEntropyFlag);
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(revived_header_.entropy_flag);
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacket) {
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 1.
1444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessFecPacket(3, 1, false, !kEntropyFlag);
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // out of order
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(2, true, !kEntropyFlag);
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(revived_header_.entropy_flag);
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPackets) {
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(1, false, !kEntropyFlag);
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 2.
1453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessFecPacket(6, 1, false, kEntropyFlag);
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(3, false, kEntropyFlag);
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(4, false, kEntropyFlag);
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(5, true, !kEntropyFlag);
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(revived_header_.entropy_flag);
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, TestRetransmit) {
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicTime::Delta kDefaultRetransmissionTime =
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuicTime::Delta::FromMilliseconds(500);
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kDefaultRetransmissionTime);
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, outgoing_ack()->sent_info.least_unacked);
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, last_header()->packet_sequence_number);
14704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(default_retransmission_time,
14714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch            connection_.GetRetransmissionAlarm()->deadline());
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate the retransimission alarm firing
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clock_.AdvanceTime(kDefaultRetransmissionTime);
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, _)).Times(1);
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.RetransmitPacket(1);
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, last_header()->packet_sequence_number);
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, outgoing_ack()->sent_info.least_unacked);
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(QuicConnectionTest, RetransmitWithSameEncryptionLevel) {
1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const QuicTime::Delta kDefaultRetransmissionTime =
1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      QuicTime::Delta::FromMilliseconds(500);
1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDefaultRetransmissionTime);
1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  use_tagging_decrypter();
1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
148990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at
149090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // the end of the packet. We can test this to check which encrypter was used.
1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0x01010101u, final_bytes_of_last_packet());
1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0x02020202u, final_bytes_of_last_packet());
1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(default_retransmission_time,
15014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch            connection_.GetRetransmissionAlarm()->deadline());
1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Simulate the retransimission alarm firing
1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  clock_.AdvanceTime(kDefaultRetransmissionTime);
1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(2);
1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.RetransmitPacket(1);
1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Packet should have been sent with ENCRYPTION_NONE.
1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0x01010101u, final_bytes_of_last_packet());
1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.RetransmitPacket(2);
1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Packet should have been sent with ENCRYPTION_INITIAL.
1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0x02020202u, final_bytes_of_last_packet());
1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(QuicConnectionTest,
151890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       DropRetransmitsForNullEncryptedPacketAfterForwardSecure) {
151990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  use_tagging_decrypter();
152090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
152190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicPacketSequenceNumber sequence_number;
152290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, &sequence_number);
152390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
152490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_FORWARD_SECURE,
152590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                           new TaggingEncrypter(0x02));
152690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
152790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
152890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(0);
152990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(sequence_number, _)).Times(1);
153090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
153190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const QuicTime::Delta kDefaultRetransmissionTime =
153290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      QuicTime::Delta::FromMilliseconds(500);
153390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
153490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kDefaultRetransmissionTime);
153590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(default_retransmission_time,
15374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch            connection_.GetRetransmissionAlarm()->deadline());
153890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Simulate the retransimission alarm firing
153990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  clock_.AdvanceTime(kDefaultRetransmissionTime);
154090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.OnRetransmissionTimeout();
154190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
154290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
154390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(QuicConnectionTest, RetransmitPacketsWithInitialEncryption) {
154490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  use_tagging_decrypter();
154590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
154690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetDefaultEncryptionLevel(ENCRYPTION_NONE);
154790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
154890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
154990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
155090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
155190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
155290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
155390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendStreamDataToPeer(2, "bar", 0, !kFin, NULL);
155490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
155590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(1);
155690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(1);
155790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
155890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.RetransmitUnackedPackets(QuicConnection::INITIAL_ENCRYPTION_ONLY);
155990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
156090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(QuicConnectionTest, BufferNonDecryptablePackets) {
15627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  use_tagging_decrypter();
15637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
15647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const uint8 tag = 0x07;
15657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag));
15667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
15677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Process an encrypted packet which can not yet be decrypted
15687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // which should result in the packet being buffered.
15697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ProcessDataPacketAtLevel(1, false, kEntropyFlag, ENCRYPTION_INITIAL);
15707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
15717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Transition to the new encryption state and process another
15727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // encrypted packet which should result in the original packet being
15737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // processed.
15747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  connection_.SetDecrypter(new StrictTaggingDecrypter(tag));
15757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
15767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag));
15777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).Times(2).WillRepeatedly(
15787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Return(true));
15797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ProcessDataPacketAtLevel(2, false, kEntropyFlag, ENCRYPTION_INITIAL);
15807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
15817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Finally, process a third packet and note that we do not
15827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // reprocess the buffered packet.
15837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(Return(true));
15847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ProcessDataPacketAtLevel(3, false, kEntropyFlag, ENCRYPTION_INITIAL);
15857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
15867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, TestRetransmitOrder) {
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount first_packet_size;
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce(
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SaveArg<2>(&first_packet_size));
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(2);
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendStreamData(1, "first_packet", 0, !kFin);
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount second_packet_size;
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce(
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SaveArg<2>(&second_packet_size));
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendStreamData(1, "second_packet", 12, !kFin);
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(first_packet_size, second_packet_size);
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Advance the clock by huge time to make sure packets will be retransmitted.
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InSequence s;
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_,
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                SentPacket(_, _, first_packet_size, _));
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*send_algorithm_,
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                SentPacket(_, _, second_packet_size, _));
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.OnRetransmissionTimeout();
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, TestRetransmissionCountCalculation) {
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(2);
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber original_sequence_number;
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SentPacket(_, _, _, NOT_RETRANSMISSION))
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(SaveArg<1>(&original_sequence_number));
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendStreamData(1, "foo", 0, !kFin);
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, original_sequence_number));
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, QuicConnectionPeer::GetRetransmissionCount(
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, original_sequence_number));
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Force retransmission due to RTO.
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber rto_sequence_number;
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SentPacket(_, _, _, IS_RETRANSMISSION))
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(SaveArg<1>(&rto_sequence_number));
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.OnRetransmissionTimeout();
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission(
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, original_sequence_number));
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, rto_sequence_number));
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, QuicConnectionPeer::GetRetransmissionCount(
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, rto_sequence_number));
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Once by explicit nack.
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber nack_sequence_number;
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ack packets might generate some other packets, which are not
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // retransmissions. (More ack packets).
1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, NOT_RETRANSMISSION))
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AnyNumber());
1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, IS_RETRANSMISSION))
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(SaveArg<1>(&nack_sequence_number));
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame ack(rto_sequence_number, QuicTime::Zero(), 0);
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ack the retransmitted packet.
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ack.received_info.missing_packets.insert(rto_sequence_number);
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ack.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, rto_sequence_number - 1);
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 3; i++) {
1650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ProcessAckPacket(&ack, true);
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission(
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, rto_sequence_number));
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, nack_sequence_number));
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, QuicConnectionPeer::GetRetransmissionCount(
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, nack_sequence_number));
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, SetRTOAfterWritingToSocket) {
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->set_blocked(true);
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendStreamData(1, "foo", 0, !kFin);
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure that RTO is not started when the packet is queued.
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, QuicConnectionPeer::GetNumRetransmissionTimeouts(&connection_));
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test that RTO is started once we write to the socket.
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->set_blocked(false);
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite());
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.OnCanWrite();
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, QuicConnectionPeer::GetNumRetransmissionTimeouts(&connection_));
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, TestQueued) {
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_->set_blocked(true);
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendStreamData(1, "foo", 0, !kFin);
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt to send all packets, but since we're actually still
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // blocked, they should all remain queued.
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(connection_.OnCanWrite());
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unblock the writes and actually send.
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_->set_blocked(false);
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite());
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connection_.OnCanWrite());
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, CloseFecGroup) {
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 1
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing packet 2
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecProtectedPacket(3, false, !kEntropyFlag);
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't send missing FEC packet 3
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, connection_.NumFecGroups());
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now send non-fec protected ack packet and close the group
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(0, QuicTime::Zero(), 5);
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  creator_.set_sequence_number(4);
1701868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, connection_.NumFecGroups());
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, NoQuicCongestionFeedbackFrame) {
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(last_feedback() == NULL);
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, WithQuicCongestionFeedbackFrame) {
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCongestionFeedbackFrame info;
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.type = kFixRate;
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info.fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(123);
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetFeedback(&info);
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kFixRate, last_feedback()->type);
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(info.fix_rate.bitrate, last_feedback()->fix_rate.bitrate);
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, UpdateQuicCongestionFeedbackFrame) {
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _, _));
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPacket(1);
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, DontUpdateQuicCongestionFeedbackFrameForRevived) {
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Process an FEC packet, and revive the missing data packet
17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but only contact the receive_algorithm once.
17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _, _));
17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFecPacket(2, 1, true, !kEntropyFlag);
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, InitialTimeout) {
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connection_.connected());
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false));
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicTime default_timeout = clock_.ApproximateNow().Add(
174190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
17424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the timeout alarm firing
174590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  clock_.AdvanceTime(
174690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connection_.CheckForTimeout());
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(connection_.connected());
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, TimeoutAfterSend) {
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connection_.connected());
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicTime default_timeout = clock_.ApproximateNow().Add(
175590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // When we send a packet, the timeout will change to 5000 +
175890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // kDefaultInitialTimeoutSecs.
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send an ack so we don't set the retransimission alarm.
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendAckPacketToPeer();
17634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The original alarm will fire.  We should not time out because we had a
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // network event at t=5000.  The alarm will reregister.
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(
176890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      kDefaultInitialTimeoutSecs * 1000000 - 5000));
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(default_timeout, clock_.ApproximateNow());
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(connection_.CheckForTimeout());
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connection_.connected());
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)),
17734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch            connection_.GetTimeoutAlarm()->deadline());
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This time, we should time out.
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false));
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)),
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            clock_.ApproximateNow());
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connection_.CheckForTimeout());
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(connection_.connected());
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(ianswett): Add scheduler tests when should_retransmit is false.
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, SendScheduler) {
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that if we send a packet without delay, it is not queued.
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1790a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::Zero()));
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SendOrQueuePacket(
1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, SendSchedulerDelay) {
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that if we send a packet with a delay, it ends up queued.
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(1)));
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0);
1805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SendOrQueuePacket(
1806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, SendSchedulerForce) {
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that if we force send a packet, it is not queued.
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1814a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, IS_RETRANSMISSION, _, _)).Times(0);
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
1816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SendOrQueuePacket(
1817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // XXX: fixme.  was:  connection_.SendOrQueuePacket(1, packet, kForce);
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) {
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_->set_blocked(true);
18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1826a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::Zero()));
18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0);
1829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SendOrQueuePacket(
1830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, SendSchedulerDelayThenSend) {
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that if we send a packet with a delay, it ends up queued.
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1838a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(1)));
1840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SendOrQueuePacket(
1841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Advance the clock to fire the alarm, and configure the scheduler
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to permit the packet to be sent.
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1847a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillRepeatedly(
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::Zero()));
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1));
18504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.GetSendAlarm()->Cancel();
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _));
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite());
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connection_.OnCanWrite();
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, SendSchedulerDelayThenRetransmit) {
1858a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, NOT_RETRANSMISSION, _, _))
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(testing::Return(QuicTime::Delta::Zero()));
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, _)).Times(1);
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SentPacket(_, 1, _, NOT_RETRANSMISSION));
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendStreamData(1, "foo", 0, !kFin);
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Advance the time for retransmission of lost packet.
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501));
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that if we send a retransmit with a delay, it ends up queued.
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1869a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, IS_RETRANSMISSION, _, _)).WillOnce(
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(1)));
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.OnRetransmissionTimeout();
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Advance the clock to fire the alarm, and configure the scheduler
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to permit the packet to be sent.
18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1877a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, IS_RETRANSMISSION, _, _)).WillOnce(
18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::Zero()));
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the scheduler is notified this is a retransmit.
18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SentPacket(_, _, _, IS_RETRANSMISSION));
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1));
18844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.GetSendAlarm()->Cancel();
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite());
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connection_.OnCanWrite();
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, SendSchedulerDelayAndQueue) {
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1893a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(1)));
1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SendOrQueuePacket(
1896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attempt to send another packet and make sure that it gets queued.
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  packet = ConstructDataPacket(2, 0, !kEntropyFlag);
1901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SendOrQueuePacket(
1902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 2, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, connection_.NumQueuedPackets());
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) {
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1909a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(10)));
1911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SendOrQueuePacket(
1912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now send non-retransmitting information, that we're not going to
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // retransmit 3. The far end should stop waiting for it.
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(0, QuicTime::Zero(), 1);
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1919a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillRepeatedly(
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::Zero()));
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              SentPacket(_, _, _, _));
1923868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, true);
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure alarm is not set
19274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_FALSE(connection_.GetSendAlarm()->IsSet());
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) {
19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1933a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(10)));
1935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SendOrQueuePacket(
1936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now send non-retransmitting information, that we're not going to
19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // retransmit 3.  The far end should stop waiting for it.
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame frame(0, QuicTime::Zero(), 1);
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1943a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(1)));
1945868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&frame, false);
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) {
19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1953a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(10)));
1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SendOrQueuePacket(
1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnCanWrite should not send the packet (because of the delay)
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but should still return true.
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(connection_.OnCanWrite());
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, TestQueueLimitsOnSendStreamData) {
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All packets carry version info till version is negotiated.
19677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t payload_length;
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.options()->max_packet_length =
19692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      GetPacketLengthForOneStream(connection_.version(), kIncludeVersion,
19702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                                  NOT_IN_FEC_GROUP, &payload_length);
19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Queue the first packet.
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
1974a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)              TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  testing::Return(QuicTime::Delta::FromMicroseconds(10)));
19767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const string payload(payload_length, 'a');
19777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(0u,
19787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            connection_.SendStreamData(1, payload, 0, !kFin).bytes_consumed);
19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, LoopThroughSendingPackets) {
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All packets carry version info till version is negotiated.
19847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t payload_length;
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.options()->max_packet_length =
19862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      GetPacketLengthForOneStream(connection_.version(), kIncludeVersion,
19872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                                  NOT_IN_FEC_GROUP, &payload_length);
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Queue the first packet.
1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(7);
19912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // The first stream frame will consume 2 fewer bytes than the other six.
19922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  const string payload(payload_length * 7 - 12, 'a');
19937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(payload.size(),
19947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            connection_.SendStreamData(1, payload, 0, !kFin).bytes_consumed);
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, NoAckForClose) {
19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessPacket(1);
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(0);
20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_PEER_GOING_AWAY, true));
20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(0);
20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessClosePacket(2, 0);
20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, SendWhenDisconnected) {
20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(connection_.connected());
20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_PEER_GOING_AWAY, false));
20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.CloseConnection(QUIC_PEER_GOING_AWAY, false);
20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(connection_.connected());
20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0);
2012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connection_.SendOrQueuePacket(
2013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, PublicReset) {
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetPacket header;
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.public_header.guid = guid_;
20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.public_header.reset_flag = true;
20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.public_header.version_flag = false;
20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.rejected_sequence_number = 10101;
20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> packet(
20232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      framer_.BuildPublicResetPacket(header));
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_PUBLIC_RESET, true));
20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *packet);
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, GoAway) {
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame goaway;
20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  goaway.last_good_stream_id = 1;
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  goaway.error_code = QUIC_PEER_GOING_AWAY;
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  goaway.reason_phrase = "Going away.";
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnGoAway(_));
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessGoAwayPacket(&goaway);
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, MissingPacketsBeforeLeastUnacked) {
20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame ack(0, QuicTime::Zero(), 4);
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the sequence number of the ack packet to be least unacked (4)
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  creator_.set_sequence_number(3);
2041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProcessAckPacket(&ack, true);
20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(outgoing_ack()->received_info.missing_packets.empty());
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, ReceivedEntropyHashCalculation) {
20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillRepeatedly(Return(true));
20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(1, 1, kEntropyFlag);
20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(4, 1, kEntropyFlag);
20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(3, 1, !kEntropyFlag);
20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(7, 1, kEntropyFlag);
20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash);
20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, UpdateEntropyForReceivedPackets) {
20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillRepeatedly(Return(true));
20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(1, 1, kEntropyFlag);
20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(5, 1, kEntropyFlag);
20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(4, 1, !kEntropyFlag);
20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(34u, outgoing_ack()->received_info.entropy_hash);
20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make 4th packet my least unacked, and update entropy for 2, 3 packets.
20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame ack(0, QuicTime::Zero(), 4);
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash kRandomEntropyHash = 129u;
20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ack.sent_info.entropy_hash = kRandomEntropyHash;
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  creator_.set_sequence_number(5);
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash six_packet_entropy_hash = 0;
2066868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (ProcessAckPacket(&ack, true)) {
20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    six_packet_entropy_hash = 1 << 6;
20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ((kRandomEntropyHash + (1 << 5) + six_packet_entropy_hash),
20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            outgoing_ack()->received_info.entropy_hash);
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, UpdateEntropyHashUptoCurrentPacket) {
20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillRepeatedly(Return(true));
20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(1, 1, kEntropyFlag);
20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(5, 1, !kEntropyFlag);
20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(22, 1, kEntropyFlag);
20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(66u, outgoing_ack()->received_info.entropy_hash);
20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  creator_.set_sequence_number(22);
20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash kRandomEntropyHash = 85u;
20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Current packet is the least unacked packet.
20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame ack(0, QuicTime::Zero(), 23);
20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ack.sent_info.entropy_hash = kRandomEntropyHash;
2085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  QuicPacketEntropyHash ack_entropy_hash =  ProcessAckPacket(&ack, true);
20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ((kRandomEntropyHash + ack_entropy_hash),
20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            outgoing_ack()->received_info.entropy_hash);
20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessDataPacket(25, 1, kEntropyFlag);
20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ((kRandomEntropyHash + ack_entropy_hash + (1 << (25 % 8))),
20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            outgoing_ack()->received_info.entropy_hash);
20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, EntropyCalculationForTruncatedAck) {
20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillRepeatedly(Return(true));
20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy[51];
20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  entropy[0] = 0;
20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 1; i < 51; ++i) {
20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool should_send = i % 10 != 0;
20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool entropy_flag = (i & (i - 1)) != 0;
21002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!should_send) {
21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entropy[i] = entropy[i - 1];
21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (entropy_flag) {
21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entropy[i] = entropy[i - 1] ^ (1 << (i % 8));
21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entropy[i] = entropy[i - 1];
21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProcessDataPacket(i, 1, entropy_flag);
21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Till 50 since 50th packet is not sent.
21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 1; i < 50; ++i) {
21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(entropy[i], QuicConnectionPeer::ReceivedEntropyHash(
21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &connection_, i));
21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, CheckSentEntropyHash) {
21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  creator_.set_sequence_number(1);
21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet missing_packets;
21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash = 0;
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber max_sequence_number = 51;
21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (QuicPacketSequenceNumber i = 1; i <= max_sequence_number; ++i) {
21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool is_missing = i % 10 != 0;
21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool entropy_flag = (i & (i - 1)) != 0;
21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketEntropyHash packet_entropy_hash = 0;
21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (entropy_flag) {
21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      packet_entropy_hash = 1 << (i % 8);
21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacket* packet = ConstructDataPacket(i, 0, entropy_flag);
2131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    connection_.SendOrQueuePacket(
2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ENCRYPTION_NONE, i, packet, packet_entropy_hash,
2133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        HAS_RETRANSMITTABLE_DATA);
21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (is_missing)  {
21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      missing_packets.insert(i);
21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entropy_hash ^= packet_entropy_hash;
21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(QuicConnectionPeer::IsValidEntropy(
21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &connection_, max_sequence_number, missing_packets, entropy_hash))
21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << "";
21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochTEST_F(QuicConnectionTest, ServerSendsVersionNegotiationPacket) {
2148558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketHeader header;
21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.public_header.guid = guid_;
21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.public_header.reset_flag = false;
21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.public_header.version_flag = true;
21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.entropy_flag = false;
21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.fec_flag = false;
21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.packet_sequence_number = 12;
21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header.fec_group = 0;
21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicFrames frames;
21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicFrame frame(&frame1_);
21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frames.push_back(frame);
21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicPacket> packet(
21632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      framer_.BuildUnsizedDataPacket(header, frames).packet);
2164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> encrypted(
2165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2167558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  framer_.set_version(QuicVersionMax());
21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.set_is_server(true);
21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->version_negotiation_packet() != NULL);
2171558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2172558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  size_t num_versions = arraysize(kSupportedQuicVersions);
2173558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(num_versions,
21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            helper_->version_negotiation_packet()->versions.size());
2175558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2176558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // We expect all versions in kSupportedQuicVersions to be
2177558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // included in the packet.
2178558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  for (size_t i = 0; i < num_versions; ++i) {
2179558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_EQ(kSupportedQuicVersions[i],
2180558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch              helper_->version_negotiation_packet()->versions[i]);
2181558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochTEST_F(QuicConnectionTest, ClientHandlesVersionNegotiation) {
21854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Start out with some unsupported version.
21864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicConnectionPeer::GetFramer(&connection_)->set_version_for_tests(
21874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      QUIC_VERSION_UNSUPPORTED);
21884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
21894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicPacketHeader header;
21904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.public_header.guid = guid_;
21914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.public_header.reset_flag = false;
21924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.public_header.version_flag = true;
21934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.entropy_flag = false;
21944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.fec_flag = false;
21954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.packet_sequence_number = 12;
21964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.fec_group = 0;
21974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
21984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicVersionVector supported_versions;
21994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
22004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    supported_versions.push_back(kSupportedQuicVersions[i]);
22014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
22024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
22034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Send a version negotiation packet.
22044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  scoped_ptr<QuicEncryptedPacket> encrypted(
22054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      framer_.BuildVersionNegotiationPacket(
22064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch          header.public_header, supported_versions));
22074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
22084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
22094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Now force another packet.  The connection should transition into
22104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // NEGOTIATED_VERSION state and tell the packet creator to StopSendingVersion.
22114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.public_header.version_flag = false;
22124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicFrames frames;
22134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicFrame frame(&frame1_);
22144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  frames.push_back(frame);
22154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  scoped_ptr<QuicPacket> packet(
22164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      framer_.BuildUnsizedDataPacket(header, frames).packet);
22174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  encrypted.reset(framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
22184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).Times(1);
22194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
22204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
22214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ASSERT_FALSE(QuicPacketCreatorPeer::SendVersionInPacket(
22224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      QuicConnectionPeer::GetPacketCreator(&connection_)));
22234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
22244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
22254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochTEST_F(QuicConnectionTest, BadVersionNegotiation) {
22264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicPacketHeader header;
22274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.public_header.guid = guid_;
22284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.public_header.reset_flag = false;
22294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.public_header.version_flag = true;
22304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.entropy_flag = false;
22314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.fec_flag = false;
22324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.packet_sequence_number = 12;
22334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  header.fec_group = 0;
22344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
22354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  QuicVersionVector supported_versions;
22364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
22374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    supported_versions.push_back(kSupportedQuicVersions[i]);
22384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
22394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
22404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Send a version negotiation packet with the version the client started with.
22414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // It should be rejected.
22424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_VERSION_NEGOTIATION_PACKET,
22434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                        false));
22444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  scoped_ptr<QuicEncryptedPacket> encrypted(
22454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      framer_.BuildVersionNegotiationPacket(
22464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch          header.public_header, supported_versions));
22474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
22484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
22494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, CheckSendStats) {
22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(3);
22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SentPacket(_, _, _, NOT_RETRANSMISSION));
22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendStreamData(1u, "first", 0, !kFin);
22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t first_packet_size = last_sent_packet_size();
22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
22584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch              SentPacket(_, _, _, NOT_RETRANSMISSION));
22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.SendStreamData(1u, "second", 0, !kFin);
22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t second_packet_size = last_sent_packet_size();
22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 2 retransmissions due to rto, 1 due to explicit nack.
22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_,
2264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SentPacket(_, _, _, IS_RETRANSMISSION)).Times(3);
22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retransmit due to RTO.
22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connection_.OnRetransmissionTimeout();
22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retransmit due to explicit nacks
22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame nack_three(4, QuicTime::Zero(), 0);
22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  nack_three.received_info.missing_packets.insert(3);
22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  nack_three.received_info.entropy_hash =
22742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 4) ^
22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicConnectionPeer::GetSentEntropyHash(&connection_, 2);
22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicFrame frame(&nack_three);
22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(visitor_, OnAck(_));
22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(1);
22802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1);
2281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(visitor_, OnCanWrite()).Times(3).WillRepeatedly(Return(true));
22822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFramePacket(frame);
22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFramePacket(frame);
22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProcessFramePacket(frame);
22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillOnce(
22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Return(QuicTime::Delta::Zero()));
22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(
22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Return(QuicBandwidth::Zero()));
22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicConnectionStats& stats = connection_.GetStats();
22934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize,
22944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch            stats.bytes_sent);
22954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(5u, stats.packets_sent);
22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize,
22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            stats.bytes_retransmitted);
22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, stats.packets_retransmitted);
22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, stats.rto_count);
23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(QuicConnectionTest, CheckReceiveStats) {
23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t received_bytes = 0;
23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  received_bytes += ProcessFecProtectedPacket(1, false, !kEntropyFlag);
23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  received_bytes += ProcessFecProtectedPacket(3, false, !kEntropyFlag);
23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Should be counted against dropped packets.
23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  received_bytes += ProcessDataPacket(3, 1, !kEntropyFlag);
23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  received_bytes += ProcessFecPacket(4, 1, true, !kEntropyFlag);  // Fec packet
23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillOnce(
23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Return(QuicTime::Delta::Zero()));
23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(
23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Return(QuicBandwidth::Zero()));
23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicConnectionStats& stats = connection_.GetStats();
23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(received_bytes, stats.bytes_received);
23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4u, stats.packets_received);
23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, stats.packets_revived);
23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, stats.packets_dropped);
23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(QuicConnectionTest, TestFecGroupLimits) {
232490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create and return a group for 1
232590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 1) != NULL);
232690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
232790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create and return a group for 2
232890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) != NULL);
232990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
233090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create and return a group for 4.  This should remove 1 but not 2.
233190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 4) != NULL);
233290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 1) == NULL);
233390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) != NULL);
233490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
233590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create and return a group for 3.  This will kill off 2.
233690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 3) != NULL);
233790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) == NULL);
233890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
233990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Verify that adding 5 kills off 3, despite 4 being created before 3.
234090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 5) != NULL);
234190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 4) != NULL);
234290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 3) == NULL);
234390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
234490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
234590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(QuicConnectionTest, DontProcessFramesIfPacketClosedConnection) {
234690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Construct a packet with stream frame and connection close frame.
234790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.public_header.guid = guid_;
234890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.packet_sequence_number = 1;
234990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.public_header.reset_flag = false;
235090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.public_header.version_flag = false;
235190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.entropy_flag = false;
235290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.fec_flag = false;
235390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  header_.fec_group = 0;
235490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
235590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicConnectionCloseFrame qccf;
235690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  qccf.error_code = QUIC_PEER_GOING_AWAY;
235790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  qccf.ack_frame = QuicAckFrame(0, QuicTime::Zero(), 1);
235890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicFrame close_frame(&qccf);
235990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicFrame stream_frame(&frame1_);
236090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
236190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QuicFrames frames;
236290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  frames.push_back(stream_frame);
236390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  frames.push_back(close_frame);
236490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<QuicPacket> packet(
23652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      framer_.BuildUnsizedDataPacket(header_, frames).packet);
236690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(NULL != packet.get());
236790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
236890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ENCRYPTION_NONE, 1, *packet));
236990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
237090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_PEER_GOING_AWAY, true));
237190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).Times(0);
237290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
237390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
237490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
237590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(QuicConnectionTest, SelectMutualVersion) {
2377f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  // Set the connection to speak the lowest quic version.
2378f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  connection_.set_version(QuicVersionMin());
2379f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  EXPECT_EQ(QuicVersionMin(), connection_.version());
23802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
23812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Pass in available versions which includes a higher mutually supported
23822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // version.  The higher mutually supported version should be selected.
2383f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  QuicVersionVector supported_versions;
2384f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
2385f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch    supported_versions.push_back(kSupportedQuicVersions[i]);
2386f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  }
2387f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  EXPECT_TRUE(connection_.SelectMutualVersion(supported_versions));
2388f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  EXPECT_EQ(QuicVersionMax(), connection_.version());
2389f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch
2390f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  // Expect that the lowest version is selected.
2391f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  // Ensure the lowest supported version is less than the max, unless they're
2392f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  // the same.
2393f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  EXPECT_LE(QuicVersionMin(), QuicVersionMax());
2394f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  QuicVersionVector lowest_version_vector;
2395f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  lowest_version_vector.push_back(QuicVersionMin());
2396f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  EXPECT_TRUE(connection_.SelectMutualVersion(lowest_version_vector));
2397f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch  EXPECT_EQ(QuicVersionMin(), connection_.version());
23982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
23992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Shouldn't be able to find a mutually supported version.
24002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  QuicVersionVector unsupported_version;
24012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  unsupported_version.push_back(QUIC_VERSION_UNSUPPORTED);
24022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_FALSE(connection_.SelectMutualVersion(unsupported_version));
24032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
2404558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2405a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(QuicConnectionTest, ConnectionCloseWhenNotWriteBlocked) {
2406a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  helper_->set_blocked(false);  // Already default.
2407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Send a packet (but write will not block).
24094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.SendStreamData(1, "foo", 0, !kFin);
2410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0u, connection_.NumQueuedPackets());
2411a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1u, helper_->packets_write_attempts());
2412a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2413a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Send an erroneous packet to close the connection.
2414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_PACKET_HEADER, false));
2415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ProcessDataPacket(6000, 0, !kEntropyFlag);
2416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(2u, helper_->packets_write_attempts());
2417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
2418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2419a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) {
24204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  EXPECT_EQ(0u, connection_.NumQueuedPackets());
2421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  helper_->set_blocked(true);
2422a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2423a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Send a packet to so that write will really block.
24244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  connection_.SendStreamData(1, "foo", 0, !kFin);
2425a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1u, connection_.NumQueuedPackets());
2426a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1u, helper_->packets_write_attempts());
2427a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2428a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Send an erroneous packet to close the connection.
2429a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_PACKET_HEADER, false));
2430a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ProcessDataPacket(6000, 0, !kEntropyFlag);
2431a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1u, helper_->packets_write_attempts());
2432a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
2433a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2434a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(QuicConnectionTest, ConnectionCloseWhenNothingPending) {
2435a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  helper_->set_blocked(true);
2436a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2437a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Send an erroneous packet to close the connection.
2438a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_PACKET_HEADER, false));
2439a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ProcessDataPacket(6000, 0, !kEntropyFlag);
2440a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1u, helper_->packets_write_attempts());
2441a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
2442a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
2446