quic_epoll_connection_helper_test.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestConnectionHelper : public QuicEpollConnectionHelper { 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnectionHelper(int fd, EpollServer* eps) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : QuicEpollConnectionHelper(fd, eps) { 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual WriteResult WritePacketToWire( 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const QuicEncryptedPacket& packet) OVERRIDE { 44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch QuicFramer framer(QuicVersionMax(), QuicTime::Zero(), true); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FramerVisitorCapturingFrames visitor; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) framer.set_visitor(&visitor); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(framer.ProcessPacket(packet)); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) header_ = *visitor.header(); 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return WriteResult(WRITE_STATUS_OK, packet.length()); 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicPacketHeader* header() { return &header_; } 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicPacketHeader header_; 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestConnection : public QuicConnection { 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnection(QuicGuid guid, 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPEndPoint address, 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnectionHelper* helper) 63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch : QuicConnection(guid, address, helper, false, QuicVersionMax()) { 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SendAck() { 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicConnectionPeer::SendAck(this); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass QuicEpollConnectionHelperTest : public ::testing::Test { 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 77a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch QuicEpollConnectionHelperTest() 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : guid_(42), 79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch framer_(QuicVersionMax(), QuicTime::Zero(), false), 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) send_algorithm_(new testing::StrictMock<MockSendAlgorithm>), 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) helper_(new TestConnectionHelper(0, &epoll_server_)), 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_(guid_, IPEndPoint(), helper_), 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_(3, false, 0, kData) { 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_.set_visitor(&visitor_); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_.SetSendAlgorithm(send_algorithm_); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.set_timeout_in_us(-1); 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _, _)). 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WillRepeatedly(Return(QuicTime::Delta::Zero())); 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillRepeatedly(Return( 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) QuicBandwidth::FromKBitsPerSecond(100))); 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillRepeatedly(Return( 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) QuicTime::Delta::FromMilliseconds(100))); 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) .WillByDefault(Return(true)); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number, 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFecGroupNumber fec_group) { 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) QuicPacketHeader header; 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.public_header.version_flag = false; 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.public_header.reset_flag = false; 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.fec_flag = false; 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.entropy_flag = false; 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.packet_sequence_number = number; 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.is_in_fec_group = fec_group == 0 ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) header.fec_group = fec_group; 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFrames frames; 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frames.push_back(QuicFrame(&frame_)); 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return framer_.BuildUnsizedDataPacket(header, frames).packet; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicGuid guid_; 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFramer framer_; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockEpollServer epoll_server_; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) testing::StrictMock<MockSendAlgorithm>* send_algorithm_; 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnectionHelper* helper_; 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnection connection_; 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) testing::StrictMock<MockConnectionVisitor> visitor_; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) QuicStreamFrame frame_; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(QuicEpollConnectionHelperTest, DISABLED_TestRTORetransmission) { 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) //FLAGS_fake_packet_loss_percentage = 100; 127558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( 128558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch Return(QuicTime::Delta::Zero())); 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int64 kDefaultRetransmissionTimeMs = 500; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char buffer[] = "foo"; 132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const size_t packet_size = 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) QuicPacketCreator::StreamFramePacketOverhead( 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) framer_.version(), PACKET_8BYTE_GUID, kIncludeVersion, 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) arraysize(buffer) - 1; 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OnPacketSent(_, 1, packet_size, NOT_RETRANSMISSION, _)); 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, packet_size)); 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(Return(true)); 14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); 143d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) struct iovec iov = {const_cast<char*>(buffer), 144d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static_cast<size_t>(3)}; 145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) connection_.SendvStreamData(1, &iov, 1, 0, false); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, helper_->header()->packet_sequence_number); 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, 14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OnPacketSent(_, 2, packet_size, RTO_RETRANSMISSION, _)); 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.AdvanceByAndCallCallbacks(kDefaultRetransmissionTimeMs * 1000); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, helper_->header()->packet_sequence_number); 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 154a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(QuicEpollConnectionHelperTest, InitialTimeout) { 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(connection_.connected()); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 1, _, NOT_RETRANSMISSION, 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) HAS_RETRANSMITTABLE_DATA)); 159d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillOnce( 160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Return(QuicTime::Delta::FromMicroseconds(1))); 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, !kFromPeer)); 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.WaitForEventsAndExecuteCallbacks(); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(connection_.connected()); 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000, epoll_server_.NowInUsec()); 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 167a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(QuicEpollConnectionHelperTest, TimeoutAfterSend) { 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(connection_.connected()); 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, epoll_server_.NowInUsec()); 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // When we send a packet, the timeout will change to 5000 + 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // kDefaultInitialTimeoutSecs. 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.AdvanceBy(5000); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(5000, epoll_server_.NowInUsec()); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Send an ack so we don't set the retransmission alarm. 17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 1, _, NOT_RETRANSMISSION, 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NO_RETRANSMITTABLE_DATA)); 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_.SendAck(); 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The original alarm will fire. We should not time out because we had a 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // network event at t=5000. The alarm will reregister. 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.WaitForEventsAndExecuteCallbacks(); 18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000, epoll_server_.NowInUsec()); 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This time, we should time out. 18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, !kFromPeer)); 18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 2, _, NOT_RETRANSMISSION, 18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) HAS_RETRANSMITTABLE_DATA)); 190d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillOnce( 191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Return(QuicTime::Delta::FromMicroseconds(1))); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.WaitForEventsAndExecuteCallbacks(); 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000 + 5000, 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) epoll_server_.NowInUsec()); 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(connection_.connected()); 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 198a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(QuicEpollConnectionHelperTest, SendSchedulerDelayThenSend) { 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test that if we send a packet with a delay, it ends up queued. 200558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( 201558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch Return(QuicTime::Delta::Zero())); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL( 203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *send_algorithm_, TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce( 204d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Return(QuicTime::Delta::FromMicroseconds(1))); 20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) connection_.OnSerializedPacket( 20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SerializedPacket(1, PACKET_6BYTE_SEQUENCE_NUMBER, 20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ConstructDataPacket(1, 0), 0, 20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new RetransmittableFrames)); 20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, 21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OnPacketSent(_, 1, _, NOT_RETRANSMISSION, _)); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, connection_.NumQueuedPackets()); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Advance the clock to fire the alarm, and configure the scheduler 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to permit the packet to be sent. 216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillRepeatedly( 218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Return(QuicTime::Delta::Zero())); 219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(Return(true)); 220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.AdvanceByAndCallCallbacks(1); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, connection_.NumQueuedPackets()); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace test 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace tools 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace net 229