xref: /aosp_15_r20/external/cronet/net/socket/socket_test_util.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_SOCKET_SOCKET_TEST_UTIL_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_SOCKET_TEST_UTIL_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include <cstring>
12*6777b538SAndroid Build Coastguard Worker #include <memory>
13*6777b538SAndroid Build Coastguard Worker #include <optional>
14*6777b538SAndroid Build Coastguard Worker #include <string>
15*6777b538SAndroid Build Coastguard Worker #include <string_view>
16*6777b538SAndroid Build Coastguard Worker #include <utility>
17*6777b538SAndroid Build Coastguard Worker #include <vector>
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h"
27*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
28*6777b538SAndroid Build Coastguard Worker #include "net/base/address_list.h"
29*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h"
30*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h"
31*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
32*6777b538SAndroid Build Coastguard Worker #include "net/base/test_completion_callback.h"
33*6777b538SAndroid Build Coastguard Worker #include "net/http/http_auth_controller.h"
34*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h"
35*6777b538SAndroid Build Coastguard Worker #include "net/socket/client_socket_factory.h"
36*6777b538SAndroid Build Coastguard Worker #include "net/socket/client_socket_handle.h"
37*6777b538SAndroid Build Coastguard Worker #include "net/socket/client_socket_pool.h"
38*6777b538SAndroid Build Coastguard Worker #include "net/socket/datagram_client_socket.h"
39*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_performance_watcher.h"
40*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_tag.h"
41*6777b538SAndroid Build Coastguard Worker #include "net/socket/ssl_client_socket.h"
42*6777b538SAndroid Build Coastguard Worker #include "net/socket/transport_client_socket.h"
43*6777b538SAndroid Build Coastguard Worker #include "net/socket/transport_client_socket_pool.h"
44*6777b538SAndroid Build Coastguard Worker #include "net/ssl/ssl_config_service.h"
45*6777b538SAndroid Build Coastguard Worker #include "net/ssl/ssl_info.h"
46*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker namespace base {
49*6777b538SAndroid Build Coastguard Worker class RunLoop;
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker namespace net {
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker struct CommonConnectJobParams;
55*6777b538SAndroid Build Coastguard Worker class NetLog;
56*6777b538SAndroid Build Coastguard Worker struct NetworkTrafficAnnotationTag;
57*6777b538SAndroid Build Coastguard Worker class X509Certificate;
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker const handles::NetworkHandle kDefaultNetworkForTests = 1;
60*6777b538SAndroid Build Coastguard Worker const handles::NetworkHandle kNewNetworkForTests = 2;
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker enum {
63*6777b538SAndroid Build Coastguard Worker   // A private network error code used by the socket test utility classes.
64*6777b538SAndroid Build Coastguard Worker   // If the |result| member of a MockRead is
65*6777b538SAndroid Build Coastguard Worker   // ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ, that MockRead is just a
66*6777b538SAndroid Build Coastguard Worker   // marker that indicates the peer will close the connection after the next
67*6777b538SAndroid Build Coastguard Worker   // MockRead.  The other members of that MockRead are ignored.
68*6777b538SAndroid Build Coastguard Worker   ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ = -10000,
69*6777b538SAndroid Build Coastguard Worker };
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker class AsyncSocket;
72*6777b538SAndroid Build Coastguard Worker class MockClientSocket;
73*6777b538SAndroid Build Coastguard Worker class SSLClientSocket;
74*6777b538SAndroid Build Coastguard Worker class StreamSocket;
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker enum IoMode { ASYNC, SYNCHRONOUS };
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker struct MockConnect {
79*6777b538SAndroid Build Coastguard Worker   // Asynchronous connection success.
80*6777b538SAndroid Build Coastguard Worker   // Creates a MockConnect with |mode| ASYC, |result| OK, and
81*6777b538SAndroid Build Coastguard Worker   // |peer_addr| 192.0.2.33.
82*6777b538SAndroid Build Coastguard Worker   MockConnect();
83*6777b538SAndroid Build Coastguard Worker   // Creates a MockConnect with the specified mode and result, with
84*6777b538SAndroid Build Coastguard Worker   // |peer_addr| 192.0.2.33.
85*6777b538SAndroid Build Coastguard Worker   MockConnect(IoMode io_mode, int r);
86*6777b538SAndroid Build Coastguard Worker   MockConnect(IoMode io_mode, int r, IPEndPoint addr);
87*6777b538SAndroid Build Coastguard Worker   MockConnect(IoMode io_mode, int r, IPEndPoint addr, bool first_attempt_fails);
88*6777b538SAndroid Build Coastguard Worker   ~MockConnect();
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker   IoMode mode;
91*6777b538SAndroid Build Coastguard Worker   int result;
92*6777b538SAndroid Build Coastguard Worker   IPEndPoint peer_addr;
93*6777b538SAndroid Build Coastguard Worker   bool first_attempt_fails = false;
94*6777b538SAndroid Build Coastguard Worker };
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker struct MockConfirm {
97*6777b538SAndroid Build Coastguard Worker   // Asynchronous confirm success.
98*6777b538SAndroid Build Coastguard Worker   // Creates a MockConfirm with |mode| ASYC and |result| OK.
99*6777b538SAndroid Build Coastguard Worker   MockConfirm();
100*6777b538SAndroid Build Coastguard Worker   // Creates a MockConfirm with the specified mode and result.
101*6777b538SAndroid Build Coastguard Worker   MockConfirm(IoMode io_mode, int r);
102*6777b538SAndroid Build Coastguard Worker   ~MockConfirm();
103*6777b538SAndroid Build Coastguard Worker 
104*6777b538SAndroid Build Coastguard Worker   IoMode mode;
105*6777b538SAndroid Build Coastguard Worker   int result;
106*6777b538SAndroid Build Coastguard Worker };
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker // MockRead and MockWrite shares the same interface and members, but we'd like
109*6777b538SAndroid Build Coastguard Worker // to have distinct types because we don't want to have them used
110*6777b538SAndroid Build Coastguard Worker // interchangably. To do this, a struct template is defined, and MockRead and
111*6777b538SAndroid Build Coastguard Worker // MockWrite are instantiated by using this template. Template parameter |type|
112*6777b538SAndroid Build Coastguard Worker // is not used in the struct definition (it purely exists for creating a new
113*6777b538SAndroid Build Coastguard Worker // type).
114*6777b538SAndroid Build Coastguard Worker //
115*6777b538SAndroid Build Coastguard Worker // |data| in MockRead and MockWrite has different meanings: |data| in MockRead
116*6777b538SAndroid Build Coastguard Worker // is the data returned from the socket when MockTCPClientSocket::Read() is
117*6777b538SAndroid Build Coastguard Worker // attempted, while |data| in MockWrite is the expected data that should be
118*6777b538SAndroid Build Coastguard Worker // given in MockTCPClientSocket::Write().
119*6777b538SAndroid Build Coastguard Worker enum MockReadWriteType { MOCK_READ, MOCK_WRITE };
120*6777b538SAndroid Build Coastguard Worker 
121*6777b538SAndroid Build Coastguard Worker template <MockReadWriteType type>
122*6777b538SAndroid Build Coastguard Worker struct MockReadWrite {
123*6777b538SAndroid Build Coastguard Worker   // Flag to indicate that the message loop should be terminated.
124*6777b538SAndroid Build Coastguard Worker   enum { STOPLOOP = 1 << 31 };
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker   // Default
MockReadWriteMockReadWrite127*6777b538SAndroid Build Coastguard Worker   MockReadWrite()
128*6777b538SAndroid Build Coastguard Worker       : mode(SYNCHRONOUS),
129*6777b538SAndroid Build Coastguard Worker         result(0),
130*6777b538SAndroid Build Coastguard Worker         data(nullptr),
131*6777b538SAndroid Build Coastguard Worker         data_len(0),
132*6777b538SAndroid Build Coastguard Worker         sequence_number(0),
133*6777b538SAndroid Build Coastguard Worker         tos(0) {}
134*6777b538SAndroid Build Coastguard Worker 
135*6777b538SAndroid Build Coastguard Worker   // Read/write failure (no data).
MockReadWriteMockReadWrite136*6777b538SAndroid Build Coastguard Worker   MockReadWrite(IoMode io_mode, int result)
137*6777b538SAndroid Build Coastguard Worker       : mode(io_mode),
138*6777b538SAndroid Build Coastguard Worker         result(result),
139*6777b538SAndroid Build Coastguard Worker         data(nullptr),
140*6777b538SAndroid Build Coastguard Worker         data_len(0),
141*6777b538SAndroid Build Coastguard Worker         sequence_number(0),
142*6777b538SAndroid Build Coastguard Worker         tos(0) {}
143*6777b538SAndroid Build Coastguard Worker 
144*6777b538SAndroid Build Coastguard Worker   // Read/write failure (no data), with sequence information.
MockReadWriteMockReadWrite145*6777b538SAndroid Build Coastguard Worker   MockReadWrite(IoMode io_mode, int result, int seq)
146*6777b538SAndroid Build Coastguard Worker       : mode(io_mode),
147*6777b538SAndroid Build Coastguard Worker         result(result),
148*6777b538SAndroid Build Coastguard Worker         data(nullptr),
149*6777b538SAndroid Build Coastguard Worker         data_len(0),
150*6777b538SAndroid Build Coastguard Worker         sequence_number(seq),
151*6777b538SAndroid Build Coastguard Worker         tos(0) {}
152*6777b538SAndroid Build Coastguard Worker 
153*6777b538SAndroid Build Coastguard Worker   // Asynchronous read/write success (inferred data length).
MockReadWriteMockReadWrite154*6777b538SAndroid Build Coastguard Worker   explicit MockReadWrite(const char* data)
155*6777b538SAndroid Build Coastguard Worker       : mode(ASYNC),
156*6777b538SAndroid Build Coastguard Worker         result(0),
157*6777b538SAndroid Build Coastguard Worker         data(data),
158*6777b538SAndroid Build Coastguard Worker         data_len(strlen(data)),
159*6777b538SAndroid Build Coastguard Worker         sequence_number(0),
160*6777b538SAndroid Build Coastguard Worker         tos(0) {}
161*6777b538SAndroid Build Coastguard Worker 
162*6777b538SAndroid Build Coastguard Worker   // Read/write success (inferred data length).
MockReadWriteMockReadWrite163*6777b538SAndroid Build Coastguard Worker   MockReadWrite(IoMode io_mode, const char* data)
164*6777b538SAndroid Build Coastguard Worker       : mode(io_mode),
165*6777b538SAndroid Build Coastguard Worker         result(0),
166*6777b538SAndroid Build Coastguard Worker         data(data),
167*6777b538SAndroid Build Coastguard Worker         data_len(strlen(data)),
168*6777b538SAndroid Build Coastguard Worker         sequence_number(0),
169*6777b538SAndroid Build Coastguard Worker         tos(0) {}
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker   // Read/write success.
MockReadWriteMockReadWrite172*6777b538SAndroid Build Coastguard Worker   MockReadWrite(IoMode io_mode, const char* data, int data_len)
173*6777b538SAndroid Build Coastguard Worker       : mode(io_mode),
174*6777b538SAndroid Build Coastguard Worker         result(0),
175*6777b538SAndroid Build Coastguard Worker         data(data),
176*6777b538SAndroid Build Coastguard Worker         data_len(data_len),
177*6777b538SAndroid Build Coastguard Worker         sequence_number(0),
178*6777b538SAndroid Build Coastguard Worker         tos(0) {}
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker   // Read/write success (inferred data length) with sequence information.
MockReadWriteMockReadWrite181*6777b538SAndroid Build Coastguard Worker   MockReadWrite(IoMode io_mode, int seq, const char* data)
182*6777b538SAndroid Build Coastguard Worker       : mode(io_mode),
183*6777b538SAndroid Build Coastguard Worker         result(0),
184*6777b538SAndroid Build Coastguard Worker         data(data),
185*6777b538SAndroid Build Coastguard Worker         data_len(strlen(data)),
186*6777b538SAndroid Build Coastguard Worker         sequence_number(seq),
187*6777b538SAndroid Build Coastguard Worker         tos(0) {}
188*6777b538SAndroid Build Coastguard Worker 
189*6777b538SAndroid Build Coastguard Worker   // Read/write success with sequence information.
MockReadWriteMockReadWrite190*6777b538SAndroid Build Coastguard Worker   MockReadWrite(IoMode io_mode, const char* data, int data_len, int seq)
191*6777b538SAndroid Build Coastguard Worker       : mode(io_mode),
192*6777b538SAndroid Build Coastguard Worker         result(0),
193*6777b538SAndroid Build Coastguard Worker         data(data),
194*6777b538SAndroid Build Coastguard Worker         data_len(data_len),
195*6777b538SAndroid Build Coastguard Worker         sequence_number(seq),
196*6777b538SAndroid Build Coastguard Worker         tos(0) {}
197*6777b538SAndroid Build Coastguard Worker 
198*6777b538SAndroid Build Coastguard Worker   // Read/write success with sequence and TOS information.
MockReadWriteMockReadWrite199*6777b538SAndroid Build Coastguard Worker   MockReadWrite(IoMode io_mode,
200*6777b538SAndroid Build Coastguard Worker                 const char* data,
201*6777b538SAndroid Build Coastguard Worker                 int data_len,
202*6777b538SAndroid Build Coastguard Worker                 int seq,
203*6777b538SAndroid Build Coastguard Worker                 uint8_t tos_byte)
204*6777b538SAndroid Build Coastguard Worker       : mode(io_mode),
205*6777b538SAndroid Build Coastguard Worker         result(0),
206*6777b538SAndroid Build Coastguard Worker         data(data),
207*6777b538SAndroid Build Coastguard Worker         data_len(data_len),
208*6777b538SAndroid Build Coastguard Worker         sequence_number(seq),
209*6777b538SAndroid Build Coastguard Worker         tos(tos_byte) {}
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker   IoMode mode;
212*6777b538SAndroid Build Coastguard Worker   int result;
213*6777b538SAndroid Build Coastguard Worker   const char* data;
214*6777b538SAndroid Build Coastguard Worker   int data_len;
215*6777b538SAndroid Build Coastguard Worker 
216*6777b538SAndroid Build Coastguard Worker   // For data providers that only allows reads to occur in a particular
217*6777b538SAndroid Build Coastguard Worker   // sequence.  If a read occurs before the given |sequence_number| is reached,
218*6777b538SAndroid Build Coastguard Worker   // an ERR_IO_PENDING is returned.
219*6777b538SAndroid Build Coastguard Worker   int sequence_number;  // The sequence number at which a read is allowed
220*6777b538SAndroid Build Coastguard Worker                         // to occur.
221*6777b538SAndroid Build Coastguard Worker 
222*6777b538SAndroid Build Coastguard Worker   // The TOS byte of the datagram, for datagram sockets only.
223*6777b538SAndroid Build Coastguard Worker   uint8_t tos;
224*6777b538SAndroid Build Coastguard Worker };
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker typedef MockReadWrite<MOCK_READ> MockRead;
227*6777b538SAndroid Build Coastguard Worker typedef MockReadWrite<MOCK_WRITE> MockWrite;
228*6777b538SAndroid Build Coastguard Worker 
229*6777b538SAndroid Build Coastguard Worker struct MockWriteResult {
MockWriteResultMockWriteResult230*6777b538SAndroid Build Coastguard Worker   MockWriteResult(IoMode io_mode, int result) : mode(io_mode), result(result) {}
231*6777b538SAndroid Build Coastguard Worker 
232*6777b538SAndroid Build Coastguard Worker   IoMode mode;
233*6777b538SAndroid Build Coastguard Worker   int result;
234*6777b538SAndroid Build Coastguard Worker };
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker class SocketDataPrinter {
237*6777b538SAndroid Build Coastguard Worker  public:
238*6777b538SAndroid Build Coastguard Worker   ~SocketDataPrinter() = default;
239*6777b538SAndroid Build Coastguard Worker 
240*6777b538SAndroid Build Coastguard Worker   // Prints the write in |data| using some sort of protocol-specific
241*6777b538SAndroid Build Coastguard Worker   // format.
242*6777b538SAndroid Build Coastguard Worker   virtual std::string PrintWrite(const std::string& data) = 0;
243*6777b538SAndroid Build Coastguard Worker };
244*6777b538SAndroid Build Coastguard Worker 
245*6777b538SAndroid Build Coastguard Worker // The SocketDataProvider is an interface used by the MockClientSocket
246*6777b538SAndroid Build Coastguard Worker // for getting data about individual reads and writes on the socket.  Can be
247*6777b538SAndroid Build Coastguard Worker // used with at most one socket at a time.
248*6777b538SAndroid Build Coastguard Worker // TODO(mmenke):  Do these really need to be re-useable?
249*6777b538SAndroid Build Coastguard Worker class SocketDataProvider {
250*6777b538SAndroid Build Coastguard Worker  public:
251*6777b538SAndroid Build Coastguard Worker   SocketDataProvider();
252*6777b538SAndroid Build Coastguard Worker 
253*6777b538SAndroid Build Coastguard Worker   SocketDataProvider(const SocketDataProvider&) = delete;
254*6777b538SAndroid Build Coastguard Worker   SocketDataProvider& operator=(const SocketDataProvider&) = delete;
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker   virtual ~SocketDataProvider();
257*6777b538SAndroid Build Coastguard Worker 
258*6777b538SAndroid Build Coastguard Worker   // Returns the buffer and result code for the next simulated read.
259*6777b538SAndroid Build Coastguard Worker   // If the |MockRead.result| is ERR_IO_PENDING, it informs the caller
260*6777b538SAndroid Build Coastguard Worker   // that it will be called via the AsyncSocket::OnReadComplete()
261*6777b538SAndroid Build Coastguard Worker   // function at a later time.
262*6777b538SAndroid Build Coastguard Worker   virtual MockRead OnRead() = 0;
263*6777b538SAndroid Build Coastguard Worker   virtual MockWriteResult OnWrite(const std::string& data) = 0;
264*6777b538SAndroid Build Coastguard Worker   virtual bool AllReadDataConsumed() const = 0;
265*6777b538SAndroid Build Coastguard Worker   virtual bool AllWriteDataConsumed() const = 0;
CancelPendingRead()266*6777b538SAndroid Build Coastguard Worker   virtual void CancelPendingRead() {}
267*6777b538SAndroid Build Coastguard Worker 
268*6777b538SAndroid Build Coastguard Worker   // Returns the last set receive buffer size, or -1 if never set.
receive_buffer_size()269*6777b538SAndroid Build Coastguard Worker   int receive_buffer_size() const { return receive_buffer_size_; }
set_receive_buffer_size(int receive_buffer_size)270*6777b538SAndroid Build Coastguard Worker   void set_receive_buffer_size(int receive_buffer_size) {
271*6777b538SAndroid Build Coastguard Worker     receive_buffer_size_ = receive_buffer_size;
272*6777b538SAndroid Build Coastguard Worker   }
273*6777b538SAndroid Build Coastguard Worker 
274*6777b538SAndroid Build Coastguard Worker   // Returns the last set send buffer size, or -1 if never set.
send_buffer_size()275*6777b538SAndroid Build Coastguard Worker   int send_buffer_size() const { return send_buffer_size_; }
set_send_buffer_size(int send_buffer_size)276*6777b538SAndroid Build Coastguard Worker   void set_send_buffer_size(int send_buffer_size) {
277*6777b538SAndroid Build Coastguard Worker     send_buffer_size_ = send_buffer_size;
278*6777b538SAndroid Build Coastguard Worker   }
279*6777b538SAndroid Build Coastguard Worker 
280*6777b538SAndroid Build Coastguard Worker   // Returns the last set value of TCP no delay, or false if never set.
no_delay()281*6777b538SAndroid Build Coastguard Worker   bool no_delay() const { return no_delay_; }
set_no_delay(bool no_delay)282*6777b538SAndroid Build Coastguard Worker   void set_no_delay(bool no_delay) { no_delay_ = no_delay; }
283*6777b538SAndroid Build Coastguard Worker 
284*6777b538SAndroid Build Coastguard Worker   // Returns whether TCP keepalives were enabled or not. Returns kDefault by
285*6777b538SAndroid Build Coastguard Worker   // default.
286*6777b538SAndroid Build Coastguard Worker   enum class KeepAliveState { kEnabled, kDisabled, kDefault };
keep_alive_state()287*6777b538SAndroid Build Coastguard Worker   KeepAliveState keep_alive_state() const { return keep_alive_state_; }
288*6777b538SAndroid Build Coastguard Worker   // Last set TCP keepalive delay.
keep_alive_delay()289*6777b538SAndroid Build Coastguard Worker   int keep_alive_delay() const { return keep_alive_delay_; }
set_keep_alive(bool enable,int delay)290*6777b538SAndroid Build Coastguard Worker   void set_keep_alive(bool enable, int delay) {
291*6777b538SAndroid Build Coastguard Worker     keep_alive_state_ =
292*6777b538SAndroid Build Coastguard Worker         enable ? KeepAliveState::kEnabled : KeepAliveState::kDisabled;
293*6777b538SAndroid Build Coastguard Worker     keep_alive_delay_ = delay;
294*6777b538SAndroid Build Coastguard Worker   }
295*6777b538SAndroid Build Coastguard Worker 
296*6777b538SAndroid Build Coastguard Worker   // Setters / getters for the return values of the corresponding Set*()
297*6777b538SAndroid Build Coastguard Worker   // methods. By default, they all succeed, if the socket is connected.
298*6777b538SAndroid Build Coastguard Worker 
set_set_receive_buffer_size_result(int receive_buffer_size_result)299*6777b538SAndroid Build Coastguard Worker   void set_set_receive_buffer_size_result(int receive_buffer_size_result) {
300*6777b538SAndroid Build Coastguard Worker     set_receive_buffer_size_result_ = receive_buffer_size_result;
301*6777b538SAndroid Build Coastguard Worker   }
set_receive_buffer_size_result()302*6777b538SAndroid Build Coastguard Worker   int set_receive_buffer_size_result() const {
303*6777b538SAndroid Build Coastguard Worker     return set_receive_buffer_size_result_;
304*6777b538SAndroid Build Coastguard Worker   }
305*6777b538SAndroid Build Coastguard Worker 
set_set_send_buffer_size_result(int set_send_buffer_size_result)306*6777b538SAndroid Build Coastguard Worker   void set_set_send_buffer_size_result(int set_send_buffer_size_result) {
307*6777b538SAndroid Build Coastguard Worker     set_send_buffer_size_result_ = set_send_buffer_size_result;
308*6777b538SAndroid Build Coastguard Worker   }
set_send_buffer_size_result()309*6777b538SAndroid Build Coastguard Worker   int set_send_buffer_size_result() const {
310*6777b538SAndroid Build Coastguard Worker     return set_send_buffer_size_result_;
311*6777b538SAndroid Build Coastguard Worker   }
312*6777b538SAndroid Build Coastguard Worker 
set_set_no_delay_result(bool set_no_delay_result)313*6777b538SAndroid Build Coastguard Worker   void set_set_no_delay_result(bool set_no_delay_result) {
314*6777b538SAndroid Build Coastguard Worker     set_no_delay_result_ = set_no_delay_result;
315*6777b538SAndroid Build Coastguard Worker   }
set_no_delay_result()316*6777b538SAndroid Build Coastguard Worker   bool set_no_delay_result() const { return set_no_delay_result_; }
317*6777b538SAndroid Build Coastguard Worker 
set_set_keep_alive_result(bool set_keep_alive_result)318*6777b538SAndroid Build Coastguard Worker   void set_set_keep_alive_result(bool set_keep_alive_result) {
319*6777b538SAndroid Build Coastguard Worker     set_keep_alive_result_ = set_keep_alive_result;
320*6777b538SAndroid Build Coastguard Worker   }
set_keep_alive_result()321*6777b538SAndroid Build Coastguard Worker   bool set_keep_alive_result() const { return set_keep_alive_result_; }
322*6777b538SAndroid Build Coastguard Worker 
expected_addresses()323*6777b538SAndroid Build Coastguard Worker   const std::optional<AddressList>& expected_addresses() const {
324*6777b538SAndroid Build Coastguard Worker     return expected_addresses_;
325*6777b538SAndroid Build Coastguard Worker   }
set_expected_addresses(net::AddressList addresses)326*6777b538SAndroid Build Coastguard Worker   void set_expected_addresses(net::AddressList addresses) {
327*6777b538SAndroid Build Coastguard Worker     expected_addresses_ = std::move(addresses);
328*6777b538SAndroid Build Coastguard Worker   }
329*6777b538SAndroid Build Coastguard Worker 
330*6777b538SAndroid Build Coastguard Worker   // Returns true if the request should be considered idle, for the purposes of
331*6777b538SAndroid Build Coastguard Worker   // IsConnectedAndIdle.
332*6777b538SAndroid Build Coastguard Worker   virtual bool IsIdle() const;
333*6777b538SAndroid Build Coastguard Worker 
334*6777b538SAndroid Build Coastguard Worker   // Initializes the SocketDataProvider for use with |socket|.  Must be called
335*6777b538SAndroid Build Coastguard Worker   // before use
336*6777b538SAndroid Build Coastguard Worker   void Initialize(AsyncSocket* socket);
337*6777b538SAndroid Build Coastguard Worker   // Detaches the socket associated with a SocketDataProvider.  Must be called
338*6777b538SAndroid Build Coastguard Worker   // before |socket_| is destroyed, unless the SocketDataProvider has informed
339*6777b538SAndroid Build Coastguard Worker   // |socket_| it was destroyed.  Must also be called before Initialize() may
340*6777b538SAndroid Build Coastguard Worker   // be called again with a new socket.
341*6777b538SAndroid Build Coastguard Worker   void DetachSocket();
342*6777b538SAndroid Build Coastguard Worker 
343*6777b538SAndroid Build Coastguard Worker   // Accessor for the socket which is using the SocketDataProvider.
socket()344*6777b538SAndroid Build Coastguard Worker   AsyncSocket* socket() { return socket_; }
345*6777b538SAndroid Build Coastguard Worker 
connect_data()346*6777b538SAndroid Build Coastguard Worker   MockConnect connect_data() const { return connect_; }
set_connect_data(const MockConnect & connect)347*6777b538SAndroid Build Coastguard Worker   void set_connect_data(const MockConnect& connect) { connect_ = connect; }
348*6777b538SAndroid Build Coastguard Worker 
349*6777b538SAndroid Build Coastguard Worker  private:
350*6777b538SAndroid Build Coastguard Worker   // Called to inform subclasses of initialization.
351*6777b538SAndroid Build Coastguard Worker   virtual void Reset() = 0;
352*6777b538SAndroid Build Coastguard Worker 
353*6777b538SAndroid Build Coastguard Worker   MockConnect connect_;
354*6777b538SAndroid Build Coastguard Worker   raw_ptr<AsyncSocket> socket_ = nullptr;
355*6777b538SAndroid Build Coastguard Worker 
356*6777b538SAndroid Build Coastguard Worker   int receive_buffer_size_ = -1;
357*6777b538SAndroid Build Coastguard Worker   int send_buffer_size_ = -1;
358*6777b538SAndroid Build Coastguard Worker   // This reflects the default state of TCPClientSockets.
359*6777b538SAndroid Build Coastguard Worker   bool no_delay_ = true;
360*6777b538SAndroid Build Coastguard Worker 
361*6777b538SAndroid Build Coastguard Worker   KeepAliveState keep_alive_state_ = KeepAliveState::kDefault;
362*6777b538SAndroid Build Coastguard Worker   int keep_alive_delay_ = 0;
363*6777b538SAndroid Build Coastguard Worker 
364*6777b538SAndroid Build Coastguard Worker   int set_receive_buffer_size_result_ = net::OK;
365*6777b538SAndroid Build Coastguard Worker   int set_send_buffer_size_result_ = net::OK;
366*6777b538SAndroid Build Coastguard Worker   bool set_no_delay_result_ = true;
367*6777b538SAndroid Build Coastguard Worker   bool set_keep_alive_result_ = true;
368*6777b538SAndroid Build Coastguard Worker   std::optional<AddressList> expected_addresses_;
369*6777b538SAndroid Build Coastguard Worker };
370*6777b538SAndroid Build Coastguard Worker 
371*6777b538SAndroid Build Coastguard Worker // The AsyncSocket is an interface used by the SocketDataProvider to
372*6777b538SAndroid Build Coastguard Worker // complete the asynchronous read operation.
373*6777b538SAndroid Build Coastguard Worker class AsyncSocket {
374*6777b538SAndroid Build Coastguard Worker  public:
375*6777b538SAndroid Build Coastguard Worker   // If an async IO is pending because the SocketDataProvider returned
376*6777b538SAndroid Build Coastguard Worker   // ERR_IO_PENDING, then the AsyncSocket waits until this OnReadComplete
377*6777b538SAndroid Build Coastguard Worker   // is called to complete the asynchronous read operation.
378*6777b538SAndroid Build Coastguard Worker   // data.async is ignored, and this read is completed synchronously as
379*6777b538SAndroid Build Coastguard Worker   // part of this call.
380*6777b538SAndroid Build Coastguard Worker   // TODO(rch): this should take a StringPiece since most of the fields
381*6777b538SAndroid Build Coastguard Worker   // are ignored.
382*6777b538SAndroid Build Coastguard Worker   virtual void OnReadComplete(const MockRead& data) = 0;
383*6777b538SAndroid Build Coastguard Worker   // If an async IO is pending because the SocketDataProvider returned
384*6777b538SAndroid Build Coastguard Worker   // ERR_IO_PENDING, then the AsyncSocket waits until this OnReadComplete
385*6777b538SAndroid Build Coastguard Worker   // is called to complete the asynchronous read operation.
386*6777b538SAndroid Build Coastguard Worker   virtual void OnWriteComplete(int rv) = 0;
387*6777b538SAndroid Build Coastguard Worker   virtual void OnConnectComplete(const MockConnect& data) = 0;
388*6777b538SAndroid Build Coastguard Worker 
389*6777b538SAndroid Build Coastguard Worker   // Called when the SocketDataProvider associated with the socket is destroyed.
390*6777b538SAndroid Build Coastguard Worker   // The socket may continue to be used after the data provider is destroyed,
391*6777b538SAndroid Build Coastguard Worker   // so it should be sure not to dereference the provider after this is called.
392*6777b538SAndroid Build Coastguard Worker   virtual void OnDataProviderDestroyed() = 0;
393*6777b538SAndroid Build Coastguard Worker };
394*6777b538SAndroid Build Coastguard Worker 
395*6777b538SAndroid Build Coastguard Worker // StaticSocketDataHelper manages a list of reads and writes.
396*6777b538SAndroid Build Coastguard Worker class StaticSocketDataHelper {
397*6777b538SAndroid Build Coastguard Worker  public:
398*6777b538SAndroid Build Coastguard Worker   StaticSocketDataHelper(base::span<const MockRead> reads,
399*6777b538SAndroid Build Coastguard Worker                          base::span<const MockWrite> writes);
400*6777b538SAndroid Build Coastguard Worker 
401*6777b538SAndroid Build Coastguard Worker   StaticSocketDataHelper(const StaticSocketDataHelper&) = delete;
402*6777b538SAndroid Build Coastguard Worker   StaticSocketDataHelper& operator=(const StaticSocketDataHelper&) = delete;
403*6777b538SAndroid Build Coastguard Worker 
404*6777b538SAndroid Build Coastguard Worker   ~StaticSocketDataHelper();
405*6777b538SAndroid Build Coastguard Worker 
406*6777b538SAndroid Build Coastguard Worker   // These functions get access to the next available read and write data. They
407*6777b538SAndroid Build Coastguard Worker   // CHECK fail if there is no data available.
408*6777b538SAndroid Build Coastguard Worker   const MockRead& PeekRead() const;
409*6777b538SAndroid Build Coastguard Worker   const MockWrite& PeekWrite() const;
410*6777b538SAndroid Build Coastguard Worker 
411*6777b538SAndroid Build Coastguard Worker   // Returns the current read or write, and then advances to the next one.
412*6777b538SAndroid Build Coastguard Worker   const MockRead& AdvanceRead();
413*6777b538SAndroid Build Coastguard Worker   const MockWrite& AdvanceWrite();
414*6777b538SAndroid Build Coastguard Worker 
415*6777b538SAndroid Build Coastguard Worker   // Resets the read and write indexes to 0.
416*6777b538SAndroid Build Coastguard Worker   void Reset();
417*6777b538SAndroid Build Coastguard Worker 
418*6777b538SAndroid Build Coastguard Worker   // Returns true if |data| is valid data for the next write. In order
419*6777b538SAndroid Build Coastguard Worker   // to support short writes, the next write may be longer than |data|
420*6777b538SAndroid Build Coastguard Worker   // in which case this method will still return true.
421*6777b538SAndroid Build Coastguard Worker   bool VerifyWriteData(const std::string& data, SocketDataPrinter* printer);
422*6777b538SAndroid Build Coastguard Worker 
read_index()423*6777b538SAndroid Build Coastguard Worker   size_t read_index() const { return read_index_; }
write_index()424*6777b538SAndroid Build Coastguard Worker   size_t write_index() const { return write_index_; }
read_count()425*6777b538SAndroid Build Coastguard Worker   size_t read_count() const { return reads_.size(); }
write_count()426*6777b538SAndroid Build Coastguard Worker   size_t write_count() const { return writes_.size(); }
427*6777b538SAndroid Build Coastguard Worker 
AllReadDataConsumed()428*6777b538SAndroid Build Coastguard Worker   bool AllReadDataConsumed() const { return read_index() >= read_count(); }
AllWriteDataConsumed()429*6777b538SAndroid Build Coastguard Worker   bool AllWriteDataConsumed() const { return write_index() >= write_count(); }
430*6777b538SAndroid Build Coastguard Worker 
431*6777b538SAndroid Build Coastguard Worker   void ExpectAllReadDataConsumed(SocketDataPrinter* printer) const;
432*6777b538SAndroid Build Coastguard Worker   void ExpectAllWriteDataConsumed(SocketDataPrinter* printer) const;
433*6777b538SAndroid Build Coastguard Worker 
434*6777b538SAndroid Build Coastguard Worker  private:
435*6777b538SAndroid Build Coastguard Worker   // Returns the next available read or write that is not a pause event. CHECK
436*6777b538SAndroid Build Coastguard Worker   // fails if no data is available.
437*6777b538SAndroid Build Coastguard Worker   const MockWrite& PeekRealWrite() const;
438*6777b538SAndroid Build Coastguard Worker 
439*6777b538SAndroid Build Coastguard Worker   const base::span<const MockRead> reads_;
440*6777b538SAndroid Build Coastguard Worker   size_t read_index_ = 0;
441*6777b538SAndroid Build Coastguard Worker   const base::span<const MockWrite> writes_;
442*6777b538SAndroid Build Coastguard Worker   size_t write_index_ = 0;
443*6777b538SAndroid Build Coastguard Worker };
444*6777b538SAndroid Build Coastguard Worker 
445*6777b538SAndroid Build Coastguard Worker // SocketDataProvider which responds based on static tables of mock reads and
446*6777b538SAndroid Build Coastguard Worker // writes.
447*6777b538SAndroid Build Coastguard Worker class StaticSocketDataProvider : public SocketDataProvider {
448*6777b538SAndroid Build Coastguard Worker  public:
449*6777b538SAndroid Build Coastguard Worker   StaticSocketDataProvider();
450*6777b538SAndroid Build Coastguard Worker   StaticSocketDataProvider(base::span<const MockRead> reads,
451*6777b538SAndroid Build Coastguard Worker                            base::span<const MockWrite> writes);
452*6777b538SAndroid Build Coastguard Worker 
453*6777b538SAndroid Build Coastguard Worker   StaticSocketDataProvider(const StaticSocketDataProvider&) = delete;
454*6777b538SAndroid Build Coastguard Worker   StaticSocketDataProvider& operator=(const StaticSocketDataProvider&) = delete;
455*6777b538SAndroid Build Coastguard Worker 
456*6777b538SAndroid Build Coastguard Worker   ~StaticSocketDataProvider() override;
457*6777b538SAndroid Build Coastguard Worker 
458*6777b538SAndroid Build Coastguard Worker   // Pause/resume reads from this provider.
459*6777b538SAndroid Build Coastguard Worker   void Pause();
460*6777b538SAndroid Build Coastguard Worker   void Resume();
461*6777b538SAndroid Build Coastguard Worker 
462*6777b538SAndroid Build Coastguard Worker   // From SocketDataProvider:
463*6777b538SAndroid Build Coastguard Worker   MockRead OnRead() override;
464*6777b538SAndroid Build Coastguard Worker   MockWriteResult OnWrite(const std::string& data) override;
465*6777b538SAndroid Build Coastguard Worker   bool AllReadDataConsumed() const override;
466*6777b538SAndroid Build Coastguard Worker   bool AllWriteDataConsumed() const override;
467*6777b538SAndroid Build Coastguard Worker 
read_index()468*6777b538SAndroid Build Coastguard Worker   size_t read_index() const { return helper_.read_index(); }
write_index()469*6777b538SAndroid Build Coastguard Worker   size_t write_index() const { return helper_.write_index(); }
read_count()470*6777b538SAndroid Build Coastguard Worker   size_t read_count() const { return helper_.read_count(); }
write_count()471*6777b538SAndroid Build Coastguard Worker   size_t write_count() const { return helper_.write_count(); }
472*6777b538SAndroid Build Coastguard Worker 
set_printer(SocketDataPrinter * printer)473*6777b538SAndroid Build Coastguard Worker   void set_printer(SocketDataPrinter* printer) { printer_ = printer; }
474*6777b538SAndroid Build Coastguard Worker 
475*6777b538SAndroid Build Coastguard Worker  private:
476*6777b538SAndroid Build Coastguard Worker   // From SocketDataProvider:
477*6777b538SAndroid Build Coastguard Worker   void Reset() override;
478*6777b538SAndroid Build Coastguard Worker 
479*6777b538SAndroid Build Coastguard Worker   StaticSocketDataHelper helper_;
480*6777b538SAndroid Build Coastguard Worker   raw_ptr<SocketDataPrinter> printer_ = nullptr;
481*6777b538SAndroid Build Coastguard Worker   bool paused_ = false;
482*6777b538SAndroid Build Coastguard Worker };
483*6777b538SAndroid Build Coastguard Worker 
484*6777b538SAndroid Build Coastguard Worker // SSLSocketDataProviders only need to keep track of the return code from calls
485*6777b538SAndroid Build Coastguard Worker // to Connect().
486*6777b538SAndroid Build Coastguard Worker struct SSLSocketDataProvider {
487*6777b538SAndroid Build Coastguard Worker   SSLSocketDataProvider(IoMode mode, int result);
488*6777b538SAndroid Build Coastguard Worker   SSLSocketDataProvider(const SSLSocketDataProvider& other);
489*6777b538SAndroid Build Coastguard Worker   ~SSLSocketDataProvider();
490*6777b538SAndroid Build Coastguard Worker 
491*6777b538SAndroid Build Coastguard Worker   // Returns whether MockConnect data has been consumed.
ConnectDataConsumedSSLSocketDataProvider492*6777b538SAndroid Build Coastguard Worker   bool ConnectDataConsumed() const { return is_connect_data_consumed; }
493*6777b538SAndroid Build Coastguard Worker 
494*6777b538SAndroid Build Coastguard Worker   // Returns whether MockConfirm data has been consumed.
ConfirmDataConsumedSSLSocketDataProvider495*6777b538SAndroid Build Coastguard Worker   bool ConfirmDataConsumed() const { return is_confirm_data_consumed; }
496*6777b538SAndroid Build Coastguard Worker 
497*6777b538SAndroid Build Coastguard Worker   // Returns whether a Write occurred before ConfirmHandshake completed.
WriteBeforeConfirmSSLSocketDataProvider498*6777b538SAndroid Build Coastguard Worker   bool WriteBeforeConfirm() const { return write_called_before_confirm; }
499*6777b538SAndroid Build Coastguard Worker 
500*6777b538SAndroid Build Coastguard Worker   // Result for Connect().
501*6777b538SAndroid Build Coastguard Worker   MockConnect connect;
502*6777b538SAndroid Build Coastguard Worker   // Callback to run when Connect() is called. This is called at most once per
503*6777b538SAndroid Build Coastguard Worker   // socket but is repeating because SSLSocketDataProvider is copyable.
504*6777b538SAndroid Build Coastguard Worker   base::RepeatingClosure connect_callback;
505*6777b538SAndroid Build Coastguard Worker 
506*6777b538SAndroid Build Coastguard Worker   // Result for ConfirmHandshake().
507*6777b538SAndroid Build Coastguard Worker   MockConfirm confirm;
508*6777b538SAndroid Build Coastguard Worker   // Callback to run when ConfirmHandshake() is called. This is called at most
509*6777b538SAndroid Build Coastguard Worker   // once per socket but is repeating because SSLSocketDataProvider is
510*6777b538SAndroid Build Coastguard Worker   // copyable.
511*6777b538SAndroid Build Coastguard Worker   base::RepeatingClosure confirm_callback;
512*6777b538SAndroid Build Coastguard Worker 
513*6777b538SAndroid Build Coastguard Worker   // Result for GetNegotiatedProtocol().
514*6777b538SAndroid Build Coastguard Worker   NextProto next_proto = kProtoUnknown;
515*6777b538SAndroid Build Coastguard Worker 
516*6777b538SAndroid Build Coastguard Worker   // Result for GetPeerApplicationSettings().
517*6777b538SAndroid Build Coastguard Worker   std::optional<std::string> peer_application_settings;
518*6777b538SAndroid Build Coastguard Worker 
519*6777b538SAndroid Build Coastguard Worker   // Result for GetSSLInfo().
520*6777b538SAndroid Build Coastguard Worker   SSLInfo ssl_info;
521*6777b538SAndroid Build Coastguard Worker 
522*6777b538SAndroid Build Coastguard Worker   // Result for GetSSLCertRequestInfo().
523*6777b538SAndroid Build Coastguard Worker   scoped_refptr<SSLCertRequestInfo> cert_request_info;
524*6777b538SAndroid Build Coastguard Worker 
525*6777b538SAndroid Build Coastguard Worker   // Result for GetECHRetryConfigs().
526*6777b538SAndroid Build Coastguard Worker   std::vector<uint8_t> ech_retry_configs;
527*6777b538SAndroid Build Coastguard Worker 
528*6777b538SAndroid Build Coastguard Worker   std::optional<NextProtoVector> next_protos_expected_in_ssl_config;
529*6777b538SAndroid Build Coastguard Worker   std::optional<SSLConfig::ApplicationSettings> expected_application_settings;
530*6777b538SAndroid Build Coastguard Worker 
531*6777b538SAndroid Build Coastguard Worker   uint16_t expected_ssl_version_min;
532*6777b538SAndroid Build Coastguard Worker   uint16_t expected_ssl_version_max;
533*6777b538SAndroid Build Coastguard Worker   std::optional<bool> expected_early_data_enabled;
534*6777b538SAndroid Build Coastguard Worker   std::optional<bool> expected_send_client_cert;
535*6777b538SAndroid Build Coastguard Worker   scoped_refptr<X509Certificate> expected_client_cert;
536*6777b538SAndroid Build Coastguard Worker   std::optional<HostPortPair> expected_host_and_port;
537*6777b538SAndroid Build Coastguard Worker   std::optional<bool> expected_ignore_certificate_errors;
538*6777b538SAndroid Build Coastguard Worker   std::optional<NetworkAnonymizationKey> expected_network_anonymization_key;
539*6777b538SAndroid Build Coastguard Worker   std::optional<std::vector<uint8_t>> expected_ech_config_list;
540*6777b538SAndroid Build Coastguard Worker 
541*6777b538SAndroid Build Coastguard Worker   bool is_connect_data_consumed = false;
542*6777b538SAndroid Build Coastguard Worker   bool is_confirm_data_consumed = false;
543*6777b538SAndroid Build Coastguard Worker   bool write_called_before_confirm = false;
544*6777b538SAndroid Build Coastguard Worker };
545*6777b538SAndroid Build Coastguard Worker 
546*6777b538SAndroid Build Coastguard Worker // Uses the sequence_number field in the mock reads and writes to
547*6777b538SAndroid Build Coastguard Worker // complete the operations in a specified order.
548*6777b538SAndroid Build Coastguard Worker class SequencedSocketData : public SocketDataProvider {
549*6777b538SAndroid Build Coastguard Worker  public:
550*6777b538SAndroid Build Coastguard Worker   SequencedSocketData();
551*6777b538SAndroid Build Coastguard Worker 
552*6777b538SAndroid Build Coastguard Worker   // |reads| is the list of MockRead completions.
553*6777b538SAndroid Build Coastguard Worker   // |writes| is the list of MockWrite completions.
554*6777b538SAndroid Build Coastguard Worker   SequencedSocketData(base::span<const MockRead> reads,
555*6777b538SAndroid Build Coastguard Worker                       base::span<const MockWrite> writes);
556*6777b538SAndroid Build Coastguard Worker 
557*6777b538SAndroid Build Coastguard Worker   // |connect| is the result for the connect phase.
558*6777b538SAndroid Build Coastguard Worker   // |reads| is the list of MockRead completions.
559*6777b538SAndroid Build Coastguard Worker   // |writes| is the list of MockWrite completions.
560*6777b538SAndroid Build Coastguard Worker   SequencedSocketData(const MockConnect& connect,
561*6777b538SAndroid Build Coastguard Worker                       base::span<const MockRead> reads,
562*6777b538SAndroid Build Coastguard Worker                       base::span<const MockWrite> writes);
563*6777b538SAndroid Build Coastguard Worker 
564*6777b538SAndroid Build Coastguard Worker   SequencedSocketData(const SequencedSocketData&) = delete;
565*6777b538SAndroid Build Coastguard Worker   SequencedSocketData& operator=(const SequencedSocketData&) = delete;
566*6777b538SAndroid Build Coastguard Worker 
567*6777b538SAndroid Build Coastguard Worker   ~SequencedSocketData() override;
568*6777b538SAndroid Build Coastguard Worker 
569*6777b538SAndroid Build Coastguard Worker   // From SocketDataProvider:
570*6777b538SAndroid Build Coastguard Worker   MockRead OnRead() override;
571*6777b538SAndroid Build Coastguard Worker   MockWriteResult OnWrite(const std::string& data) override;
572*6777b538SAndroid Build Coastguard Worker   bool AllReadDataConsumed() const override;
573*6777b538SAndroid Build Coastguard Worker   bool AllWriteDataConsumed() const override;
574*6777b538SAndroid Build Coastguard Worker   bool IsIdle() const override;
575*6777b538SAndroid Build Coastguard Worker   void CancelPendingRead() override;
576*6777b538SAndroid Build Coastguard Worker 
577*6777b538SAndroid Build Coastguard Worker   // EXPECTs that all data has been consumed, printing any un-consumed data.
578*6777b538SAndroid Build Coastguard Worker   void ExpectAllReadDataConsumed() const;
579*6777b538SAndroid Build Coastguard Worker   void ExpectAllWriteDataConsumed() const;
580*6777b538SAndroid Build Coastguard Worker 
581*6777b538SAndroid Build Coastguard Worker   // An ASYNC read event with a return value of ERR_IO_PENDING will cause the
582*6777b538SAndroid Build Coastguard Worker   // socket data to pause at that event, and advance no further, until Resume is
583*6777b538SAndroid Build Coastguard Worker   // invoked.  At that point, the socket will continue at the next event in the
584*6777b538SAndroid Build Coastguard Worker   // sequence.
585*6777b538SAndroid Build Coastguard Worker   //
586*6777b538SAndroid Build Coastguard Worker   // If a request just wants to simulate a connection that stays open and never
587*6777b538SAndroid Build Coastguard Worker   // receives any more data, instead of pausing and then resuming a request, it
588*6777b538SAndroid Build Coastguard Worker   // should use a SYNCHRONOUS event with a return value of ERR_IO_PENDING
589*6777b538SAndroid Build Coastguard Worker   // instead.
590*6777b538SAndroid Build Coastguard Worker   bool IsPaused() const;
591*6777b538SAndroid Build Coastguard Worker   // Resumes events once |this| is in the paused state.  The next event will
592*6777b538SAndroid Build Coastguard Worker   // occur synchronously with the call if it can.
593*6777b538SAndroid Build Coastguard Worker   void Resume();
594*6777b538SAndroid Build Coastguard Worker   void RunUntilPaused();
595*6777b538SAndroid Build Coastguard Worker 
596*6777b538SAndroid Build Coastguard Worker   // When true, IsConnectedAndIdle() will return false if the next event in the
597*6777b538SAndroid Build Coastguard Worker   // sequence is a synchronous.  Otherwise, the socket claims to be idle as
598*6777b538SAndroid Build Coastguard Worker   // long as it's connected.  Defaults to false.
599*6777b538SAndroid Build Coastguard Worker   // TODO(mmenke):  See if this can be made the default behavior, and consider
600*6777b538SAndroid Build Coastguard Worker   // removing this mehtod.  Need to make sure it doesn't change what code any
601*6777b538SAndroid Build Coastguard Worker   // tests are targetted at testing.
set_busy_before_sync_reads(bool busy_before_sync_reads)602*6777b538SAndroid Build Coastguard Worker   void set_busy_before_sync_reads(bool busy_before_sync_reads) {
603*6777b538SAndroid Build Coastguard Worker     busy_before_sync_reads_ = busy_before_sync_reads;
604*6777b538SAndroid Build Coastguard Worker   }
605*6777b538SAndroid Build Coastguard Worker 
set_printer(SocketDataPrinter * printer)606*6777b538SAndroid Build Coastguard Worker   void set_printer(SocketDataPrinter* printer) { printer_ = printer; }
607*6777b538SAndroid Build Coastguard Worker 
608*6777b538SAndroid Build Coastguard Worker  private:
609*6777b538SAndroid Build Coastguard Worker   // Defines the state for the read or write path.
610*6777b538SAndroid Build Coastguard Worker   enum class IoState {
611*6777b538SAndroid Build Coastguard Worker     kIdle,        // No async operation is in progress.
612*6777b538SAndroid Build Coastguard Worker     kPending,     // An async operation in waiting for another operation to
613*6777b538SAndroid Build Coastguard Worker                   // complete.
614*6777b538SAndroid Build Coastguard Worker     kCompleting,  // A task has been posted to complete an async operation.
615*6777b538SAndroid Build Coastguard Worker     kPaused,      // IO is paused until Resume() is called.
616*6777b538SAndroid Build Coastguard Worker   };
617*6777b538SAndroid Build Coastguard Worker 
618*6777b538SAndroid Build Coastguard Worker   // From SocketDataProvider:
619*6777b538SAndroid Build Coastguard Worker   void Reset() override;
620*6777b538SAndroid Build Coastguard Worker 
621*6777b538SAndroid Build Coastguard Worker   void OnReadComplete();
622*6777b538SAndroid Build Coastguard Worker   void OnWriteComplete();
623*6777b538SAndroid Build Coastguard Worker 
624*6777b538SAndroid Build Coastguard Worker   void MaybePostReadCompleteTask();
625*6777b538SAndroid Build Coastguard Worker   void MaybePostWriteCompleteTask();
626*6777b538SAndroid Build Coastguard Worker 
627*6777b538SAndroid Build Coastguard Worker   StaticSocketDataHelper helper_;
628*6777b538SAndroid Build Coastguard Worker   raw_ptr<SocketDataPrinter> printer_ = nullptr;
629*6777b538SAndroid Build Coastguard Worker   int sequence_number_ = 0;
630*6777b538SAndroid Build Coastguard Worker   IoState read_state_ = IoState::kIdle;
631*6777b538SAndroid Build Coastguard Worker   IoState write_state_ = IoState::kIdle;
632*6777b538SAndroid Build Coastguard Worker 
633*6777b538SAndroid Build Coastguard Worker   bool busy_before_sync_reads_ = false;
634*6777b538SAndroid Build Coastguard Worker 
635*6777b538SAndroid Build Coastguard Worker   // Used by RunUntilPaused.  NULL at all other times.
636*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<base::RunLoop> run_until_paused_run_loop_;
637*6777b538SAndroid Build Coastguard Worker 
638*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<SequencedSocketData> weak_factory_{this};
639*6777b538SAndroid Build Coastguard Worker };
640*6777b538SAndroid Build Coastguard Worker 
641*6777b538SAndroid Build Coastguard Worker // Holds an array of SocketDataProvider elements.  As Mock{TCP,SSL}StreamSocket
642*6777b538SAndroid Build Coastguard Worker // objects get instantiated, they take their data from the i'th element of this
643*6777b538SAndroid Build Coastguard Worker // array.
644*6777b538SAndroid Build Coastguard Worker template <typename T>
645*6777b538SAndroid Build Coastguard Worker class SocketDataProviderArray {
646*6777b538SAndroid Build Coastguard Worker  public:
647*6777b538SAndroid Build Coastguard Worker   SocketDataProviderArray() = default;
648*6777b538SAndroid Build Coastguard Worker 
GetNext()649*6777b538SAndroid Build Coastguard Worker   T* GetNext() {
650*6777b538SAndroid Build Coastguard Worker     DCHECK_LT(next_index_, data_providers_.size());
651*6777b538SAndroid Build Coastguard Worker     return data_providers_[next_index_++];
652*6777b538SAndroid Build Coastguard Worker   }
653*6777b538SAndroid Build Coastguard Worker 
654*6777b538SAndroid Build Coastguard Worker   // Like GetNext(), but returns nullptr when the end of the array is reached,
655*6777b538SAndroid Build Coastguard Worker   // instead of DCHECKing. GetNext() should generally be preferred, unless
656*6777b538SAndroid Build Coastguard Worker   // having no remaining elements is expected in some cases and is handled
657*6777b538SAndroid Build Coastguard Worker   // safely.
GetNextWithoutAsserting()658*6777b538SAndroid Build Coastguard Worker   T* GetNextWithoutAsserting() {
659*6777b538SAndroid Build Coastguard Worker     if (next_index_ == data_providers_.size())
660*6777b538SAndroid Build Coastguard Worker       return nullptr;
661*6777b538SAndroid Build Coastguard Worker     return data_providers_[next_index_++];
662*6777b538SAndroid Build Coastguard Worker   }
663*6777b538SAndroid Build Coastguard Worker 
Add(T * data_provider)664*6777b538SAndroid Build Coastguard Worker   void Add(T* data_provider) {
665*6777b538SAndroid Build Coastguard Worker     DCHECK(data_provider);
666*6777b538SAndroid Build Coastguard Worker     data_providers_.push_back(data_provider);
667*6777b538SAndroid Build Coastguard Worker   }
668*6777b538SAndroid Build Coastguard Worker 
next_index()669*6777b538SAndroid Build Coastguard Worker   size_t next_index() { return next_index_; }
670*6777b538SAndroid Build Coastguard Worker 
ResetNextIndex()671*6777b538SAndroid Build Coastguard Worker   void ResetNextIndex() { next_index_ = 0; }
672*6777b538SAndroid Build Coastguard Worker 
673*6777b538SAndroid Build Coastguard Worker  private:
674*6777b538SAndroid Build Coastguard Worker   // Index of the next |data_providers_| element to use. Not an iterator
675*6777b538SAndroid Build Coastguard Worker   // because those are invalidated on vector reallocation.
676*6777b538SAndroid Build Coastguard Worker   size_t next_index_ = 0;
677*6777b538SAndroid Build Coastguard Worker 
678*6777b538SAndroid Build Coastguard Worker   // SocketDataProviders to be returned.
679*6777b538SAndroid Build Coastguard Worker   std::vector<T*> data_providers_;
680*6777b538SAndroid Build Coastguard Worker };
681*6777b538SAndroid Build Coastguard Worker 
682*6777b538SAndroid Build Coastguard Worker class MockUDPClientSocket;
683*6777b538SAndroid Build Coastguard Worker class MockTCPClientSocket;
684*6777b538SAndroid Build Coastguard Worker class MockSSLClientSocket;
685*6777b538SAndroid Build Coastguard Worker 
686*6777b538SAndroid Build Coastguard Worker // ClientSocketFactory which contains arrays of sockets of each type.
687*6777b538SAndroid Build Coastguard Worker // You should first fill the arrays using Add{SSL,}SocketDataProvider(). When
688*6777b538SAndroid Build Coastguard Worker // the factory is asked to create a socket, it takes next entry from appropriate
689*6777b538SAndroid Build Coastguard Worker // array. You can use ResetNextMockIndexes to reset that next entry index for
690*6777b538SAndroid Build Coastguard Worker // all mock socket types.
691*6777b538SAndroid Build Coastguard Worker class MockClientSocketFactory : public ClientSocketFactory {
692*6777b538SAndroid Build Coastguard Worker  public:
693*6777b538SAndroid Build Coastguard Worker   MockClientSocketFactory();
694*6777b538SAndroid Build Coastguard Worker 
695*6777b538SAndroid Build Coastguard Worker   MockClientSocketFactory(const MockClientSocketFactory&) = delete;
696*6777b538SAndroid Build Coastguard Worker   MockClientSocketFactory& operator=(const MockClientSocketFactory&) = delete;
697*6777b538SAndroid Build Coastguard Worker 
698*6777b538SAndroid Build Coastguard Worker   ~MockClientSocketFactory() override;
699*6777b538SAndroid Build Coastguard Worker 
700*6777b538SAndroid Build Coastguard Worker   // Adds a SocketDataProvider that can be used to served either TCP or UDP
701*6777b538SAndroid Build Coastguard Worker   // connection requests. Sockets are returned in FIFO order.
702*6777b538SAndroid Build Coastguard Worker   void AddSocketDataProvider(SocketDataProvider* socket);
703*6777b538SAndroid Build Coastguard Worker 
704*6777b538SAndroid Build Coastguard Worker   // Like AddSocketDataProvider(), except sockets will only be used to service
705*6777b538SAndroid Build Coastguard Worker   // TCP connection requests. Sockets added with this method are used first,
706*6777b538SAndroid Build Coastguard Worker   // before sockets added with AddSocketDataProvider(). Particularly useful for
707*6777b538SAndroid Build Coastguard Worker   // QUIC tests with multiple sockets, where TCP connections may or may not be
708*6777b538SAndroid Build Coastguard Worker   // made, and have no guaranteed order, relative to UDP connections.
709*6777b538SAndroid Build Coastguard Worker   void AddTcpSocketDataProvider(SocketDataProvider* socket);
710*6777b538SAndroid Build Coastguard Worker 
711*6777b538SAndroid Build Coastguard Worker   void AddSSLSocketDataProvider(SSLSocketDataProvider* socket);
712*6777b538SAndroid Build Coastguard Worker   void ResetNextMockIndexes();
713*6777b538SAndroid Build Coastguard Worker 
mock_data()714*6777b538SAndroid Build Coastguard Worker   SocketDataProviderArray<SocketDataProvider>& mock_data() {
715*6777b538SAndroid Build Coastguard Worker     return mock_data_;
716*6777b538SAndroid Build Coastguard Worker   }
717*6777b538SAndroid Build Coastguard Worker 
set_enable_read_if_ready(bool enable_read_if_ready)718*6777b538SAndroid Build Coastguard Worker   void set_enable_read_if_ready(bool enable_read_if_ready) {
719*6777b538SAndroid Build Coastguard Worker     enable_read_if_ready_ = enable_read_if_ready;
720*6777b538SAndroid Build Coastguard Worker   }
721*6777b538SAndroid Build Coastguard Worker 
722*6777b538SAndroid Build Coastguard Worker   // ClientSocketFactory
723*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
724*6777b538SAndroid Build Coastguard Worker       DatagramSocket::BindType bind_type,
725*6777b538SAndroid Build Coastguard Worker       NetLog* net_log,
726*6777b538SAndroid Build Coastguard Worker       const NetLogSource& source) override;
727*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
728*6777b538SAndroid Build Coastguard Worker       const AddressList& addresses,
729*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
730*6777b538SAndroid Build Coastguard Worker       NetworkQualityEstimator* network_quality_estimator,
731*6777b538SAndroid Build Coastguard Worker       NetLog* net_log,
732*6777b538SAndroid Build Coastguard Worker       const NetLogSource& source) override;
733*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
734*6777b538SAndroid Build Coastguard Worker       SSLClientContext* context,
735*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<StreamSocket> stream_socket,
736*6777b538SAndroid Build Coastguard Worker       const HostPortPair& host_and_port,
737*6777b538SAndroid Build Coastguard Worker       const SSLConfig& ssl_config) override;
udp_client_socket_ports()738*6777b538SAndroid Build Coastguard Worker   const std::vector<uint16_t>& udp_client_socket_ports() const {
739*6777b538SAndroid Build Coastguard Worker     return udp_client_socket_ports_;
740*6777b538SAndroid Build Coastguard Worker   }
741*6777b538SAndroid Build Coastguard Worker 
742*6777b538SAndroid Build Coastguard Worker  private:
743*6777b538SAndroid Build Coastguard Worker   SocketDataProviderArray<SocketDataProvider> mock_data_;
744*6777b538SAndroid Build Coastguard Worker   SocketDataProviderArray<SocketDataProvider> mock_tcp_data_;
745*6777b538SAndroid Build Coastguard Worker   SocketDataProviderArray<SSLSocketDataProvider> mock_ssl_data_;
746*6777b538SAndroid Build Coastguard Worker   std::vector<uint16_t> udp_client_socket_ports_;
747*6777b538SAndroid Build Coastguard Worker 
748*6777b538SAndroid Build Coastguard Worker   // If true, ReadIfReady() is enabled; otherwise ReadIfReady() returns
749*6777b538SAndroid Build Coastguard Worker   // ERR_READ_IF_READY_NOT_IMPLEMENTED.
750*6777b538SAndroid Build Coastguard Worker   bool enable_read_if_ready_ = false;
751*6777b538SAndroid Build Coastguard Worker };
752*6777b538SAndroid Build Coastguard Worker 
753*6777b538SAndroid Build Coastguard Worker class MockClientSocket : public TransportClientSocket {
754*6777b538SAndroid Build Coastguard Worker  public:
755*6777b538SAndroid Build Coastguard Worker   // The NetLogWithSource is needed to test LoadTimingInfo, which uses NetLog
756*6777b538SAndroid Build Coastguard Worker   // IDs as
757*6777b538SAndroid Build Coastguard Worker   // unique socket IDs.
758*6777b538SAndroid Build Coastguard Worker   explicit MockClientSocket(const NetLogWithSource& net_log);
759*6777b538SAndroid Build Coastguard Worker 
760*6777b538SAndroid Build Coastguard Worker   MockClientSocket(const MockClientSocket&) = delete;
761*6777b538SAndroid Build Coastguard Worker   MockClientSocket& operator=(const MockClientSocket&) = delete;
762*6777b538SAndroid Build Coastguard Worker 
763*6777b538SAndroid Build Coastguard Worker   // Socket implementation.
764*6777b538SAndroid Build Coastguard Worker   int Read(IOBuffer* buf,
765*6777b538SAndroid Build Coastguard Worker            int buf_len,
766*6777b538SAndroid Build Coastguard Worker            CompletionOnceCallback callback) override = 0;
767*6777b538SAndroid Build Coastguard Worker   int Write(IOBuffer* buf,
768*6777b538SAndroid Build Coastguard Worker             int buf_len,
769*6777b538SAndroid Build Coastguard Worker             CompletionOnceCallback callback,
770*6777b538SAndroid Build Coastguard Worker             const NetworkTrafficAnnotationTag& traffic_annotation) override = 0;
771*6777b538SAndroid Build Coastguard Worker   int SetReceiveBufferSize(int32_t size) override;
772*6777b538SAndroid Build Coastguard Worker   int SetSendBufferSize(int32_t size) override;
773*6777b538SAndroid Build Coastguard Worker 
774*6777b538SAndroid Build Coastguard Worker   // TransportClientSocket implementation.
775*6777b538SAndroid Build Coastguard Worker   int Bind(const net::IPEndPoint& local_addr) override;
776*6777b538SAndroid Build Coastguard Worker   bool SetNoDelay(bool no_delay) override;
777*6777b538SAndroid Build Coastguard Worker   bool SetKeepAlive(bool enable, int delay) override;
778*6777b538SAndroid Build Coastguard Worker 
779*6777b538SAndroid Build Coastguard Worker   // StreamSocket implementation.
780*6777b538SAndroid Build Coastguard Worker   int Connect(CompletionOnceCallback callback) override = 0;
781*6777b538SAndroid Build Coastguard Worker   void Disconnect() override;
782*6777b538SAndroid Build Coastguard Worker   bool IsConnected() const override;
783*6777b538SAndroid Build Coastguard Worker   bool IsConnectedAndIdle() const override;
784*6777b538SAndroid Build Coastguard Worker   int GetPeerAddress(IPEndPoint* address) const override;
785*6777b538SAndroid Build Coastguard Worker   int GetLocalAddress(IPEndPoint* address) const override;
786*6777b538SAndroid Build Coastguard Worker   const NetLogWithSource& NetLog() const override;
787*6777b538SAndroid Build Coastguard Worker   NextProto GetNegotiatedProtocol() const override;
788*6777b538SAndroid Build Coastguard Worker   int64_t GetTotalReceivedBytes() const override;
ApplySocketTag(const SocketTag & tag)789*6777b538SAndroid Build Coastguard Worker   void ApplySocketTag(const SocketTag& tag) override {}
790*6777b538SAndroid Build Coastguard Worker 
791*6777b538SAndroid Build Coastguard Worker  protected:
792*6777b538SAndroid Build Coastguard Worker   ~MockClientSocket() override;
793*6777b538SAndroid Build Coastguard Worker   void RunCallbackAsync(CompletionOnceCallback callback, int result);
794*6777b538SAndroid Build Coastguard Worker   void RunCallback(CompletionOnceCallback callback, int result);
795*6777b538SAndroid Build Coastguard Worker 
796*6777b538SAndroid Build Coastguard Worker   // True if Connect completed successfully and Disconnect hasn't been called.
797*6777b538SAndroid Build Coastguard Worker   bool connected_ = false;
798*6777b538SAndroid Build Coastguard Worker 
799*6777b538SAndroid Build Coastguard Worker   IPEndPoint local_addr_;
800*6777b538SAndroid Build Coastguard Worker   IPEndPoint peer_addr_;
801*6777b538SAndroid Build Coastguard Worker 
802*6777b538SAndroid Build Coastguard Worker   NetLogWithSource net_log_;
803*6777b538SAndroid Build Coastguard Worker 
804*6777b538SAndroid Build Coastguard Worker  private:
805*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<MockClientSocket> weak_factory_{this};
806*6777b538SAndroid Build Coastguard Worker };
807*6777b538SAndroid Build Coastguard Worker 
808*6777b538SAndroid Build Coastguard Worker class MockTCPClientSocket : public MockClientSocket, public AsyncSocket {
809*6777b538SAndroid Build Coastguard Worker  public:
810*6777b538SAndroid Build Coastguard Worker   MockTCPClientSocket(const AddressList& addresses,
811*6777b538SAndroid Build Coastguard Worker                       net::NetLog* net_log,
812*6777b538SAndroid Build Coastguard Worker                       SocketDataProvider* socket);
813*6777b538SAndroid Build Coastguard Worker 
814*6777b538SAndroid Build Coastguard Worker   MockTCPClientSocket(const MockTCPClientSocket&) = delete;
815*6777b538SAndroid Build Coastguard Worker   MockTCPClientSocket& operator=(const MockTCPClientSocket&) = delete;
816*6777b538SAndroid Build Coastguard Worker 
817*6777b538SAndroid Build Coastguard Worker   ~MockTCPClientSocket() override;
818*6777b538SAndroid Build Coastguard Worker 
addresses()819*6777b538SAndroid Build Coastguard Worker   const AddressList& addresses() const { return addresses_; }
820*6777b538SAndroid Build Coastguard Worker 
821*6777b538SAndroid Build Coastguard Worker   // Socket implementation.
822*6777b538SAndroid Build Coastguard Worker   int Read(IOBuffer* buf,
823*6777b538SAndroid Build Coastguard Worker            int buf_len,
824*6777b538SAndroid Build Coastguard Worker            CompletionOnceCallback callback) override;
825*6777b538SAndroid Build Coastguard Worker   int ReadIfReady(IOBuffer* buf,
826*6777b538SAndroid Build Coastguard Worker                   int buf_len,
827*6777b538SAndroid Build Coastguard Worker                   CompletionOnceCallback callback) override;
828*6777b538SAndroid Build Coastguard Worker   int CancelReadIfReady() override;
829*6777b538SAndroid Build Coastguard Worker   int Write(IOBuffer* buf,
830*6777b538SAndroid Build Coastguard Worker             int buf_len,
831*6777b538SAndroid Build Coastguard Worker             CompletionOnceCallback callback,
832*6777b538SAndroid Build Coastguard Worker             const NetworkTrafficAnnotationTag& traffic_annotation) override;
833*6777b538SAndroid Build Coastguard Worker   int SetReceiveBufferSize(int32_t size) override;
834*6777b538SAndroid Build Coastguard Worker   int SetSendBufferSize(int32_t size) override;
835*6777b538SAndroid Build Coastguard Worker 
836*6777b538SAndroid Build Coastguard Worker   // TransportClientSocket implementation.
837*6777b538SAndroid Build Coastguard Worker   bool SetNoDelay(bool no_delay) override;
838*6777b538SAndroid Build Coastguard Worker   bool SetKeepAlive(bool enable, int delay) override;
839*6777b538SAndroid Build Coastguard Worker 
840*6777b538SAndroid Build Coastguard Worker   // StreamSocket implementation.
841*6777b538SAndroid Build Coastguard Worker   void SetBeforeConnectCallback(
842*6777b538SAndroid Build Coastguard Worker       const BeforeConnectCallback& before_connect_callback) override;
843*6777b538SAndroid Build Coastguard Worker   int Connect(CompletionOnceCallback callback) override;
844*6777b538SAndroid Build Coastguard Worker   void Disconnect() override;
845*6777b538SAndroid Build Coastguard Worker   bool IsConnected() const override;
846*6777b538SAndroid Build Coastguard Worker   bool IsConnectedAndIdle() const override;
847*6777b538SAndroid Build Coastguard Worker   int GetPeerAddress(IPEndPoint* address) const override;
848*6777b538SAndroid Build Coastguard Worker   bool WasEverUsed() const override;
849*6777b538SAndroid Build Coastguard Worker   bool GetSSLInfo(SSLInfo* ssl_info) override;
850*6777b538SAndroid Build Coastguard Worker 
851*6777b538SAndroid Build Coastguard Worker   // AsyncSocket:
852*6777b538SAndroid Build Coastguard Worker   void OnReadComplete(const MockRead& data) override;
853*6777b538SAndroid Build Coastguard Worker   void OnWriteComplete(int rv) override;
854*6777b538SAndroid Build Coastguard Worker   void OnConnectComplete(const MockConnect& data) override;
855*6777b538SAndroid Build Coastguard Worker   void OnDataProviderDestroyed() override;
856*6777b538SAndroid Build Coastguard Worker 
set_enable_read_if_ready(bool enable_read_if_ready)857*6777b538SAndroid Build Coastguard Worker   void set_enable_read_if_ready(bool enable_read_if_ready) {
858*6777b538SAndroid Build Coastguard Worker     enable_read_if_ready_ = enable_read_if_ready;
859*6777b538SAndroid Build Coastguard Worker   }
860*6777b538SAndroid Build Coastguard Worker 
861*6777b538SAndroid Build Coastguard Worker  private:
862*6777b538SAndroid Build Coastguard Worker   void RetryRead(int rv);
863*6777b538SAndroid Build Coastguard Worker   int ReadIfReadyImpl(IOBuffer* buf,
864*6777b538SAndroid Build Coastguard Worker                       int buf_len,
865*6777b538SAndroid Build Coastguard Worker                       CompletionOnceCallback callback);
866*6777b538SAndroid Build Coastguard Worker 
867*6777b538SAndroid Build Coastguard Worker   // Helper method to run |pending_read_if_ready_callback_| if it is not null.
868*6777b538SAndroid Build Coastguard Worker   void RunReadIfReadyCallback(int result);
869*6777b538SAndroid Build Coastguard Worker 
870*6777b538SAndroid Build Coastguard Worker   AddressList addresses_;
871*6777b538SAndroid Build Coastguard Worker 
872*6777b538SAndroid Build Coastguard Worker   raw_ptr<SocketDataProvider> data_;
873*6777b538SAndroid Build Coastguard Worker   int read_offset_ = 0;
874*6777b538SAndroid Build Coastguard Worker   MockRead read_data_;
875*6777b538SAndroid Build Coastguard Worker   bool need_read_data_ = true;
876*6777b538SAndroid Build Coastguard Worker 
877*6777b538SAndroid Build Coastguard Worker   // True if the peer has closed the connection.  This allows us to simulate
878*6777b538SAndroid Build Coastguard Worker   // the recv(..., MSG_PEEK) call in the IsConnectedAndIdle method of the real
879*6777b538SAndroid Build Coastguard Worker   // TCPClientSocket.
880*6777b538SAndroid Build Coastguard Worker   bool peer_closed_connection_ = false;
881*6777b538SAndroid Build Coastguard Worker 
882*6777b538SAndroid Build Coastguard Worker   // While an asynchronous read is pending, we save our user-buffer state.
883*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBuffer> pending_read_buf_ = nullptr;
884*6777b538SAndroid Build Coastguard Worker   int pending_read_buf_len_ = 0;
885*6777b538SAndroid Build Coastguard Worker   CompletionOnceCallback pending_read_callback_;
886*6777b538SAndroid Build Coastguard Worker 
887*6777b538SAndroid Build Coastguard Worker   // Non-null when a ReadIfReady() is pending.
888*6777b538SAndroid Build Coastguard Worker   CompletionOnceCallback pending_read_if_ready_callback_;
889*6777b538SAndroid Build Coastguard Worker 
890*6777b538SAndroid Build Coastguard Worker   CompletionOnceCallback pending_connect_callback_;
891*6777b538SAndroid Build Coastguard Worker   CompletionOnceCallback pending_write_callback_;
892*6777b538SAndroid Build Coastguard Worker   bool was_used_to_convey_data_ = false;
893*6777b538SAndroid Build Coastguard Worker 
894*6777b538SAndroid Build Coastguard Worker   // If true, ReadIfReady() is enabled; otherwise ReadIfReady() returns
895*6777b538SAndroid Build Coastguard Worker   // ERR_READ_IF_READY_NOT_IMPLEMENTED.
896*6777b538SAndroid Build Coastguard Worker   bool enable_read_if_ready_ = false;
897*6777b538SAndroid Build Coastguard Worker 
898*6777b538SAndroid Build Coastguard Worker   BeforeConnectCallback before_connect_callback_;
899*6777b538SAndroid Build Coastguard Worker };
900*6777b538SAndroid Build Coastguard Worker 
901*6777b538SAndroid Build Coastguard Worker class MockSSLClientSocket : public AsyncSocket, public SSLClientSocket {
902*6777b538SAndroid Build Coastguard Worker  public:
903*6777b538SAndroid Build Coastguard Worker   MockSSLClientSocket(std::unique_ptr<StreamSocket> stream_socket,
904*6777b538SAndroid Build Coastguard Worker                       const HostPortPair& host_and_port,
905*6777b538SAndroid Build Coastguard Worker                       const SSLConfig& ssl_config,
906*6777b538SAndroid Build Coastguard Worker                       SSLSocketDataProvider* socket);
907*6777b538SAndroid Build Coastguard Worker 
908*6777b538SAndroid Build Coastguard Worker   MockSSLClientSocket(const MockSSLClientSocket&) = delete;
909*6777b538SAndroid Build Coastguard Worker   MockSSLClientSocket& operator=(const MockSSLClientSocket&) = delete;
910*6777b538SAndroid Build Coastguard Worker 
911*6777b538SAndroid Build Coastguard Worker   ~MockSSLClientSocket() override;
912*6777b538SAndroid Build Coastguard Worker 
913*6777b538SAndroid Build Coastguard Worker   // Socket implementation.
914*6777b538SAndroid Build Coastguard Worker   int Read(IOBuffer* buf,
915*6777b538SAndroid Build Coastguard Worker            int buf_len,
916*6777b538SAndroid Build Coastguard Worker            CompletionOnceCallback callback) override;
917*6777b538SAndroid Build Coastguard Worker   int ReadIfReady(IOBuffer* buf,
918*6777b538SAndroid Build Coastguard Worker                   int buf_len,
919*6777b538SAndroid Build Coastguard Worker                   CompletionOnceCallback callback) override;
920*6777b538SAndroid Build Coastguard Worker   int Write(IOBuffer* buf,
921*6777b538SAndroid Build Coastguard Worker             int buf_len,
922*6777b538SAndroid Build Coastguard Worker             CompletionOnceCallback callback,
923*6777b538SAndroid Build Coastguard Worker             const NetworkTrafficAnnotationTag& traffic_annotation) override;
924*6777b538SAndroid Build Coastguard Worker   int CancelReadIfReady() override;
925*6777b538SAndroid Build Coastguard Worker 
926*6777b538SAndroid Build Coastguard Worker   // StreamSocket implementation.
927*6777b538SAndroid Build Coastguard Worker   int Connect(CompletionOnceCallback callback) override;
928*6777b538SAndroid Build Coastguard Worker   void Disconnect() override;
929*6777b538SAndroid Build Coastguard Worker   int ConfirmHandshake(CompletionOnceCallback callback) override;
930*6777b538SAndroid Build Coastguard Worker   bool IsConnected() const override;
931*6777b538SAndroid Build Coastguard Worker   bool IsConnectedAndIdle() const override;
932*6777b538SAndroid Build Coastguard Worker   bool WasEverUsed() const override;
933*6777b538SAndroid Build Coastguard Worker   int GetPeerAddress(IPEndPoint* address) const override;
934*6777b538SAndroid Build Coastguard Worker   int GetLocalAddress(IPEndPoint* address) const override;
935*6777b538SAndroid Build Coastguard Worker   NextProto GetNegotiatedProtocol() const override;
936*6777b538SAndroid Build Coastguard Worker   std::optional<std::string_view> GetPeerApplicationSettings() const override;
937*6777b538SAndroid Build Coastguard Worker   bool GetSSLInfo(SSLInfo* ssl_info) override;
938*6777b538SAndroid Build Coastguard Worker   void GetSSLCertRequestInfo(
939*6777b538SAndroid Build Coastguard Worker       SSLCertRequestInfo* cert_request_info) const override;
940*6777b538SAndroid Build Coastguard Worker   void ApplySocketTag(const SocketTag& tag) override;
941*6777b538SAndroid Build Coastguard Worker   const NetLogWithSource& NetLog() const override;
942*6777b538SAndroid Build Coastguard Worker   int64_t GetTotalReceivedBytes() const override;
943*6777b538SAndroid Build Coastguard Worker   int SetReceiveBufferSize(int32_t size) override;
944*6777b538SAndroid Build Coastguard Worker   int SetSendBufferSize(int32_t size) override;
945*6777b538SAndroid Build Coastguard Worker 
946*6777b538SAndroid Build Coastguard Worker   // SSLSocket implementation.
947*6777b538SAndroid Build Coastguard Worker   int ExportKeyingMaterial(std::string_view label,
948*6777b538SAndroid Build Coastguard Worker                            bool has_context,
949*6777b538SAndroid Build Coastguard Worker                            std::string_view context,
950*6777b538SAndroid Build Coastguard Worker                            unsigned char* out,
951*6777b538SAndroid Build Coastguard Worker                            unsigned int outlen) override;
952*6777b538SAndroid Build Coastguard Worker 
953*6777b538SAndroid Build Coastguard Worker   // SSLClientSocket implementation.
954*6777b538SAndroid Build Coastguard Worker   std::vector<uint8_t> GetECHRetryConfigs() override;
955*6777b538SAndroid Build Coastguard Worker 
956*6777b538SAndroid Build Coastguard Worker   // This MockSocket does not implement the manual async IO feature.
957*6777b538SAndroid Build Coastguard Worker   void OnReadComplete(const MockRead& data) override;
958*6777b538SAndroid Build Coastguard Worker   void OnWriteComplete(int rv) override;
959*6777b538SAndroid Build Coastguard Worker   void OnConnectComplete(const MockConnect& data) override;
960*6777b538SAndroid Build Coastguard Worker   // SSL sockets don't need magic to deal with destruction of their data
961*6777b538SAndroid Build Coastguard Worker   // provider.
962*6777b538SAndroid Build Coastguard Worker   // TODO(mmenke):  Probably a good idea to support it, anyways.
OnDataProviderDestroyed()963*6777b538SAndroid Build Coastguard Worker   void OnDataProviderDestroyed() override {}
964*6777b538SAndroid Build Coastguard Worker 
965*6777b538SAndroid Build Coastguard Worker  private:
966*6777b538SAndroid Build Coastguard Worker   static void ConnectCallback(MockSSLClientSocket* ssl_client_socket,
967*6777b538SAndroid Build Coastguard Worker                               CompletionOnceCallback callback,
968*6777b538SAndroid Build Coastguard Worker                               int rv);
969*6777b538SAndroid Build Coastguard Worker 
970*6777b538SAndroid Build Coastguard Worker   void RunCallbackAsync(CompletionOnceCallback callback, int result);
971*6777b538SAndroid Build Coastguard Worker   void RunCallback(CompletionOnceCallback callback, int result);
972*6777b538SAndroid Build Coastguard Worker 
973*6777b538SAndroid Build Coastguard Worker   void RunConfirmHandshakeCallback(CompletionOnceCallback callback, int result);
974*6777b538SAndroid Build Coastguard Worker 
975*6777b538SAndroid Build Coastguard Worker   bool connected_ = false;
976*6777b538SAndroid Build Coastguard Worker   bool in_confirm_handshake_ = false;
977*6777b538SAndroid Build Coastguard Worker   NetLogWithSource net_log_;
978*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<StreamSocket> stream_socket_;
979*6777b538SAndroid Build Coastguard Worker   raw_ptr<SSLSocketDataProvider, AcrossTasksDanglingUntriaged> data_;
980*6777b538SAndroid Build Coastguard Worker   // Address of the "remote" peer we're connected to.
981*6777b538SAndroid Build Coastguard Worker   IPEndPoint peer_addr_;
982*6777b538SAndroid Build Coastguard Worker 
983*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<MockSSLClientSocket> weak_factory_{this};
984*6777b538SAndroid Build Coastguard Worker };
985*6777b538SAndroid Build Coastguard Worker 
986*6777b538SAndroid Build Coastguard Worker class MockUDPClientSocket : public DatagramClientSocket, public AsyncSocket {
987*6777b538SAndroid Build Coastguard Worker  public:
988*6777b538SAndroid Build Coastguard Worker   explicit MockUDPClientSocket(SocketDataProvider* data = nullptr,
989*6777b538SAndroid Build Coastguard Worker                                net::NetLog* net_log = nullptr);
990*6777b538SAndroid Build Coastguard Worker 
991*6777b538SAndroid Build Coastguard Worker   MockUDPClientSocket(const MockUDPClientSocket&) = delete;
992*6777b538SAndroid Build Coastguard Worker   MockUDPClientSocket& operator=(const MockUDPClientSocket&) = delete;
993*6777b538SAndroid Build Coastguard Worker 
994*6777b538SAndroid Build Coastguard Worker   ~MockUDPClientSocket() override;
995*6777b538SAndroid Build Coastguard Worker 
996*6777b538SAndroid Build Coastguard Worker   // Socket implementation.
997*6777b538SAndroid Build Coastguard Worker   int Read(IOBuffer* buf,
998*6777b538SAndroid Build Coastguard Worker            int buf_len,
999*6777b538SAndroid Build Coastguard Worker            CompletionOnceCallback callback) override;
1000*6777b538SAndroid Build Coastguard Worker   int Write(IOBuffer* buf,
1001*6777b538SAndroid Build Coastguard Worker             int buf_len,
1002*6777b538SAndroid Build Coastguard Worker             CompletionOnceCallback callback,
1003*6777b538SAndroid Build Coastguard Worker             const NetworkTrafficAnnotationTag& traffic_annotation) override;
1004*6777b538SAndroid Build Coastguard Worker 
1005*6777b538SAndroid Build Coastguard Worker   int SetReceiveBufferSize(int32_t size) override;
1006*6777b538SAndroid Build Coastguard Worker   int SetSendBufferSize(int32_t size) override;
1007*6777b538SAndroid Build Coastguard Worker   int SetDoNotFragment() override;
1008*6777b538SAndroid Build Coastguard Worker   int SetRecvTos() override;
1009*6777b538SAndroid Build Coastguard Worker   int SetTos(DiffServCodePoint dscp, EcnCodePoint ecn) override;
1010*6777b538SAndroid Build Coastguard Worker 
1011*6777b538SAndroid Build Coastguard Worker   // DatagramSocket implementation.
1012*6777b538SAndroid Build Coastguard Worker   void Close() override;
1013*6777b538SAndroid Build Coastguard Worker   int GetPeerAddress(IPEndPoint* address) const override;
1014*6777b538SAndroid Build Coastguard Worker   int GetLocalAddress(IPEndPoint* address) const override;
1015*6777b538SAndroid Build Coastguard Worker   void UseNonBlockingIO() override;
1016*6777b538SAndroid Build Coastguard Worker   int SetMulticastInterface(uint32_t interface_index) override;
1017*6777b538SAndroid Build Coastguard Worker   const NetLogWithSource& NetLog() const override;
1018*6777b538SAndroid Build Coastguard Worker 
1019*6777b538SAndroid Build Coastguard Worker   // DatagramClientSocket implementation.
1020*6777b538SAndroid Build Coastguard Worker   int Connect(const IPEndPoint& address) override;
1021*6777b538SAndroid Build Coastguard Worker   int ConnectUsingNetwork(handles::NetworkHandle network,
1022*6777b538SAndroid Build Coastguard Worker                           const IPEndPoint& address) override;
1023*6777b538SAndroid Build Coastguard Worker   int ConnectUsingDefaultNetwork(const IPEndPoint& address) override;
1024*6777b538SAndroid Build Coastguard Worker   int ConnectAsync(const IPEndPoint& address,
1025*6777b538SAndroid Build Coastguard Worker                    CompletionOnceCallback callback) override;
1026*6777b538SAndroid Build Coastguard Worker   int ConnectUsingNetworkAsync(handles::NetworkHandle network,
1027*6777b538SAndroid Build Coastguard Worker                                const IPEndPoint& address,
1028*6777b538SAndroid Build Coastguard Worker                                CompletionOnceCallback callback) override;
1029*6777b538SAndroid Build Coastguard Worker   int ConnectUsingDefaultNetworkAsync(const IPEndPoint& address,
1030*6777b538SAndroid Build Coastguard Worker                                       CompletionOnceCallback callback) override;
1031*6777b538SAndroid Build Coastguard Worker   handles::NetworkHandle GetBoundNetwork() const override;
1032*6777b538SAndroid Build Coastguard Worker   void ApplySocketTag(const SocketTag& tag) override;
SetMsgConfirm(bool confirm)1033*6777b538SAndroid Build Coastguard Worker   void SetMsgConfirm(bool confirm) override {}
1034*6777b538SAndroid Build Coastguard Worker   DscpAndEcn GetLastTos() const override;
1035*6777b538SAndroid Build Coastguard Worker 
1036*6777b538SAndroid Build Coastguard Worker   // AsyncSocket implementation.
1037*6777b538SAndroid Build Coastguard Worker   void OnReadComplete(const MockRead& data) override;
1038*6777b538SAndroid Build Coastguard Worker   void OnWriteComplete(int rv) override;
1039*6777b538SAndroid Build Coastguard Worker   void OnConnectComplete(const MockConnect& data) override;
1040*6777b538SAndroid Build Coastguard Worker   void OnDataProviderDestroyed() override;
1041*6777b538SAndroid Build Coastguard Worker 
set_source_port(uint16_t port)1042*6777b538SAndroid Build Coastguard Worker   void set_source_port(uint16_t port) { source_port_ = port; }
source_port()1043*6777b538SAndroid Build Coastguard Worker   uint16_t source_port() const { return source_port_; }
set_source_host(IPAddress addr)1044*6777b538SAndroid Build Coastguard Worker   void set_source_host(IPAddress addr) { source_host_ = addr; }
source_host()1045*6777b538SAndroid Build Coastguard Worker   IPAddress source_host() const { return source_host_; }
1046*6777b538SAndroid Build Coastguard Worker 
1047*6777b538SAndroid Build Coastguard Worker   // Returns last tag applied to socket.
tag()1048*6777b538SAndroid Build Coastguard Worker   SocketTag tag() const { return tag_; }
1049*6777b538SAndroid Build Coastguard Worker 
1050*6777b538SAndroid Build Coastguard Worker   // Returns false if socket's tag was changed after the socket was used for
1051*6777b538SAndroid Build Coastguard Worker   // data transfer (e.g. Read/Write() called), otherwise returns true.
tagged_before_data_transferred()1052*6777b538SAndroid Build Coastguard Worker   bool tagged_before_data_transferred() const {
1053*6777b538SAndroid Build Coastguard Worker     return tagged_before_data_transferred_;
1054*6777b538SAndroid Build Coastguard Worker   }
1055*6777b538SAndroid Build Coastguard Worker 
1056*6777b538SAndroid Build Coastguard Worker  private:
1057*6777b538SAndroid Build Coastguard Worker   int CompleteRead();
1058*6777b538SAndroid Build Coastguard Worker 
1059*6777b538SAndroid Build Coastguard Worker   void RunCallbackAsync(CompletionOnceCallback callback, int result);
1060*6777b538SAndroid Build Coastguard Worker   void RunCallback(CompletionOnceCallback callback, int result);
1061*6777b538SAndroid Build Coastguard Worker 
1062*6777b538SAndroid Build Coastguard Worker   bool connected_ = false;
1063*6777b538SAndroid Build Coastguard Worker   raw_ptr<SocketDataProvider> data_;
1064*6777b538SAndroid Build Coastguard Worker   int read_offset_ = 0;
1065*6777b538SAndroid Build Coastguard Worker   MockRead read_data_;
1066*6777b538SAndroid Build Coastguard Worker   bool need_read_data_ = true;
1067*6777b538SAndroid Build Coastguard Worker   IPAddress source_host_;
1068*6777b538SAndroid Build Coastguard Worker   uint16_t source_port_ = 123;  // Ephemeral source port.
1069*6777b538SAndroid Build Coastguard Worker 
1070*6777b538SAndroid Build Coastguard Worker   // Address of the "remote" peer we're connected to.
1071*6777b538SAndroid Build Coastguard Worker   IPEndPoint peer_addr_;
1072*6777b538SAndroid Build Coastguard Worker 
1073*6777b538SAndroid Build Coastguard Worker   // Network that the socket is bound to.
1074*6777b538SAndroid Build Coastguard Worker   handles::NetworkHandle network_ = handles::kInvalidNetworkHandle;
1075*6777b538SAndroid Build Coastguard Worker 
1076*6777b538SAndroid Build Coastguard Worker   // While an asynchronous IO is pending, we save our user-buffer state.
1077*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBuffer> pending_read_buf_ = nullptr;
1078*6777b538SAndroid Build Coastguard Worker   int pending_read_buf_len_ = 0;
1079*6777b538SAndroid Build Coastguard Worker   CompletionOnceCallback pending_read_callback_;
1080*6777b538SAndroid Build Coastguard Worker   CompletionOnceCallback pending_write_callback_;
1081*6777b538SAndroid Build Coastguard Worker 
1082*6777b538SAndroid Build Coastguard Worker   NetLogWithSource net_log_;
1083*6777b538SAndroid Build Coastguard Worker 
1084*6777b538SAndroid Build Coastguard Worker   DatagramBuffers unwritten_buffers_;
1085*6777b538SAndroid Build Coastguard Worker 
1086*6777b538SAndroid Build Coastguard Worker   SocketTag tag_;
1087*6777b538SAndroid Build Coastguard Worker   bool data_transferred_ = false;
1088*6777b538SAndroid Build Coastguard Worker   bool tagged_before_data_transferred_ = true;
1089*6777b538SAndroid Build Coastguard Worker 
1090*6777b538SAndroid Build Coastguard Worker   uint8_t last_tos_ = 0;
1091*6777b538SAndroid Build Coastguard Worker 
1092*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<MockUDPClientSocket> weak_factory_{this};
1093*6777b538SAndroid Build Coastguard Worker };
1094*6777b538SAndroid Build Coastguard Worker 
1095*6777b538SAndroid Build Coastguard Worker class TestSocketRequest : public TestCompletionCallbackBase {
1096*6777b538SAndroid Build Coastguard Worker  public:
1097*6777b538SAndroid Build Coastguard Worker   TestSocketRequest(std::vector<raw_ptr<TestSocketRequest, VectorExperimental>>*
1098*6777b538SAndroid Build Coastguard Worker                         request_order,
1099*6777b538SAndroid Build Coastguard Worker                     size_t* completion_count);
1100*6777b538SAndroid Build Coastguard Worker 
1101*6777b538SAndroid Build Coastguard Worker   TestSocketRequest(const TestSocketRequest&) = delete;
1102*6777b538SAndroid Build Coastguard Worker   TestSocketRequest& operator=(const TestSocketRequest&) = delete;
1103*6777b538SAndroid Build Coastguard Worker 
1104*6777b538SAndroid Build Coastguard Worker   ~TestSocketRequest() override;
1105*6777b538SAndroid Build Coastguard Worker 
handle()1106*6777b538SAndroid Build Coastguard Worker   ClientSocketHandle* handle() { return &handle_; }
1107*6777b538SAndroid Build Coastguard Worker 
callback()1108*6777b538SAndroid Build Coastguard Worker   CompletionOnceCallback callback() {
1109*6777b538SAndroid Build Coastguard Worker     return base::BindOnce(&TestSocketRequest::OnComplete,
1110*6777b538SAndroid Build Coastguard Worker                           base::Unretained(this));
1111*6777b538SAndroid Build Coastguard Worker   }
1112*6777b538SAndroid Build Coastguard Worker 
1113*6777b538SAndroid Build Coastguard Worker  private:
1114*6777b538SAndroid Build Coastguard Worker   void OnComplete(int result);
1115*6777b538SAndroid Build Coastguard Worker 
1116*6777b538SAndroid Build Coastguard Worker   ClientSocketHandle handle_;
1117*6777b538SAndroid Build Coastguard Worker   raw_ptr<std::vector<raw_ptr<TestSocketRequest, VectorExperimental>>>
1118*6777b538SAndroid Build Coastguard Worker       request_order_;
1119*6777b538SAndroid Build Coastguard Worker   raw_ptr<size_t> completion_count_;
1120*6777b538SAndroid Build Coastguard Worker };
1121*6777b538SAndroid Build Coastguard Worker 
1122*6777b538SAndroid Build Coastguard Worker class ClientSocketPoolTest {
1123*6777b538SAndroid Build Coastguard Worker  public:
1124*6777b538SAndroid Build Coastguard Worker   enum KeepAlive {
1125*6777b538SAndroid Build Coastguard Worker     KEEP_ALIVE,
1126*6777b538SAndroid Build Coastguard Worker 
1127*6777b538SAndroid Build Coastguard Worker     // A socket will be disconnected in addition to handle being reset.
1128*6777b538SAndroid Build Coastguard Worker     NO_KEEP_ALIVE,
1129*6777b538SAndroid Build Coastguard Worker   };
1130*6777b538SAndroid Build Coastguard Worker 
1131*6777b538SAndroid Build Coastguard Worker   static const int kIndexOutOfBounds;
1132*6777b538SAndroid Build Coastguard Worker   static const int kRequestNotFound;
1133*6777b538SAndroid Build Coastguard Worker 
1134*6777b538SAndroid Build Coastguard Worker   ClientSocketPoolTest();
1135*6777b538SAndroid Build Coastguard Worker 
1136*6777b538SAndroid Build Coastguard Worker   ClientSocketPoolTest(const ClientSocketPoolTest&) = delete;
1137*6777b538SAndroid Build Coastguard Worker   ClientSocketPoolTest& operator=(const ClientSocketPoolTest&) = delete;
1138*6777b538SAndroid Build Coastguard Worker 
1139*6777b538SAndroid Build Coastguard Worker   ~ClientSocketPoolTest();
1140*6777b538SAndroid Build Coastguard Worker 
1141*6777b538SAndroid Build Coastguard Worker   template <typename PoolType>
StartRequestUsingPool(PoolType * socket_pool,const ClientSocketPool::GroupId & group_id,RequestPriority priority,ClientSocketPool::RespectLimits respect_limits,const scoped_refptr<typename PoolType::SocketParams> & socket_params)1142*6777b538SAndroid Build Coastguard Worker   int StartRequestUsingPool(
1143*6777b538SAndroid Build Coastguard Worker       PoolType* socket_pool,
1144*6777b538SAndroid Build Coastguard Worker       const ClientSocketPool::GroupId& group_id,
1145*6777b538SAndroid Build Coastguard Worker       RequestPriority priority,
1146*6777b538SAndroid Build Coastguard Worker       ClientSocketPool::RespectLimits respect_limits,
1147*6777b538SAndroid Build Coastguard Worker       const scoped_refptr<typename PoolType::SocketParams>& socket_params) {
1148*6777b538SAndroid Build Coastguard Worker     DCHECK(socket_pool);
1149*6777b538SAndroid Build Coastguard Worker     TestSocketRequest* request(
1150*6777b538SAndroid Build Coastguard Worker         new TestSocketRequest(&request_order_, &completion_count_));
1151*6777b538SAndroid Build Coastguard Worker     requests_.push_back(base::WrapUnique(request));
1152*6777b538SAndroid Build Coastguard Worker     int rv = request->handle()->Init(
1153*6777b538SAndroid Build Coastguard Worker         group_id, socket_params, std::nullopt /* proxy_annotation_tag */,
1154*6777b538SAndroid Build Coastguard Worker         priority, SocketTag(), respect_limits, request->callback(),
1155*6777b538SAndroid Build Coastguard Worker         ClientSocketPool::ProxyAuthCallback(), socket_pool, NetLogWithSource());
1156*6777b538SAndroid Build Coastguard Worker     if (rv != ERR_IO_PENDING)
1157*6777b538SAndroid Build Coastguard Worker       request_order_.push_back(request);
1158*6777b538SAndroid Build Coastguard Worker     return rv;
1159*6777b538SAndroid Build Coastguard Worker   }
1160*6777b538SAndroid Build Coastguard Worker 
1161*6777b538SAndroid Build Coastguard Worker   // Provided there were n requests started, takes |index| in range 1..n
1162*6777b538SAndroid Build Coastguard Worker   // and returns order in which that request completed, in range 1..n,
1163*6777b538SAndroid Build Coastguard Worker   // or kIndexOutOfBounds if |index| is out of bounds, or kRequestNotFound
1164*6777b538SAndroid Build Coastguard Worker   // if that request did not complete (for example was canceled).
1165*6777b538SAndroid Build Coastguard Worker   int GetOrderOfRequest(size_t index) const;
1166*6777b538SAndroid Build Coastguard Worker 
1167*6777b538SAndroid Build Coastguard Worker   // Resets first initialized socket handle from |requests_|. If found such
1168*6777b538SAndroid Build Coastguard Worker   // a handle, returns true.
1169*6777b538SAndroid Build Coastguard Worker   bool ReleaseOneConnection(KeepAlive keep_alive);
1170*6777b538SAndroid Build Coastguard Worker 
1171*6777b538SAndroid Build Coastguard Worker   // Releases connections until there is nothing to release.
1172*6777b538SAndroid Build Coastguard Worker   void ReleaseAllConnections(KeepAlive keep_alive);
1173*6777b538SAndroid Build Coastguard Worker 
1174*6777b538SAndroid Build Coastguard Worker   // Note that this uses 0-based indices, while GetOrderOfRequest takes and
1175*6777b538SAndroid Build Coastguard Worker   // returns 1-based indices.
request(int i)1176*6777b538SAndroid Build Coastguard Worker   TestSocketRequest* request(int i) { return requests_[i].get(); }
1177*6777b538SAndroid Build Coastguard Worker 
requests_size()1178*6777b538SAndroid Build Coastguard Worker   size_t requests_size() const { return requests_.size(); }
requests()1179*6777b538SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
1180*6777b538SAndroid Build Coastguard Worker     return &requests_;
1181*6777b538SAndroid Build Coastguard Worker   }
completion_count()1182*6777b538SAndroid Build Coastguard Worker   size_t completion_count() const { return completion_count_; }
1183*6777b538SAndroid Build Coastguard Worker 
1184*6777b538SAndroid Build Coastguard Worker  private:
1185*6777b538SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<TestSocketRequest>> requests_;
1186*6777b538SAndroid Build Coastguard Worker   std::vector<raw_ptr<TestSocketRequest, VectorExperimental>> request_order_;
1187*6777b538SAndroid Build Coastguard Worker   size_t completion_count_ = 0;
1188*6777b538SAndroid Build Coastguard Worker };
1189*6777b538SAndroid Build Coastguard Worker 
1190*6777b538SAndroid Build Coastguard Worker class MockTransportSocketParams
1191*6777b538SAndroid Build Coastguard Worker     : public base::RefCounted<MockTransportSocketParams> {
1192*6777b538SAndroid Build Coastguard Worker  public:
1193*6777b538SAndroid Build Coastguard Worker   MockTransportSocketParams(const MockTransportSocketParams&) = delete;
1194*6777b538SAndroid Build Coastguard Worker   MockTransportSocketParams& operator=(const MockTransportSocketParams&) =
1195*6777b538SAndroid Build Coastguard Worker       delete;
1196*6777b538SAndroid Build Coastguard Worker 
1197*6777b538SAndroid Build Coastguard Worker  private:
1198*6777b538SAndroid Build Coastguard Worker   friend class base::RefCounted<MockTransportSocketParams>;
1199*6777b538SAndroid Build Coastguard Worker   ~MockTransportSocketParams() = default;
1200*6777b538SAndroid Build Coastguard Worker };
1201*6777b538SAndroid Build Coastguard Worker 
1202*6777b538SAndroid Build Coastguard Worker class MockTransportClientSocketPool : public TransportClientSocketPool {
1203*6777b538SAndroid Build Coastguard Worker  public:
1204*6777b538SAndroid Build Coastguard Worker   class MockConnectJob {
1205*6777b538SAndroid Build Coastguard Worker    public:
1206*6777b538SAndroid Build Coastguard Worker     MockConnectJob(std::unique_ptr<StreamSocket> socket,
1207*6777b538SAndroid Build Coastguard Worker                    ClientSocketHandle* handle,
1208*6777b538SAndroid Build Coastguard Worker                    const SocketTag& socket_tag,
1209*6777b538SAndroid Build Coastguard Worker                    CompletionOnceCallback callback,
1210*6777b538SAndroid Build Coastguard Worker                    RequestPriority priority);
1211*6777b538SAndroid Build Coastguard Worker 
1212*6777b538SAndroid Build Coastguard Worker     MockConnectJob(const MockConnectJob&) = delete;
1213*6777b538SAndroid Build Coastguard Worker     MockConnectJob& operator=(const MockConnectJob&) = delete;
1214*6777b538SAndroid Build Coastguard Worker 
1215*6777b538SAndroid Build Coastguard Worker     ~MockConnectJob();
1216*6777b538SAndroid Build Coastguard Worker 
1217*6777b538SAndroid Build Coastguard Worker     int Connect();
1218*6777b538SAndroid Build Coastguard Worker     bool CancelHandle(const ClientSocketHandle* handle);
1219*6777b538SAndroid Build Coastguard Worker 
handle()1220*6777b538SAndroid Build Coastguard Worker     ClientSocketHandle* handle() const { return handle_; }
1221*6777b538SAndroid Build Coastguard Worker 
priority()1222*6777b538SAndroid Build Coastguard Worker     RequestPriority priority() const { return priority_; }
set_priority(RequestPriority priority)1223*6777b538SAndroid Build Coastguard Worker     void set_priority(RequestPriority priority) { priority_ = priority; }
1224*6777b538SAndroid Build Coastguard Worker 
1225*6777b538SAndroid Build Coastguard Worker    private:
1226*6777b538SAndroid Build Coastguard Worker     void OnConnect(int rv);
1227*6777b538SAndroid Build Coastguard Worker 
1228*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<StreamSocket> socket_;
1229*6777b538SAndroid Build Coastguard Worker     raw_ptr<ClientSocketHandle> handle_;
1230*6777b538SAndroid Build Coastguard Worker     const SocketTag socket_tag_;
1231*6777b538SAndroid Build Coastguard Worker     CompletionOnceCallback user_callback_;
1232*6777b538SAndroid Build Coastguard Worker     RequestPriority priority_;
1233*6777b538SAndroid Build Coastguard Worker   };
1234*6777b538SAndroid Build Coastguard Worker 
1235*6777b538SAndroid Build Coastguard Worker   MockTransportClientSocketPool(
1236*6777b538SAndroid Build Coastguard Worker       int max_sockets,
1237*6777b538SAndroid Build Coastguard Worker       int max_sockets_per_group,
1238*6777b538SAndroid Build Coastguard Worker       const CommonConnectJobParams* common_connect_job_params);
1239*6777b538SAndroid Build Coastguard Worker 
1240*6777b538SAndroid Build Coastguard Worker   MockTransportClientSocketPool(const MockTransportClientSocketPool&) = delete;
1241*6777b538SAndroid Build Coastguard Worker   MockTransportClientSocketPool& operator=(
1242*6777b538SAndroid Build Coastguard Worker       const MockTransportClientSocketPool&) = delete;
1243*6777b538SAndroid Build Coastguard Worker 
1244*6777b538SAndroid Build Coastguard Worker   ~MockTransportClientSocketPool() override;
1245*6777b538SAndroid Build Coastguard Worker 
last_request_priority()1246*6777b538SAndroid Build Coastguard Worker   RequestPriority last_request_priority() const {
1247*6777b538SAndroid Build Coastguard Worker     return last_request_priority_;
1248*6777b538SAndroid Build Coastguard Worker   }
1249*6777b538SAndroid Build Coastguard Worker 
requests()1250*6777b538SAndroid Build Coastguard Worker   const std::vector<std::unique_ptr<MockConnectJob>>& requests() const {
1251*6777b538SAndroid Build Coastguard Worker     return job_list_;
1252*6777b538SAndroid Build Coastguard Worker   }
1253*6777b538SAndroid Build Coastguard Worker 
release_count()1254*6777b538SAndroid Build Coastguard Worker   int release_count() const { return release_count_; }
cancel_count()1255*6777b538SAndroid Build Coastguard Worker   int cancel_count() const { return cancel_count_; }
1256*6777b538SAndroid Build Coastguard Worker 
1257*6777b538SAndroid Build Coastguard Worker   // TransportClientSocketPool implementation.
1258*6777b538SAndroid Build Coastguard Worker   int RequestSocket(
1259*6777b538SAndroid Build Coastguard Worker       const GroupId& group_id,
1260*6777b538SAndroid Build Coastguard Worker       scoped_refptr<ClientSocketPool::SocketParams> socket_params,
1261*6777b538SAndroid Build Coastguard Worker       const std::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
1262*6777b538SAndroid Build Coastguard Worker       RequestPriority priority,
1263*6777b538SAndroid Build Coastguard Worker       const SocketTag& socket_tag,
1264*6777b538SAndroid Build Coastguard Worker       RespectLimits respect_limits,
1265*6777b538SAndroid Build Coastguard Worker       ClientSocketHandle* handle,
1266*6777b538SAndroid Build Coastguard Worker       CompletionOnceCallback callback,
1267*6777b538SAndroid Build Coastguard Worker       const ProxyAuthCallback& on_auth_callback,
1268*6777b538SAndroid Build Coastguard Worker       const NetLogWithSource& net_log) override;
1269*6777b538SAndroid Build Coastguard Worker   void SetPriority(const GroupId& group_id,
1270*6777b538SAndroid Build Coastguard Worker                    ClientSocketHandle* handle,
1271*6777b538SAndroid Build Coastguard Worker                    RequestPriority priority) override;
1272*6777b538SAndroid Build Coastguard Worker   void CancelRequest(const GroupId& group_id,
1273*6777b538SAndroid Build Coastguard Worker                      ClientSocketHandle* handle,
1274*6777b538SAndroid Build Coastguard Worker                      bool cancel_connect_job) override;
1275*6777b538SAndroid Build Coastguard Worker   void ReleaseSocket(const GroupId& group_id,
1276*6777b538SAndroid Build Coastguard Worker                      std::unique_ptr<StreamSocket> socket,
1277*6777b538SAndroid Build Coastguard Worker                      int64_t generation) override;
1278*6777b538SAndroid Build Coastguard Worker 
1279*6777b538SAndroid Build Coastguard Worker  private:
1280*6777b538SAndroid Build Coastguard Worker   raw_ptr<ClientSocketFactory> client_socket_factory_;
1281*6777b538SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<MockConnectJob>> job_list_;
1282*6777b538SAndroid Build Coastguard Worker   RequestPriority last_request_priority_ = DEFAULT_PRIORITY;
1283*6777b538SAndroid Build Coastguard Worker   int release_count_ = 0;
1284*6777b538SAndroid Build Coastguard Worker   int cancel_count_ = 0;
1285*6777b538SAndroid Build Coastguard Worker };
1286*6777b538SAndroid Build Coastguard Worker 
1287*6777b538SAndroid Build Coastguard Worker // WrappedStreamSocket is a base class that wraps an existing StreamSocket,
1288*6777b538SAndroid Build Coastguard Worker // forwarding the Socket and StreamSocket interfaces to the underlying
1289*6777b538SAndroid Build Coastguard Worker // transport.
1290*6777b538SAndroid Build Coastguard Worker // This is to provide a common base class for subclasses to override specific
1291*6777b538SAndroid Build Coastguard Worker // StreamSocket methods for testing, while still communicating with a 'real'
1292*6777b538SAndroid Build Coastguard Worker // StreamSocket.
1293*6777b538SAndroid Build Coastguard Worker class WrappedStreamSocket : public TransportClientSocket {
1294*6777b538SAndroid Build Coastguard Worker  public:
1295*6777b538SAndroid Build Coastguard Worker   explicit WrappedStreamSocket(std::unique_ptr<StreamSocket> transport);
1296*6777b538SAndroid Build Coastguard Worker   ~WrappedStreamSocket() override;
1297*6777b538SAndroid Build Coastguard Worker 
1298*6777b538SAndroid Build Coastguard Worker   // StreamSocket implementation:
1299*6777b538SAndroid Build Coastguard Worker   int Bind(const net::IPEndPoint& local_addr) override;
1300*6777b538SAndroid Build Coastguard Worker   int Connect(CompletionOnceCallback callback) override;
1301*6777b538SAndroid Build Coastguard Worker   void Disconnect() override;
1302*6777b538SAndroid Build Coastguard Worker   bool IsConnected() const override;
1303*6777b538SAndroid Build Coastguard Worker   bool IsConnectedAndIdle() const override;
1304*6777b538SAndroid Build Coastguard Worker   int GetPeerAddress(IPEndPoint* address) const override;
1305*6777b538SAndroid Build Coastguard Worker   int GetLocalAddress(IPEndPoint* address) const override;
1306*6777b538SAndroid Build Coastguard Worker   const NetLogWithSource& NetLog() const override;
1307*6777b538SAndroid Build Coastguard Worker   bool WasEverUsed() const override;
1308*6777b538SAndroid Build Coastguard Worker   NextProto GetNegotiatedProtocol() const override;
1309*6777b538SAndroid Build Coastguard Worker   bool GetSSLInfo(SSLInfo* ssl_info) override;
1310*6777b538SAndroid Build Coastguard Worker   int64_t GetTotalReceivedBytes() const override;
1311*6777b538SAndroid Build Coastguard Worker   void ApplySocketTag(const SocketTag& tag) override;
1312*6777b538SAndroid Build Coastguard Worker 
1313*6777b538SAndroid Build Coastguard Worker   // Socket implementation:
1314*6777b538SAndroid Build Coastguard Worker   int Read(IOBuffer* buf,
1315*6777b538SAndroid Build Coastguard Worker            int buf_len,
1316*6777b538SAndroid Build Coastguard Worker            CompletionOnceCallback callback) override;
1317*6777b538SAndroid Build Coastguard Worker   int ReadIfReady(IOBuffer* buf,
1318*6777b538SAndroid Build Coastguard Worker                   int buf_len,
1319*6777b538SAndroid Build Coastguard Worker                   CompletionOnceCallback callback) override;
1320*6777b538SAndroid Build Coastguard Worker   int Write(IOBuffer* buf,
1321*6777b538SAndroid Build Coastguard Worker             int buf_len,
1322*6777b538SAndroid Build Coastguard Worker             CompletionOnceCallback callback,
1323*6777b538SAndroid Build Coastguard Worker             const NetworkTrafficAnnotationTag& traffic_annotation) override;
1324*6777b538SAndroid Build Coastguard Worker   int SetReceiveBufferSize(int32_t size) override;
1325*6777b538SAndroid Build Coastguard Worker   int SetSendBufferSize(int32_t size) override;
1326*6777b538SAndroid Build Coastguard Worker 
1327*6777b538SAndroid Build Coastguard Worker  protected:
1328*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<StreamSocket> transport_;
1329*6777b538SAndroid Build Coastguard Worker };
1330*6777b538SAndroid Build Coastguard Worker 
1331*6777b538SAndroid Build Coastguard Worker // StreamSocket that wraps another StreamSocket, but keeps track of any
1332*6777b538SAndroid Build Coastguard Worker // SocketTag applied to the socket.
1333*6777b538SAndroid Build Coastguard Worker class MockTaggingStreamSocket : public WrappedStreamSocket {
1334*6777b538SAndroid Build Coastguard Worker  public:
MockTaggingStreamSocket(std::unique_ptr<StreamSocket> transport)1335*6777b538SAndroid Build Coastguard Worker   explicit MockTaggingStreamSocket(std::unique_ptr<StreamSocket> transport)
1336*6777b538SAndroid Build Coastguard Worker       : WrappedStreamSocket(std::move(transport)) {}
1337*6777b538SAndroid Build Coastguard Worker 
1338*6777b538SAndroid Build Coastguard Worker   MockTaggingStreamSocket(const MockTaggingStreamSocket&) = delete;
1339*6777b538SAndroid Build Coastguard Worker   MockTaggingStreamSocket& operator=(const MockTaggingStreamSocket&) = delete;
1340*6777b538SAndroid Build Coastguard Worker 
1341*6777b538SAndroid Build Coastguard Worker   ~MockTaggingStreamSocket() override = default;
1342*6777b538SAndroid Build Coastguard Worker 
1343*6777b538SAndroid Build Coastguard Worker   // StreamSocket implementation.
1344*6777b538SAndroid Build Coastguard Worker   int Connect(CompletionOnceCallback callback) override;
1345*6777b538SAndroid Build Coastguard Worker   void ApplySocketTag(const SocketTag& tag) override;
1346*6777b538SAndroid Build Coastguard Worker 
1347*6777b538SAndroid Build Coastguard Worker   // Returns false if socket's tag was changed after the socket was connected,
1348*6777b538SAndroid Build Coastguard Worker   // otherwise returns true.
tagged_before_connected()1349*6777b538SAndroid Build Coastguard Worker   bool tagged_before_connected() const { return tagged_before_connected_; }
1350*6777b538SAndroid Build Coastguard Worker 
1351*6777b538SAndroid Build Coastguard Worker   // Returns last tag applied to socket.
tag()1352*6777b538SAndroid Build Coastguard Worker   SocketTag tag() const { return tag_; }
1353*6777b538SAndroid Build Coastguard Worker 
1354*6777b538SAndroid Build Coastguard Worker  private:
1355*6777b538SAndroid Build Coastguard Worker   bool connected_ = false;
1356*6777b538SAndroid Build Coastguard Worker   bool tagged_before_connected_ = true;
1357*6777b538SAndroid Build Coastguard Worker   SocketTag tag_;
1358*6777b538SAndroid Build Coastguard Worker };
1359*6777b538SAndroid Build Coastguard Worker 
1360*6777b538SAndroid Build Coastguard Worker // Extend MockClientSocketFactory to return MockTaggingStreamSockets and
1361*6777b538SAndroid Build Coastguard Worker // keep track of last socket produced for test inspection.
1362*6777b538SAndroid Build Coastguard Worker class MockTaggingClientSocketFactory : public MockClientSocketFactory {
1363*6777b538SAndroid Build Coastguard Worker  public:
1364*6777b538SAndroid Build Coastguard Worker   MockTaggingClientSocketFactory() = default;
1365*6777b538SAndroid Build Coastguard Worker 
1366*6777b538SAndroid Build Coastguard Worker   MockTaggingClientSocketFactory(const MockTaggingClientSocketFactory&) =
1367*6777b538SAndroid Build Coastguard Worker       delete;
1368*6777b538SAndroid Build Coastguard Worker   MockTaggingClientSocketFactory& operator=(
1369*6777b538SAndroid Build Coastguard Worker       const MockTaggingClientSocketFactory&) = delete;
1370*6777b538SAndroid Build Coastguard Worker 
1371*6777b538SAndroid Build Coastguard Worker   // ClientSocketFactory implementation.
1372*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
1373*6777b538SAndroid Build Coastguard Worker       DatagramSocket::BindType bind_type,
1374*6777b538SAndroid Build Coastguard Worker       NetLog* net_log,
1375*6777b538SAndroid Build Coastguard Worker       const NetLogSource& source) override;
1376*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
1377*6777b538SAndroid Build Coastguard Worker       const AddressList& addresses,
1378*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
1379*6777b538SAndroid Build Coastguard Worker       NetworkQualityEstimator* network_quality_estimator,
1380*6777b538SAndroid Build Coastguard Worker       NetLog* net_log,
1381*6777b538SAndroid Build Coastguard Worker       const NetLogSource& source) override;
1382*6777b538SAndroid Build Coastguard Worker 
1383*6777b538SAndroid Build Coastguard Worker   // These methods return pointers to last TCP and UDP sockets produced by this
1384*6777b538SAndroid Build Coastguard Worker   // factory. NOTE: Socket must still exist, or pointer will be to freed memory.
GetLastProducedTCPSocket()1385*6777b538SAndroid Build Coastguard Worker   MockTaggingStreamSocket* GetLastProducedTCPSocket() const {
1386*6777b538SAndroid Build Coastguard Worker     return tcp_socket_;
1387*6777b538SAndroid Build Coastguard Worker   }
GetLastProducedUDPSocket()1388*6777b538SAndroid Build Coastguard Worker   MockUDPClientSocket* GetLastProducedUDPSocket() const { return udp_socket_; }
1389*6777b538SAndroid Build Coastguard Worker 
1390*6777b538SAndroid Build Coastguard Worker  private:
1391*6777b538SAndroid Build Coastguard Worker   raw_ptr<MockTaggingStreamSocket, AcrossTasksDanglingUntriaged> tcp_socket_ =
1392*6777b538SAndroid Build Coastguard Worker       nullptr;
1393*6777b538SAndroid Build Coastguard Worker   raw_ptr<MockUDPClientSocket, AcrossTasksDanglingUntriaged> udp_socket_ =
1394*6777b538SAndroid Build Coastguard Worker       nullptr;
1395*6777b538SAndroid Build Coastguard Worker };
1396*6777b538SAndroid Build Coastguard Worker 
1397*6777b538SAndroid Build Coastguard Worker // Host / port used for SOCKS4 test strings.
1398*6777b538SAndroid Build Coastguard Worker extern const char kSOCKS4TestHost[];
1399*6777b538SAndroid Build Coastguard Worker extern const int kSOCKS4TestPort;
1400*6777b538SAndroid Build Coastguard Worker 
1401*6777b538SAndroid Build Coastguard Worker // Constants for a successful SOCKS v4 handshake (connecting to kSOCKS4TestHost
1402*6777b538SAndroid Build Coastguard Worker // on port kSOCKS4TestPort, for the request).
1403*6777b538SAndroid Build Coastguard Worker extern const char kSOCKS4OkRequestLocalHostPort80[];
1404*6777b538SAndroid Build Coastguard Worker extern const int kSOCKS4OkRequestLocalHostPort80Length;
1405*6777b538SAndroid Build Coastguard Worker 
1406*6777b538SAndroid Build Coastguard Worker extern const char kSOCKS4OkReply[];
1407*6777b538SAndroid Build Coastguard Worker extern const int kSOCKS4OkReplyLength;
1408*6777b538SAndroid Build Coastguard Worker 
1409*6777b538SAndroid Build Coastguard Worker // Host / port used for SOCKS5 test strings.
1410*6777b538SAndroid Build Coastguard Worker extern const char kSOCKS5TestHost[];
1411*6777b538SAndroid Build Coastguard Worker extern const int kSOCKS5TestPort;
1412*6777b538SAndroid Build Coastguard Worker 
1413*6777b538SAndroid Build Coastguard Worker // Constants for a successful SOCKS v5 handshake (connecting to kSOCKS5TestHost
1414*6777b538SAndroid Build Coastguard Worker // on port kSOCKS5TestPort, for the request)..
1415*6777b538SAndroid Build Coastguard Worker extern const char kSOCKS5GreetRequest[];
1416*6777b538SAndroid Build Coastguard Worker extern const int kSOCKS5GreetRequestLength;
1417*6777b538SAndroid Build Coastguard Worker 
1418*6777b538SAndroid Build Coastguard Worker extern const char kSOCKS5GreetResponse[];
1419*6777b538SAndroid Build Coastguard Worker extern const int kSOCKS5GreetResponseLength;
1420*6777b538SAndroid Build Coastguard Worker 
1421*6777b538SAndroid Build Coastguard Worker extern const char kSOCKS5OkRequest[];
1422*6777b538SAndroid Build Coastguard Worker extern const int kSOCKS5OkRequestLength;
1423*6777b538SAndroid Build Coastguard Worker 
1424*6777b538SAndroid Build Coastguard Worker extern const char kSOCKS5OkResponse[];
1425*6777b538SAndroid Build Coastguard Worker extern const int kSOCKS5OkResponseLength;
1426*6777b538SAndroid Build Coastguard Worker 
1427*6777b538SAndroid Build Coastguard Worker // Helper function to get the total data size of the MockReads in |reads|.
1428*6777b538SAndroid Build Coastguard Worker int64_t CountReadBytes(base::span<const MockRead> reads);
1429*6777b538SAndroid Build Coastguard Worker 
1430*6777b538SAndroid Build Coastguard Worker // Helper function to get the total data size of the MockWrites in |writes|.
1431*6777b538SAndroid Build Coastguard Worker int64_t CountWriteBytes(base::span<const MockWrite> writes);
1432*6777b538SAndroid Build Coastguard Worker 
1433*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
1434*6777b538SAndroid Build Coastguard Worker // Returns whether the device supports calling GetTaggedBytes().
1435*6777b538SAndroid Build Coastguard Worker bool CanGetTaggedBytes();
1436*6777b538SAndroid Build Coastguard Worker 
1437*6777b538SAndroid Build Coastguard Worker // Query the system to find out how many bytes were received with tag
1438*6777b538SAndroid Build Coastguard Worker // |expected_tag| for our UID.  Return the count of received bytes.
1439*6777b538SAndroid Build Coastguard Worker uint64_t GetTaggedBytes(int32_t expected_tag);
1440*6777b538SAndroid Build Coastguard Worker #endif
1441*6777b538SAndroid Build Coastguard Worker 
1442*6777b538SAndroid Build Coastguard Worker }  // namespace net
1443*6777b538SAndroid Build Coastguard Worker 
1444*6777b538SAndroid Build Coastguard Worker #endif  // NET_SOCKET_SOCKET_TEST_UTIL_H_
1445