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