quic_epoll_connection_helper_test.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/quic_epoll_connection_helper.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/crypto/crypto_protocol.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/crypto/quic_decrypter.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/crypto/quic_encrypter.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/crypto/quic_random.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/quic/quic_connection.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/quic_framer.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/test_tools/quic_connection_peer.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/test_tools/quic_test_utils.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/test_tools/mock_epoll_server.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using net::test::FramerVisitorCapturingFrames; 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using net::test::MockSendAlgorithm; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using net::test::QuicConnectionPeer; 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using net::test::MockConnectionVisitor; 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using net::tools::test::MockEpollServer; 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::_; 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)using testing::AnyNumber; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::Return; 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net { 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools { 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace test { 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kData[] = "foo"; 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const bool kFromPeer = true; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class TestWriter : public QuicPacketWriter { 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // QuicPacketWriter 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual WriteResult WritePacket( 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const char* buffer, size_t buf_len, 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const IPAddressNumber& self_address, 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const IPEndPoint& peer_address, 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) QuicBlockedWriterInterface* blocked_writer) OVERRIDE { 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) QuicFramer framer(QuicSupportedVersions(), QuicTime::Zero(), true); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FramerVisitorCapturingFrames visitor; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) framer.set_visitor(&visitor); 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) QuicEncryptedPacket packet(buffer, buf_len); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(framer.ProcessPacket(packet)); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) header_ = *visitor.header(); 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return WriteResult(WRITE_STATUS_OK, packet.length()); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual bool IsWriteBlockedDataBuffered() const OVERRIDE { 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return false; 551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Returns the header from the last packet written. 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const QuicPacketHeader& header() { return header_; } 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicPacketHeader header_; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestConnection : public QuicConnection { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnection(QuicGuid guid, 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPEndPoint address, 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) QuicEpollConnectionHelper* helper, 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestWriter* writer) 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : QuicConnection(guid, address, helper, writer, false, 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) QuicSupportedVersions()) { 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SendAck() { 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicConnectionPeer::SendAck(this); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 83a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass QuicEpollConnectionHelperTest : public ::testing::Test { 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 85a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch QuicEpollConnectionHelperTest() 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : guid_(42), 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) framer_(QuicSupportedVersions(), QuicTime::Zero(), false), 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) send_algorithm_(new testing::StrictMock<MockSendAlgorithm>), 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) helper_(&epoll_server_), 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) connection_(guid_, IPEndPoint(), &helper_, &writer_), 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_(3, false, 0, kData) { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_.set_visitor(&visitor_); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_.SetSendAlgorithm(send_algorithm_); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.set_timeout_in_us(-1); 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _, _)). 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WillRepeatedly(Return(QuicTime::Delta::Zero())); 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillRepeatedly(Return( 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) QuicBandwidth::FromKBitsPerSecond(100))); 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillRepeatedly(Return( 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) QuicTime::Delta::FromMilliseconds(100))); 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) 102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) .WillByDefault(Return(true)); 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number, 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFecGroupNumber fec_group) { 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) QuicPacketHeader header; 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.public_header.version_flag = false; 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.public_header.reset_flag = false; 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.fec_flag = false; 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.entropy_flag = false; 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.packet_sequence_number = number; 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.is_in_fec_group = fec_group == 0 ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.fec_group = fec_group; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFrames frames; 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frames.push_back(QuicFrame(&frame_)); 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return framer_.BuildUnsizedDataPacket(header, frames).packet; 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicGuid guid_; 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFramer framer_; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockEpollServer epoll_server_; 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) testing::StrictMock<MockSendAlgorithm>* send_algorithm_; 1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) QuicEpollConnectionHelper helper_; 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TestWriter writer_; 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnection connection_; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) testing::StrictMock<MockConnectionVisitor> visitor_; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) QuicStreamFrame frame_; 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(QuicEpollConnectionHelperTest, DISABLED_TestRTORetransmission) { 135558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( 136558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch Return(QuicTime::Delta::Zero())); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int64 kDefaultRetransmissionTimeMs = 500; 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) char buffer[] = "foo"; 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const size_t packet_size = 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) QuicPacketCreator::StreamFramePacketOverhead( 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) framer_.version(), PACKET_8BYTE_GUID, kIncludeVersion, 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) arraysize(buffer) - 1; 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, 14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OnPacketSent(_, 1, packet_size, NOT_RETRANSMISSION, _)); 14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, packet_size)); 14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(Return(true)); 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); 1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IOVector data; 1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) data.Append(buffer, 3); 1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) connection_.SendStreamData(1, data, 0, false); 1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(1u, writer_.header().packet_sequence_number); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, 15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OnPacketSent(_, 2, packet_size, RTO_RETRANSMISSION, _)); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.AdvanceByAndCallCallbacks(kDefaultRetransmissionTimeMs * 1000); 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(2u, writer_.header().packet_sequence_number); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 162a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(QuicEpollConnectionHelperTest, InitialTimeout) { 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(connection_.connected()); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 1, _, NOT_RETRANSMISSION, 16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) HAS_RETRANSMITTABLE_DATA)); 167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillOnce( 168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Return(QuicTime::Delta::FromMicroseconds(1))); 1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(visitor_, 1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnConnectionClosed(QUIC_CONNECTION_TIMED_OUT, !kFromPeer)); 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.WaitForEventsAndExecuteCallbacks(); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(connection_.connected()); 17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000, epoll_server_.NowInUsec()); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 176a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(QuicEpollConnectionHelperTest, TimeoutAfterSend) { 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(connection_.connected()); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, epoll_server_.NowInUsec()); 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // When we send a packet, the timeout will change to 5000 + 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // kDefaultInitialTimeoutSecs. 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.AdvanceBy(5000); 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(5000, epoll_server_.NowInUsec()); 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Send an ack so we don't set the retransmission alarm. 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 1, _, NOT_RETRANSMISSION, 18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NO_RETRANSMITTABLE_DATA)); 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_.SendAck(); 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The original alarm will fire. We should not time out because we had a 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // network event at t=5000. The alarm will reregister. 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.WaitForEventsAndExecuteCallbacks(); 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000, epoll_server_.NowInUsec()); 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This time, we should time out. 1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(visitor_, 1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnConnectionClosed(QUIC_CONNECTION_TIMED_OUT, !kFromPeer)); 19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 2, _, NOT_RETRANSMISSION, 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) HAS_RETRANSMITTABLE_DATA)); 200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillOnce( 201d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Return(QuicTime::Delta::FromMicroseconds(1))); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.WaitForEventsAndExecuteCallbacks(); 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000 + 5000, 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) epoll_server_.NowInUsec()); 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(connection_.connected()); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 208a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(QuicEpollConnectionHelperTest, SendSchedulerDelayThenSend) { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test that if we send a packet with a delay, it ends up queued. 210558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( 211558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch Return(QuicTime::Delta::Zero())); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL( 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *send_algorithm_, TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce( 214d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Return(QuicTime::Delta::FromMicroseconds(1))); 21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) connection_.OnSerializedPacket( 21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SerializedPacket(1, PACKET_6BYTE_SEQUENCE_NUMBER, 21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ConstructDataPacket(1, 0), 0, 21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new RetransmittableFrames)); 21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, 22168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OnPacketSent(_, 1, _, NOT_RETRANSMISSION, _)); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, connection_.NumQueuedPackets()); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Advance the clock to fire the alarm, and configure the scheduler 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to permit the packet to be sent. 226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, 227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillRepeatedly( 228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Return(QuicTime::Delta::Zero())); 229d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(Return(true)); 230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.AdvanceByAndCallCallbacks(1); 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, connection_.NumQueuedPackets()); 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace test 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace tools 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace net 239