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