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