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