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