1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Common utilities for Quic tests
7 #ifndef NET_TOOLS_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_
8 #define NET_TOOLS_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_
12 #include "base/strings/string_piece.h"
13 #include "net/quic/crypto/cached_network_parameters.h"
14 #include "net/quic/quic_connection.h"
15 #include "net/quic/quic_packet_writer.h"
16 #include "net/quic/quic_session.h"
17 #include "net/spdy/spdy_framer.h"
18 #include "net/tools/quic/quic_dispatcher.h"
19 #include "net/tools/quic/quic_per_connection_packet_writer.h"
20 #include "net/tools/quic/quic_server_session.h"
21 #include "testing/gmock/include/gmock/gmock.h"
31 static const QuicConnectionId kTestConnectionId
= 42;
32 static const uint16 kTestPort
= 123;
33 static const uint32 kInitialStreamFlowControlWindowForTest
=
35 static const uint32 kInitialSessionFlowControlWindowForTest
=
38 // Testing convenience method to construct a QuicAckFrame with |num_nack_ranges|
39 // nack ranges of width 1 packet, starting from |least_unacked|.
40 QuicAckFrame
MakeAckFrameWithNackRanges(size_t num_nack_ranges
,
41 QuicPacketSequenceNumber least_unacked
);
43 class NiceMockPacketWriterFactory
: public QuicConnection::PacketWriterFactory
{
45 NiceMockPacketWriterFactory() {}
46 ~NiceMockPacketWriterFactory() override
{}
48 QuicPacketWriter
* Create(QuicConnection
* /*connection*/) const override
;
51 DISALLOW_COPY_AND_ASSIGN(NiceMockPacketWriterFactory
);
54 class MockConnection
: public QuicConnection
{
56 // Uses a MockHelper, ConnectionId of 42, and 127.0.0.1:123.
57 explicit MockConnection(bool is_server
);
59 // Uses a MockHelper, ConnectionId of 42, and 127.0.0.1:123.
60 MockConnection(bool is_server
, bool is_secure
);
62 // Uses a MockHelper, ConnectionId of 42.
63 MockConnection(IPEndPoint address
, bool is_server
);
65 // Uses a MockHelper, and 127.0.0.1:123
66 MockConnection(QuicConnectionId connection_id
, bool is_server
);
68 // Uses a Mock helper, ConnectionId of 42, and 127.0.0.1:123.
69 MockConnection(bool is_server
, const QuicVersionVector
& supported_versions
);
71 virtual ~MockConnection();
73 // If the constructor that uses a MockHelper has been used then this method
74 // will advance the time of the MockClock.
75 void AdvanceTime(QuicTime::Delta delta
);
77 MOCK_METHOD3(ProcessUdpPacket
, void(const IPEndPoint
& self_address
,
78 const IPEndPoint
& peer_address
,
79 const QuicEncryptedPacket
& packet
));
80 MOCK_METHOD1(SendConnectionClose
, void(QuicErrorCode error
));
81 MOCK_METHOD2(SendConnectionCloseWithDetails
, void(
83 const std::string
& details
));
84 MOCK_METHOD2(SendConnectionClosePacket
, void(QuicErrorCode error
,
85 const std::string
& details
));
86 MOCK_METHOD3(SendRstStream
, void(QuicStreamId id
,
87 QuicRstStreamErrorCode error
,
88 QuicStreamOffset bytes_written
));
89 MOCK_METHOD3(SendGoAway
, void(QuicErrorCode error
,
90 QuicStreamId last_good_stream_id
,
91 const std::string
& reason
));
92 MOCK_METHOD1(SendBlocked
, void(QuicStreamId id
));
93 MOCK_METHOD2(SendWindowUpdate
, void(QuicStreamId id
,
94 QuicStreamOffset byte_offset
));
95 MOCK_METHOD0(OnCanWrite
, void());
96 MOCK_CONST_METHOD0(HasPendingWrites
, bool());
98 MOCK_METHOD1(ResumeConnectionState
, bool(const CachedNetworkParameters
&));
100 void ReallyProcessUdpPacket(const IPEndPoint
& self_address
,
101 const IPEndPoint
& peer_address
,
102 const QuicEncryptedPacket
& packet
) {
103 QuicConnection::ProcessUdpPacket(self_address
, peer_address
, packet
);
106 virtual bool OnProtocolVersionMismatch(QuicVersion version
) override
{
111 scoped_ptr
<QuicConnectionHelperInterface
> helper_
;
113 DISALLOW_COPY_AND_ASSIGN(MockConnection
);
116 class TestSession
: public QuicSession
{
118 TestSession(QuicConnection
* connection
, const QuicConfig
& config
);
119 virtual ~TestSession();
121 MOCK_METHOD1(CreateIncomingDataStream
, QuicDataStream
*(QuicStreamId id
));
122 MOCK_METHOD0(CreateOutgoingDataStream
, QuicDataStream
*());
124 void SetCryptoStream(QuicCryptoStream
* stream
);
126 virtual QuicCryptoStream
* GetCryptoStream() override
;
129 QuicCryptoStream
* crypto_stream_
;
131 DISALLOW_COPY_AND_ASSIGN(TestSession
);
134 class MockPacketWriter
: public QuicPacketWriter
{
137 virtual ~MockPacketWriter();
139 MOCK_METHOD4(WritePacket
,
140 WriteResult(const char* buffer
,
142 const IPAddressNumber
& self_address
,
143 const IPEndPoint
& peer_address
));
144 MOCK_CONST_METHOD0(IsWriteBlockedDataBuffered
, bool());
145 MOCK_CONST_METHOD0(IsWriteBlocked
, bool());
146 MOCK_METHOD0(SetWritable
, void());
149 DISALLOW_COPY_AND_ASSIGN(MockPacketWriter
);
152 class MockQuicServerSessionVisitor
: public QuicServerSessionVisitor
{
154 MockQuicServerSessionVisitor();
155 virtual ~MockQuicServerSessionVisitor();
156 MOCK_METHOD2(OnConnectionClosed
, void(QuicConnectionId connection_id
,
157 QuicErrorCode error
));
158 MOCK_METHOD1(OnWriteBlocked
,
159 void(QuicBlockedWriterInterface
* blocked_writer
));
162 DISALLOW_COPY_AND_ASSIGN(MockQuicServerSessionVisitor
);
165 class MockAckNotifierDelegate
: public QuicAckNotifier::DelegateInterface
{
167 MockAckNotifierDelegate();
169 MOCK_METHOD5(OnAckNotification
, void(int num_original_packets
,
170 int num_original_bytes
,
171 int num_retransmitted_packets
,
172 int num_retransmitted_bytes
,
173 QuicTime::Delta delta_largest_observed
));
176 // Object is ref counted.
177 virtual ~MockAckNotifierDelegate();
179 DISALLOW_COPY_AND_ASSIGN(MockAckNotifierDelegate
);
182 // Creates per-connection packet writers that register themselves with the
183 // TestWriterFactory on each write so that TestWriterFactory::OnPacketSent can
184 // be routed to the appropriate QuicConnection.
185 class TestWriterFactory
: public QuicDispatcher::PacketWriterFactory
{
188 ~TestWriterFactory() override
;
190 QuicPacketWriter
* Create(QuicPacketWriter
* writer
,
191 QuicConnection
* connection
) override
;
193 // Calls OnPacketSent on the last QuicConnection to write through one of the
194 // packet writers created by this factory.
195 void OnPacketSent(WriteResult result
);
198 class PerConnectionPacketWriter
: public QuicPerConnectionPacketWriter
{
200 PerConnectionPacketWriter(TestWriterFactory
* factory
,
201 QuicPacketWriter
* writer
,
202 QuicConnection
* connection
);
203 ~PerConnectionPacketWriter() override
;
205 WriteResult
WritePacket(const char* buffer
,
207 const IPAddressNumber
& self_address
,
208 const IPEndPoint
& peer_address
) override
;
211 TestWriterFactory
* factory_
;
214 // If an asynchronous write is happening and |writer| gets deleted, this
215 // clears the pointer to it to prevent use-after-free.
216 void Unregister(PerConnectionPacketWriter
* writer
);
218 PerConnectionPacketWriter
* current_writer_
;
225 #endif // NET_TOOLS_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_