quic_epoll_connection_helper_test.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
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" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/quic_framer.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/test_tools/quic_connection_peer.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/test_tools/quic_test_utils.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/test_tools/mock_epoll_server.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using net::test::FramerVisitorCapturingFrames; 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using net::test::MockSendAlgorithm; 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using net::test::QuicConnectionPeer; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using net::test::MockConnectionVisitor; 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using net::tools::test::MockEpollServer; 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::_; 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::Return; 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net { 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace test { 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char data1[] = "foo"; 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const bool kFromPeer = true; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestConnectionHelper : public QuicEpollConnectionHelper { 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnectionHelper(int fd, EpollServer* eps) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : QuicEpollConnectionHelper(fd, eps) { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual int WritePacketToWire(const QuicEncryptedPacket& packet, 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int* error) OVERRIDE { 42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch QuicFramer framer(QuicVersionMax(), QuicTime::Zero(), true); 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FramerVisitorCapturingFrames visitor; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) framer.set_visitor(&visitor); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(framer.ProcessPacket(packet)); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) header_ = *visitor.header(); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *error = 0; 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return packet.length(); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicPacketHeader* header() { return &header_; } 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicPacketHeader header_; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestConnection : public QuicConnection { 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnection(QuicGuid guid, 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPEndPoint address, 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnectionHelper* helper) 62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch : QuicConnection(guid, address, helper, false, QuicVersionMax()) { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SendAck() { 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicConnectionPeer::SendAck(this); 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) using QuicConnection::SendOrQueuePacket; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass QuicEpollConnectionHelperTest : public ::testing::Test { 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 78a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch QuicEpollConnectionHelperTest() 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : guid_(42), 80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch framer_(QuicVersionMax(), QuicTime::Zero(), false), 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) send_algorithm_(new testing::StrictMock<MockSendAlgorithm>), 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) helper_(new TestConnectionHelper(0, &epoll_server_)), 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_(guid_, IPEndPoint(), helper_), 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame1_(1, false, 0, data1) { 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_.set_visitor(&visitor_); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_.SetSendAlgorithm(send_algorithm_); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.set_timeout_in_us(-1); 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _, _)). 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WillRepeatedly(Return(QuicTime::Delta::Zero())); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number, 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFecGroupNumber fec_group) { 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) header_.public_header.version_flag = false; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) header_.public_header.reset_flag = false; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) header_.fec_flag = false; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) header_.entropy_flag = false; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) header_.packet_sequence_number = number; 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) header_.is_in_fec_group = fec_group == 0 ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) header_.fec_group = fec_group; 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFrames frames; 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFrame frame(&frame1_); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frames.push_back(frame); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return framer_.ConstructFrameDataPacket(header_, frames).packet; 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicGuid guid_; 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFramer framer_; 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockEpollServer epoll_server_; 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) testing::StrictMock<MockSendAlgorithm>* send_algorithm_; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnectionHelper* helper_; 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestConnection connection_; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) testing::StrictMock<MockConnectionVisitor> visitor_; 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicPacketHeader header_; 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicStreamFrame frame1_; 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(QuicEpollConnectionHelperTest, DISABLED_TestRetransmission) { 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) //FLAGS_fake_packet_loss_percentage = 100; 123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( 124558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch Return(QuicTime::Delta::Zero())); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int64 kDefaultRetransmissionTimeMs = 500; 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char buffer[] = "foo"; 128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const size_t packet_size = 129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetPacketHeaderSize(PACKET_8BYTE_GUID, kIncludeVersion, 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicFramer::GetMinStreamFrameSize() + arraysize(buffer) - 1; 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SentPacket(_, 1, packet_size, NOT_RETRANSMISSION)); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, packet_size)); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_.SendStreamData(1, buffer, 0, false); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, helper_->header()->packet_sequence_number); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SentPacket(_, 2, packet_size, IS_RETRANSMISSION)); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.AdvanceByAndCallCallbacks(kDefaultRetransmissionTimeMs * 1000); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, helper_->header()->packet_sequence_number); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(QuicEpollConnectionHelperTest, InitialTimeout) { 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(connection_.connected()); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, NOT_RETRANSMISSION)); 14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, !kFromPeer)); 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.WaitForEventsAndExecuteCallbacks(); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(connection_.connected()); 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000, epoll_server_.NowInUsec()); 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 154a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(QuicEpollConnectionHelperTest, TimeoutAfterSend) { 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(connection_.connected()); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, epoll_server_.NowInUsec()); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // When we send a packet, the timeout will change to 5000 + 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // kDefaultInitialTimeoutSecs. 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.AdvanceBy(5000); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(5000, epoll_server_.NowInUsec()); 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Send an ack so we don't set the retransmission alarm. 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, NOT_RETRANSMISSION)); 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_.SendAck(); 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The original alarm will fire. We should not time out because we had a 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // network event at t=5000. The alarm will reregister. 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.WaitForEventsAndExecuteCallbacks(); 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000, epoll_server_.NowInUsec()); 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This time, we should time out. 17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, !kFromPeer)); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, SentPacket(_, 2, _, NOT_RETRANSMISSION)); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.WaitForEventsAndExecuteCallbacks(); 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000 + 5000, 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) epoll_server_.NowInUsec()); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(connection_.connected()); 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 181a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(QuicEpollConnectionHelperTest, SendSchedulerDelayThenSend) { 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Test that if we send a packet with a delay, it ends up queued. 183558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( 184558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch Return(QuicTime::Delta::Zero())); 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicPacket* packet = ConstructDataPacket(1, 0); 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL( 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *send_algorithm_, TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce( 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) testing::Return(QuicTime::Delta::FromMicroseconds(1))); 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection_.SendOrQueuePacket(ENCRYPTION_NONE, 1, packet, 0, 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HAS_RETRANSMITTABLE_DATA); 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, NOT_RETRANSMISSION)); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, connection_.NumQueuedPackets()); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Advance the clock to fire the alarm, and configure the scheduler 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to permit the packet to be sent. 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, NOT_RETRANSMISSION, _, _)). 197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(testing::Return(true)); 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) epoll_server_.AdvanceByAndCallCallbacks(1); 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0u, connection_.NumQueuedPackets()); 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace test 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace tools 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace net 207