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 #include "net/socket/socket_test_util.h"
6*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker #include <inttypes.h> // For SCNx64
9*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
10*6777b538SAndroid Build Coastguard Worker #include <stdio.h>
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker #include <memory>
13*6777b538SAndroid Build Coastguard Worker #include <ostream>
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/compiler_specific.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/files/file_util.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_helpers.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/rand_util.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h"
27*6777b538SAndroid Build Coastguard Worker #include "base/run_loop.h"
28*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
29*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
30*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
31*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h"
32*6777b538SAndroid Build Coastguard Worker #include "net/base/address_list.h"
33*6777b538SAndroid Build Coastguard Worker #include "net/base/auth.h"
34*6777b538SAndroid Build Coastguard Worker #include "net/base/hex_utils.h"
35*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_address.h"
36*6777b538SAndroid Build Coastguard Worker #include "net/base/load_timing_info.h"
37*6777b538SAndroid Build Coastguard Worker #include "net/base/proxy_server.h"
38*6777b538SAndroid Build Coastguard Worker #include "net/http/http_network_session.h"
39*6777b538SAndroid Build Coastguard Worker #include "net/http/http_request_headers.h"
40*6777b538SAndroid Build Coastguard Worker #include "net/http/http_response_headers.h"
41*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_source.h"
42*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_source_type.h"
43*6777b538SAndroid Build Coastguard Worker #include "net/socket/connect_job.h"
44*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket.h"
45*6777b538SAndroid Build Coastguard Worker #include "net/socket/stream_socket.h"
46*6777b538SAndroid Build Coastguard Worker #include "net/socket/websocket_endpoint_lock_manager.h"
47*6777b538SAndroid Build Coastguard Worker #include "net/ssl/ssl_cert_request_info.h"
48*6777b538SAndroid Build Coastguard Worker #include "net/ssl/ssl_connection_status_flags.h"
49*6777b538SAndroid Build Coastguard Worker #include "net/ssl/ssl_info.h"
50*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h"
51*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
52*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
53*6777b538SAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/strings/ascii.h"
54*6777b538SAndroid Build Coastguard Worker
55*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
56*6777b538SAndroid Build Coastguard Worker #include "base/android/build_info.h"
57*6777b538SAndroid Build Coastguard Worker #endif
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Worker #define NET_TRACE(level, s) VLOG(level) << s << __FUNCTION__ << "() "
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker namespace net {
62*6777b538SAndroid Build Coastguard Worker namespace {
63*6777b538SAndroid Build Coastguard Worker
AsciifyHigh(char x)64*6777b538SAndroid Build Coastguard Worker inline char AsciifyHigh(char x) {
65*6777b538SAndroid Build Coastguard Worker char nybble = static_cast<char>((x >> 4) & 0x0F);
66*6777b538SAndroid Build Coastguard Worker return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10);
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker
AsciifyLow(char x)69*6777b538SAndroid Build Coastguard Worker inline char AsciifyLow(char x) {
70*6777b538SAndroid Build Coastguard Worker char nybble = static_cast<char>((x >> 0) & 0x0F);
71*6777b538SAndroid Build Coastguard Worker return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10);
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker
Asciify(char x)74*6777b538SAndroid Build Coastguard Worker inline char Asciify(char x) {
75*6777b538SAndroid Build Coastguard Worker return absl::ascii_isprint(static_cast<unsigned char>(x)) ? x : '.';
76*6777b538SAndroid Build Coastguard Worker }
77*6777b538SAndroid Build Coastguard Worker
DumpData(const char * data,int data_len)78*6777b538SAndroid Build Coastguard Worker void DumpData(const char* data, int data_len) {
79*6777b538SAndroid Build Coastguard Worker if (logging::LOGGING_INFO < logging::GetMinLogLevel()) {
80*6777b538SAndroid Build Coastguard Worker return;
81*6777b538SAndroid Build Coastguard Worker }
82*6777b538SAndroid Build Coastguard Worker DVLOG(1) << "Length: " << data_len;
83*6777b538SAndroid Build Coastguard Worker const char* pfx = "Data: ";
84*6777b538SAndroid Build Coastguard Worker if (!data || (data_len <= 0)) {
85*6777b538SAndroid Build Coastguard Worker DVLOG(1) << pfx << "<None>";
86*6777b538SAndroid Build Coastguard Worker } else {
87*6777b538SAndroid Build Coastguard Worker int i;
88*6777b538SAndroid Build Coastguard Worker for (i = 0; i <= (data_len - 4); i += 4) {
89*6777b538SAndroid Build Coastguard Worker DVLOG(1) << pfx << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
90*6777b538SAndroid Build Coastguard Worker << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
91*6777b538SAndroid Build Coastguard Worker << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2])
92*6777b538SAndroid Build Coastguard Worker << AsciifyHigh(data[i + 3]) << AsciifyLow(data[i + 3]) << " '"
93*6777b538SAndroid Build Coastguard Worker << Asciify(data[i + 0]) << Asciify(data[i + 1])
94*6777b538SAndroid Build Coastguard Worker << Asciify(data[i + 2]) << Asciify(data[i + 3]) << "'";
95*6777b538SAndroid Build Coastguard Worker pfx = " ";
96*6777b538SAndroid Build Coastguard Worker }
97*6777b538SAndroid Build Coastguard Worker // Take care of any 'trailing' bytes, if data_len was not a multiple of 4.
98*6777b538SAndroid Build Coastguard Worker switch (data_len - i) {
99*6777b538SAndroid Build Coastguard Worker case 3:
100*6777b538SAndroid Build Coastguard Worker DVLOG(1) << pfx << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
101*6777b538SAndroid Build Coastguard Worker << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
102*6777b538SAndroid Build Coastguard Worker << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2])
103*6777b538SAndroid Build Coastguard Worker << " '" << Asciify(data[i + 0]) << Asciify(data[i + 1])
104*6777b538SAndroid Build Coastguard Worker << Asciify(data[i + 2]) << " '";
105*6777b538SAndroid Build Coastguard Worker break;
106*6777b538SAndroid Build Coastguard Worker case 2:
107*6777b538SAndroid Build Coastguard Worker DVLOG(1) << pfx << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
108*6777b538SAndroid Build Coastguard Worker << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
109*6777b538SAndroid Build Coastguard Worker << " '" << Asciify(data[i + 0]) << Asciify(data[i + 1])
110*6777b538SAndroid Build Coastguard Worker << " '";
111*6777b538SAndroid Build Coastguard Worker break;
112*6777b538SAndroid Build Coastguard Worker case 1:
113*6777b538SAndroid Build Coastguard Worker DVLOG(1) << pfx << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
114*6777b538SAndroid Build Coastguard Worker << " '" << Asciify(data[i + 0]) << " '";
115*6777b538SAndroid Build Coastguard Worker break;
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker }
118*6777b538SAndroid Build Coastguard Worker }
119*6777b538SAndroid Build Coastguard Worker
120*6777b538SAndroid Build Coastguard Worker template <MockReadWriteType type>
DumpMockReadWrite(const MockReadWrite<type> & r)121*6777b538SAndroid Build Coastguard Worker void DumpMockReadWrite(const MockReadWrite<type>& r) {
122*6777b538SAndroid Build Coastguard Worker if (logging::LOGGING_INFO < logging::GetMinLogLevel()) {
123*6777b538SAndroid Build Coastguard Worker return;
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker DVLOG(1) << "Async: " << (r.mode == ASYNC) << "\nResult: " << r.result;
126*6777b538SAndroid Build Coastguard Worker DumpData(r.data, r.data_len);
127*6777b538SAndroid Build Coastguard Worker const char* stop = (r.sequence_number & MockRead::STOPLOOP) ? " (STOP)" : "";
128*6777b538SAndroid Build Coastguard Worker DVLOG(1) << "Stage: " << (r.sequence_number & ~MockRead::STOPLOOP) << stop;
129*6777b538SAndroid Build Coastguard Worker }
130*6777b538SAndroid Build Coastguard Worker
RunClosureIfNonNull(base::OnceClosure closure)131*6777b538SAndroid Build Coastguard Worker void RunClosureIfNonNull(base::OnceClosure closure) {
132*6777b538SAndroid Build Coastguard Worker if (!closure.is_null()) {
133*6777b538SAndroid Build Coastguard Worker std::move(closure).Run();
134*6777b538SAndroid Build Coastguard Worker }
135*6777b538SAndroid Build Coastguard Worker }
136*6777b538SAndroid Build Coastguard Worker
137*6777b538SAndroid Build Coastguard Worker } // namespace
138*6777b538SAndroid Build Coastguard Worker
MockConnect()139*6777b538SAndroid Build Coastguard Worker MockConnect::MockConnect() : mode(ASYNC), result(OK) {
140*6777b538SAndroid Build Coastguard Worker peer_addr = IPEndPoint(IPAddress(192, 0, 2, 33), 0);
141*6777b538SAndroid Build Coastguard Worker }
142*6777b538SAndroid Build Coastguard Worker
MockConnect(IoMode io_mode,int r)143*6777b538SAndroid Build Coastguard Worker MockConnect::MockConnect(IoMode io_mode, int r) : mode(io_mode), result(r) {
144*6777b538SAndroid Build Coastguard Worker peer_addr = IPEndPoint(IPAddress(192, 0, 2, 33), 0);
145*6777b538SAndroid Build Coastguard Worker }
146*6777b538SAndroid Build Coastguard Worker
MockConnect(IoMode io_mode,int r,IPEndPoint addr)147*6777b538SAndroid Build Coastguard Worker MockConnect::MockConnect(IoMode io_mode, int r, IPEndPoint addr)
148*6777b538SAndroid Build Coastguard Worker : mode(io_mode), result(r), peer_addr(addr) {}
149*6777b538SAndroid Build Coastguard Worker
MockConnect(IoMode io_mode,int r,IPEndPoint addr,bool first_attempt_fails)150*6777b538SAndroid Build Coastguard Worker MockConnect::MockConnect(IoMode io_mode,
151*6777b538SAndroid Build Coastguard Worker int r,
152*6777b538SAndroid Build Coastguard Worker IPEndPoint addr,
153*6777b538SAndroid Build Coastguard Worker bool first_attempt_fails)
154*6777b538SAndroid Build Coastguard Worker : mode(io_mode),
155*6777b538SAndroid Build Coastguard Worker result(r),
156*6777b538SAndroid Build Coastguard Worker peer_addr(addr),
157*6777b538SAndroid Build Coastguard Worker first_attempt_fails(first_attempt_fails) {}
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker MockConnect::~MockConnect() = default;
160*6777b538SAndroid Build Coastguard Worker
MockConfirm()161*6777b538SAndroid Build Coastguard Worker MockConfirm::MockConfirm() : mode(SYNCHRONOUS), result(OK) {}
162*6777b538SAndroid Build Coastguard Worker
MockConfirm(IoMode io_mode,int r)163*6777b538SAndroid Build Coastguard Worker MockConfirm::MockConfirm(IoMode io_mode, int r) : mode(io_mode), result(r) {}
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Worker MockConfirm::~MockConfirm() = default;
166*6777b538SAndroid Build Coastguard Worker
IsIdle() const167*6777b538SAndroid Build Coastguard Worker bool SocketDataProvider::IsIdle() const {
168*6777b538SAndroid Build Coastguard Worker return true;
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker
Initialize(AsyncSocket * socket)171*6777b538SAndroid Build Coastguard Worker void SocketDataProvider::Initialize(AsyncSocket* socket) {
172*6777b538SAndroid Build Coastguard Worker CHECK(!socket_);
173*6777b538SAndroid Build Coastguard Worker CHECK(socket);
174*6777b538SAndroid Build Coastguard Worker socket_ = socket;
175*6777b538SAndroid Build Coastguard Worker Reset();
176*6777b538SAndroid Build Coastguard Worker }
177*6777b538SAndroid Build Coastguard Worker
DetachSocket()178*6777b538SAndroid Build Coastguard Worker void SocketDataProvider::DetachSocket() {
179*6777b538SAndroid Build Coastguard Worker CHECK(socket_);
180*6777b538SAndroid Build Coastguard Worker socket_ = nullptr;
181*6777b538SAndroid Build Coastguard Worker }
182*6777b538SAndroid Build Coastguard Worker
183*6777b538SAndroid Build Coastguard Worker SocketDataProvider::SocketDataProvider() = default;
184*6777b538SAndroid Build Coastguard Worker
~SocketDataProvider()185*6777b538SAndroid Build Coastguard Worker SocketDataProvider::~SocketDataProvider() {
186*6777b538SAndroid Build Coastguard Worker if (socket_)
187*6777b538SAndroid Build Coastguard Worker socket_->OnDataProviderDestroyed();
188*6777b538SAndroid Build Coastguard Worker }
189*6777b538SAndroid Build Coastguard Worker
StaticSocketDataHelper(base::span<const MockRead> reads,base::span<const MockWrite> writes)190*6777b538SAndroid Build Coastguard Worker StaticSocketDataHelper::StaticSocketDataHelper(
191*6777b538SAndroid Build Coastguard Worker base::span<const MockRead> reads,
192*6777b538SAndroid Build Coastguard Worker base::span<const MockWrite> writes)
193*6777b538SAndroid Build Coastguard Worker : reads_(reads), writes_(writes) {}
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Worker StaticSocketDataHelper::~StaticSocketDataHelper() = default;
196*6777b538SAndroid Build Coastguard Worker
PeekRead() const197*6777b538SAndroid Build Coastguard Worker const MockRead& StaticSocketDataHelper::PeekRead() const {
198*6777b538SAndroid Build Coastguard Worker CHECK(!AllReadDataConsumed());
199*6777b538SAndroid Build Coastguard Worker return reads_[read_index_];
200*6777b538SAndroid Build Coastguard Worker }
201*6777b538SAndroid Build Coastguard Worker
PeekWrite() const202*6777b538SAndroid Build Coastguard Worker const MockWrite& StaticSocketDataHelper::PeekWrite() const {
203*6777b538SAndroid Build Coastguard Worker CHECK(!AllWriteDataConsumed());
204*6777b538SAndroid Build Coastguard Worker return writes_[write_index_];
205*6777b538SAndroid Build Coastguard Worker }
206*6777b538SAndroid Build Coastguard Worker
AdvanceRead()207*6777b538SAndroid Build Coastguard Worker const MockRead& StaticSocketDataHelper::AdvanceRead() {
208*6777b538SAndroid Build Coastguard Worker CHECK(!AllReadDataConsumed());
209*6777b538SAndroid Build Coastguard Worker return reads_[read_index_++];
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker
AdvanceWrite()212*6777b538SAndroid Build Coastguard Worker const MockWrite& StaticSocketDataHelper::AdvanceWrite() {
213*6777b538SAndroid Build Coastguard Worker CHECK(!AllWriteDataConsumed());
214*6777b538SAndroid Build Coastguard Worker return writes_[write_index_++];
215*6777b538SAndroid Build Coastguard Worker }
216*6777b538SAndroid Build Coastguard Worker
Reset()217*6777b538SAndroid Build Coastguard Worker void StaticSocketDataHelper::Reset() {
218*6777b538SAndroid Build Coastguard Worker read_index_ = 0;
219*6777b538SAndroid Build Coastguard Worker write_index_ = 0;
220*6777b538SAndroid Build Coastguard Worker }
221*6777b538SAndroid Build Coastguard Worker
VerifyWriteData(const std::string & data,SocketDataPrinter * printer)222*6777b538SAndroid Build Coastguard Worker bool StaticSocketDataHelper::VerifyWriteData(const std::string& data,
223*6777b538SAndroid Build Coastguard Worker SocketDataPrinter* printer) {
224*6777b538SAndroid Build Coastguard Worker CHECK(!AllWriteDataConsumed());
225*6777b538SAndroid Build Coastguard Worker // Check that the actual data matches the expectations, skipping over any
226*6777b538SAndroid Build Coastguard Worker // pause events.
227*6777b538SAndroid Build Coastguard Worker const MockWrite& next_write = PeekRealWrite();
228*6777b538SAndroid Build Coastguard Worker if (!next_write.data)
229*6777b538SAndroid Build Coastguard Worker return true;
230*6777b538SAndroid Build Coastguard Worker
231*6777b538SAndroid Build Coastguard Worker // Note: Partial writes are supported here. If the expected data
232*6777b538SAndroid Build Coastguard Worker // is a match, but shorter than the write actually written, that is legal.
233*6777b538SAndroid Build Coastguard Worker // Example:
234*6777b538SAndroid Build Coastguard Worker // Application writes "foobarbaz" (9 bytes)
235*6777b538SAndroid Build Coastguard Worker // Expected write was "foo" (3 bytes)
236*6777b538SAndroid Build Coastguard Worker // This is a success, and the function returns true.
237*6777b538SAndroid Build Coastguard Worker std::string expected_data(next_write.data, next_write.data_len);
238*6777b538SAndroid Build Coastguard Worker std::string actual_data(data.substr(0, next_write.data_len));
239*6777b538SAndroid Build Coastguard Worker if (printer) {
240*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(actual_data == expected_data)
241*6777b538SAndroid Build Coastguard Worker << "Actual formatted write data:\n"
242*6777b538SAndroid Build Coastguard Worker << printer->PrintWrite(data) << "Expected formatted write data:\n"
243*6777b538SAndroid Build Coastguard Worker << printer->PrintWrite(expected_data) << "Actual raw write data:\n"
244*6777b538SAndroid Build Coastguard Worker << HexDump(data) << "Expected raw write data:\n"
245*6777b538SAndroid Build Coastguard Worker << HexDump(expected_data);
246*6777b538SAndroid Build Coastguard Worker } else {
247*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(actual_data == expected_data)
248*6777b538SAndroid Build Coastguard Worker << "Actual write data:\n"
249*6777b538SAndroid Build Coastguard Worker << HexDump(data) << "Expected write data:\n"
250*6777b538SAndroid Build Coastguard Worker << HexDump(expected_data);
251*6777b538SAndroid Build Coastguard Worker }
252*6777b538SAndroid Build Coastguard Worker return expected_data == actual_data;
253*6777b538SAndroid Build Coastguard Worker }
254*6777b538SAndroid Build Coastguard Worker
ExpectAllReadDataConsumed(SocketDataPrinter * printer) const255*6777b538SAndroid Build Coastguard Worker void StaticSocketDataHelper::ExpectAllReadDataConsumed(
256*6777b538SAndroid Build Coastguard Worker SocketDataPrinter* printer) const {
257*6777b538SAndroid Build Coastguard Worker if (AllReadDataConsumed()) {
258*6777b538SAndroid Build Coastguard Worker return;
259*6777b538SAndroid Build Coastguard Worker }
260*6777b538SAndroid Build Coastguard Worker
261*6777b538SAndroid Build Coastguard Worker std::ostringstream msg;
262*6777b538SAndroid Build Coastguard Worker if (read_index_ < read_count()) {
263*6777b538SAndroid Build Coastguard Worker msg << "Unconsumed reads:\n";
264*6777b538SAndroid Build Coastguard Worker for (size_t i = read_index_; i < read_count(); i++) {
265*6777b538SAndroid Build Coastguard Worker msg << (reads_[i].mode == ASYNC ? "ASYNC" : "SYNC") << " MockRead seq "
266*6777b538SAndroid Build Coastguard Worker << reads_[i].sequence_number << ":\n";
267*6777b538SAndroid Build Coastguard Worker if (reads_[i].result != OK) {
268*6777b538SAndroid Build Coastguard Worker msg << "Result: " << reads_[i].result << "\n";
269*6777b538SAndroid Build Coastguard Worker }
270*6777b538SAndroid Build Coastguard Worker if (reads_[i].data) {
271*6777b538SAndroid Build Coastguard Worker std::string data(reads_[i].data, reads_[i].data_len);
272*6777b538SAndroid Build Coastguard Worker if (printer) {
273*6777b538SAndroid Build Coastguard Worker msg << printer->PrintWrite(data);
274*6777b538SAndroid Build Coastguard Worker }
275*6777b538SAndroid Build Coastguard Worker msg << HexDump(data);
276*6777b538SAndroid Build Coastguard Worker }
277*6777b538SAndroid Build Coastguard Worker }
278*6777b538SAndroid Build Coastguard Worker }
279*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(AllReadDataConsumed()) << msg.str();
280*6777b538SAndroid Build Coastguard Worker }
281*6777b538SAndroid Build Coastguard Worker
ExpectAllWriteDataConsumed(SocketDataPrinter * printer) const282*6777b538SAndroid Build Coastguard Worker void StaticSocketDataHelper::ExpectAllWriteDataConsumed(
283*6777b538SAndroid Build Coastguard Worker SocketDataPrinter* printer) const {
284*6777b538SAndroid Build Coastguard Worker if (AllWriteDataConsumed()) {
285*6777b538SAndroid Build Coastguard Worker return;
286*6777b538SAndroid Build Coastguard Worker }
287*6777b538SAndroid Build Coastguard Worker
288*6777b538SAndroid Build Coastguard Worker std::ostringstream msg;
289*6777b538SAndroid Build Coastguard Worker if (write_index_ < write_count()) {
290*6777b538SAndroid Build Coastguard Worker msg << "Unconsumed writes:\n";
291*6777b538SAndroid Build Coastguard Worker for (size_t i = write_index_; i < write_count(); i++) {
292*6777b538SAndroid Build Coastguard Worker msg << (writes_[i].mode == ASYNC ? "ASYNC" : "SYNC") << " MockWrite seq "
293*6777b538SAndroid Build Coastguard Worker << writes_[i].sequence_number << ":\n";
294*6777b538SAndroid Build Coastguard Worker if (writes_[i].result != OK) {
295*6777b538SAndroid Build Coastguard Worker msg << "Result: " << writes_[i].result << "\n";
296*6777b538SAndroid Build Coastguard Worker }
297*6777b538SAndroid Build Coastguard Worker if (writes_[i].data) {
298*6777b538SAndroid Build Coastguard Worker std::string data(writes_[i].data, writes_[i].data_len);
299*6777b538SAndroid Build Coastguard Worker if (printer) {
300*6777b538SAndroid Build Coastguard Worker msg << printer->PrintWrite(data);
301*6777b538SAndroid Build Coastguard Worker }
302*6777b538SAndroid Build Coastguard Worker msg << HexDump(data);
303*6777b538SAndroid Build Coastguard Worker }
304*6777b538SAndroid Build Coastguard Worker }
305*6777b538SAndroid Build Coastguard Worker }
306*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(AllWriteDataConsumed()) << msg.str();
307*6777b538SAndroid Build Coastguard Worker }
308*6777b538SAndroid Build Coastguard Worker
PeekRealWrite() const309*6777b538SAndroid Build Coastguard Worker const MockWrite& StaticSocketDataHelper::PeekRealWrite() const {
310*6777b538SAndroid Build Coastguard Worker for (size_t i = write_index_; i < write_count(); i++) {
311*6777b538SAndroid Build Coastguard Worker if (writes_[i].mode != ASYNC || writes_[i].result != ERR_IO_PENDING)
312*6777b538SAndroid Build Coastguard Worker return writes_[i];
313*6777b538SAndroid Build Coastguard Worker }
314*6777b538SAndroid Build Coastguard Worker
315*6777b538SAndroid Build Coastguard Worker CHECK(false) << "No write data available.";
316*6777b538SAndroid Build Coastguard Worker return writes_[0]; // Avoid warning about unreachable missing return.
317*6777b538SAndroid Build Coastguard Worker }
318*6777b538SAndroid Build Coastguard Worker
StaticSocketDataProvider()319*6777b538SAndroid Build Coastguard Worker StaticSocketDataProvider::StaticSocketDataProvider()
320*6777b538SAndroid Build Coastguard Worker : StaticSocketDataProvider(base::span<const MockRead>(),
321*6777b538SAndroid Build Coastguard Worker base::span<const MockWrite>()) {}
322*6777b538SAndroid Build Coastguard Worker
StaticSocketDataProvider(base::span<const MockRead> reads,base::span<const MockWrite> writes)323*6777b538SAndroid Build Coastguard Worker StaticSocketDataProvider::StaticSocketDataProvider(
324*6777b538SAndroid Build Coastguard Worker base::span<const MockRead> reads,
325*6777b538SAndroid Build Coastguard Worker base::span<const MockWrite> writes)
326*6777b538SAndroid Build Coastguard Worker : helper_(reads, writes) {}
327*6777b538SAndroid Build Coastguard Worker
328*6777b538SAndroid Build Coastguard Worker StaticSocketDataProvider::~StaticSocketDataProvider() = default;
329*6777b538SAndroid Build Coastguard Worker
Pause()330*6777b538SAndroid Build Coastguard Worker void StaticSocketDataProvider::Pause() {
331*6777b538SAndroid Build Coastguard Worker paused_ = true;
332*6777b538SAndroid Build Coastguard Worker }
333*6777b538SAndroid Build Coastguard Worker
Resume()334*6777b538SAndroid Build Coastguard Worker void StaticSocketDataProvider::Resume() {
335*6777b538SAndroid Build Coastguard Worker paused_ = false;
336*6777b538SAndroid Build Coastguard Worker }
337*6777b538SAndroid Build Coastguard Worker
OnRead()338*6777b538SAndroid Build Coastguard Worker MockRead StaticSocketDataProvider::OnRead() {
339*6777b538SAndroid Build Coastguard Worker if (AllReadDataConsumed()) {
340*6777b538SAndroid Build Coastguard Worker const net::MockRead pending_read(net::SYNCHRONOUS, net::ERR_IO_PENDING);
341*6777b538SAndroid Build Coastguard Worker return pending_read;
342*6777b538SAndroid Build Coastguard Worker }
343*6777b538SAndroid Build Coastguard Worker
344*6777b538SAndroid Build Coastguard Worker return helper_.AdvanceRead();
345*6777b538SAndroid Build Coastguard Worker }
346*6777b538SAndroid Build Coastguard Worker
OnWrite(const std::string & data)347*6777b538SAndroid Build Coastguard Worker MockWriteResult StaticSocketDataProvider::OnWrite(const std::string& data) {
348*6777b538SAndroid Build Coastguard Worker if (helper_.write_count() == 0) {
349*6777b538SAndroid Build Coastguard Worker // Not using mock writes; succeed synchronously.
350*6777b538SAndroid Build Coastguard Worker return MockWriteResult(SYNCHRONOUS, data.length());
351*6777b538SAndroid Build Coastguard Worker }
352*6777b538SAndroid Build Coastguard Worker if (printer_) {
353*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(helper_.AllWriteDataConsumed())
354*6777b538SAndroid Build Coastguard Worker << "No more mock data to match write:\nFormatted write data:\n"
355*6777b538SAndroid Build Coastguard Worker << printer_->PrintWrite(data) << "Raw write data:\n"
356*6777b538SAndroid Build Coastguard Worker << HexDump(data);
357*6777b538SAndroid Build Coastguard Worker } else {
358*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(helper_.AllWriteDataConsumed())
359*6777b538SAndroid Build Coastguard Worker << "No more mock data to match write:\nRaw write data:\n"
360*6777b538SAndroid Build Coastguard Worker << HexDump(data);
361*6777b538SAndroid Build Coastguard Worker }
362*6777b538SAndroid Build Coastguard Worker if (helper_.AllWriteDataConsumed()) {
363*6777b538SAndroid Build Coastguard Worker return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
364*6777b538SAndroid Build Coastguard Worker }
365*6777b538SAndroid Build Coastguard Worker
366*6777b538SAndroid Build Coastguard Worker // Check that what we are writing matches the expectation.
367*6777b538SAndroid Build Coastguard Worker // Then give the mocked return value.
368*6777b538SAndroid Build Coastguard Worker if (!helper_.VerifyWriteData(data, printer_))
369*6777b538SAndroid Build Coastguard Worker return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
370*6777b538SAndroid Build Coastguard Worker
371*6777b538SAndroid Build Coastguard Worker const MockWrite& next_write = helper_.AdvanceWrite();
372*6777b538SAndroid Build Coastguard Worker // In the case that the write was successful, return the number of bytes
373*6777b538SAndroid Build Coastguard Worker // written. Otherwise return the error code.
374*6777b538SAndroid Build Coastguard Worker int result =
375*6777b538SAndroid Build Coastguard Worker next_write.result == OK ? next_write.data_len : next_write.result;
376*6777b538SAndroid Build Coastguard Worker return MockWriteResult(next_write.mode, result);
377*6777b538SAndroid Build Coastguard Worker }
378*6777b538SAndroid Build Coastguard Worker
AllReadDataConsumed() const379*6777b538SAndroid Build Coastguard Worker bool StaticSocketDataProvider::AllReadDataConsumed() const {
380*6777b538SAndroid Build Coastguard Worker return paused_ || helper_.AllReadDataConsumed();
381*6777b538SAndroid Build Coastguard Worker }
382*6777b538SAndroid Build Coastguard Worker
AllWriteDataConsumed() const383*6777b538SAndroid Build Coastguard Worker bool StaticSocketDataProvider::AllWriteDataConsumed() const {
384*6777b538SAndroid Build Coastguard Worker return helper_.AllWriteDataConsumed();
385*6777b538SAndroid Build Coastguard Worker }
386*6777b538SAndroid Build Coastguard Worker
Reset()387*6777b538SAndroid Build Coastguard Worker void StaticSocketDataProvider::Reset() {
388*6777b538SAndroid Build Coastguard Worker helper_.Reset();
389*6777b538SAndroid Build Coastguard Worker }
390*6777b538SAndroid Build Coastguard Worker
SSLSocketDataProvider(IoMode mode,int result)391*6777b538SAndroid Build Coastguard Worker SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result)
392*6777b538SAndroid Build Coastguard Worker : connect(mode, result),
393*6777b538SAndroid Build Coastguard Worker expected_ssl_version_min(kDefaultSSLVersionMin),
394*6777b538SAndroid Build Coastguard Worker expected_ssl_version_max(kDefaultSSLVersionMax) {
395*6777b538SAndroid Build Coastguard Worker SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_3,
396*6777b538SAndroid Build Coastguard Worker &ssl_info.connection_status);
397*6777b538SAndroid Build Coastguard Worker // Set to TLS_CHACHA20_POLY1305_SHA256
398*6777b538SAndroid Build Coastguard Worker SSLConnectionStatusSetCipherSuite(0x1301, &ssl_info.connection_status);
399*6777b538SAndroid Build Coastguard Worker }
400*6777b538SAndroid Build Coastguard Worker
401*6777b538SAndroid Build Coastguard Worker SSLSocketDataProvider::SSLSocketDataProvider(
402*6777b538SAndroid Build Coastguard Worker const SSLSocketDataProvider& other) = default;
403*6777b538SAndroid Build Coastguard Worker
404*6777b538SAndroid Build Coastguard Worker SSLSocketDataProvider::~SSLSocketDataProvider() = default;
405*6777b538SAndroid Build Coastguard Worker
SequencedSocketData()406*6777b538SAndroid Build Coastguard Worker SequencedSocketData::SequencedSocketData()
407*6777b538SAndroid Build Coastguard Worker : SequencedSocketData(base::span<const MockRead>(),
408*6777b538SAndroid Build Coastguard Worker base::span<const MockWrite>()) {}
409*6777b538SAndroid Build Coastguard Worker
SequencedSocketData(base::span<const MockRead> reads,base::span<const MockWrite> writes)410*6777b538SAndroid Build Coastguard Worker SequencedSocketData::SequencedSocketData(base::span<const MockRead> reads,
411*6777b538SAndroid Build Coastguard Worker base::span<const MockWrite> writes)
412*6777b538SAndroid Build Coastguard Worker : helper_(reads, writes) {
413*6777b538SAndroid Build Coastguard Worker // Check that reads and writes have a contiguous set of sequence numbers
414*6777b538SAndroid Build Coastguard Worker // starting from 0 and working their way up, with no repeats and skipping
415*6777b538SAndroid Build Coastguard Worker // no values.
416*6777b538SAndroid Build Coastguard Worker int next_sequence_number = 0;
417*6777b538SAndroid Build Coastguard Worker bool last_event_was_pause = false;
418*6777b538SAndroid Build Coastguard Worker
419*6777b538SAndroid Build Coastguard Worker auto next_read = reads.begin();
420*6777b538SAndroid Build Coastguard Worker auto next_write = writes.begin();
421*6777b538SAndroid Build Coastguard Worker while (next_read != reads.end() || next_write != writes.end()) {
422*6777b538SAndroid Build Coastguard Worker if (next_read != reads.end() &&
423*6777b538SAndroid Build Coastguard Worker next_read->sequence_number == next_sequence_number) {
424*6777b538SAndroid Build Coastguard Worker // Check if this is a pause.
425*6777b538SAndroid Build Coastguard Worker if (next_read->mode == ASYNC && next_read->result == ERR_IO_PENDING) {
426*6777b538SAndroid Build Coastguard Worker CHECK(!last_event_was_pause)
427*6777b538SAndroid Build Coastguard Worker << "Two pauses in a row are not allowed: " << next_sequence_number;
428*6777b538SAndroid Build Coastguard Worker last_event_was_pause = true;
429*6777b538SAndroid Build Coastguard Worker } else if (last_event_was_pause) {
430*6777b538SAndroid Build Coastguard Worker CHECK_EQ(ASYNC, next_read->mode)
431*6777b538SAndroid Build Coastguard Worker << "A sync event after a pause makes no sense: "
432*6777b538SAndroid Build Coastguard Worker << next_sequence_number;
433*6777b538SAndroid Build Coastguard Worker CHECK_NE(ERR_IO_PENDING, next_read->result)
434*6777b538SAndroid Build Coastguard Worker << "A pause event after a pause makes no sense: "
435*6777b538SAndroid Build Coastguard Worker << next_sequence_number;
436*6777b538SAndroid Build Coastguard Worker last_event_was_pause = false;
437*6777b538SAndroid Build Coastguard Worker }
438*6777b538SAndroid Build Coastguard Worker
439*6777b538SAndroid Build Coastguard Worker ++next_read;
440*6777b538SAndroid Build Coastguard Worker ++next_sequence_number;
441*6777b538SAndroid Build Coastguard Worker continue;
442*6777b538SAndroid Build Coastguard Worker }
443*6777b538SAndroid Build Coastguard Worker if (next_write != writes.end() &&
444*6777b538SAndroid Build Coastguard Worker next_write->sequence_number == next_sequence_number) {
445*6777b538SAndroid Build Coastguard Worker // Check if this is a pause.
446*6777b538SAndroid Build Coastguard Worker if (next_write->mode == ASYNC && next_write->result == ERR_IO_PENDING) {
447*6777b538SAndroid Build Coastguard Worker CHECK(!last_event_was_pause)
448*6777b538SAndroid Build Coastguard Worker << "Two pauses in a row are not allowed: " << next_sequence_number;
449*6777b538SAndroid Build Coastguard Worker last_event_was_pause = true;
450*6777b538SAndroid Build Coastguard Worker } else if (last_event_was_pause) {
451*6777b538SAndroid Build Coastguard Worker CHECK_EQ(ASYNC, next_write->mode)
452*6777b538SAndroid Build Coastguard Worker << "A sync event after a pause makes no sense: "
453*6777b538SAndroid Build Coastguard Worker << next_sequence_number;
454*6777b538SAndroid Build Coastguard Worker CHECK_NE(ERR_IO_PENDING, next_write->result)
455*6777b538SAndroid Build Coastguard Worker << "A pause event after a pause makes no sense: "
456*6777b538SAndroid Build Coastguard Worker << next_sequence_number;
457*6777b538SAndroid Build Coastguard Worker last_event_was_pause = false;
458*6777b538SAndroid Build Coastguard Worker }
459*6777b538SAndroid Build Coastguard Worker
460*6777b538SAndroid Build Coastguard Worker ++next_write;
461*6777b538SAndroid Build Coastguard Worker ++next_sequence_number;
462*6777b538SAndroid Build Coastguard Worker continue;
463*6777b538SAndroid Build Coastguard Worker }
464*6777b538SAndroid Build Coastguard Worker if (next_write != writes.end()) {
465*6777b538SAndroid Build Coastguard Worker CHECK(false) << "Sequence number " << next_write->sequence_number
466*6777b538SAndroid Build Coastguard Worker << " not found where expected: " << next_sequence_number;
467*6777b538SAndroid Build Coastguard Worker } else {
468*6777b538SAndroid Build Coastguard Worker CHECK(false) << "Too few writes, next expected sequence number: "
469*6777b538SAndroid Build Coastguard Worker << next_sequence_number;
470*6777b538SAndroid Build Coastguard Worker }
471*6777b538SAndroid Build Coastguard Worker return;
472*6777b538SAndroid Build Coastguard Worker }
473*6777b538SAndroid Build Coastguard Worker
474*6777b538SAndroid Build Coastguard Worker // Last event must not be a pause. For the final event to indicate the
475*6777b538SAndroid Build Coastguard Worker // operation never completes, it should be SYNCHRONOUS and return
476*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING.
477*6777b538SAndroid Build Coastguard Worker CHECK(!last_event_was_pause);
478*6777b538SAndroid Build Coastguard Worker
479*6777b538SAndroid Build Coastguard Worker CHECK(next_read == reads.end());
480*6777b538SAndroid Build Coastguard Worker CHECK(next_write == writes.end());
481*6777b538SAndroid Build Coastguard Worker }
482*6777b538SAndroid Build Coastguard Worker
SequencedSocketData(const MockConnect & connect,base::span<const MockRead> reads,base::span<const MockWrite> writes)483*6777b538SAndroid Build Coastguard Worker SequencedSocketData::SequencedSocketData(const MockConnect& connect,
484*6777b538SAndroid Build Coastguard Worker base::span<const MockRead> reads,
485*6777b538SAndroid Build Coastguard Worker base::span<const MockWrite> writes)
486*6777b538SAndroid Build Coastguard Worker : SequencedSocketData(reads, writes) {
487*6777b538SAndroid Build Coastguard Worker set_connect_data(connect);
488*6777b538SAndroid Build Coastguard Worker }
OnRead()489*6777b538SAndroid Build Coastguard Worker MockRead SequencedSocketData::OnRead() {
490*6777b538SAndroid Build Coastguard Worker CHECK_EQ(IoState::kIdle, read_state_);
491*6777b538SAndroid Build Coastguard Worker CHECK(!helper_.AllReadDataConsumed())
492*6777b538SAndroid Build Coastguard Worker << "Application tried to read but there is no read data left";
493*6777b538SAndroid Build Coastguard Worker
494*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "sequence_number: " << sequence_number_;
495*6777b538SAndroid Build Coastguard Worker const MockRead& next_read = helper_.PeekRead();
496*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "next_read: " << next_read.sequence_number;
497*6777b538SAndroid Build Coastguard Worker CHECK_GE(next_read.sequence_number, sequence_number_);
498*6777b538SAndroid Build Coastguard Worker
499*6777b538SAndroid Build Coastguard Worker if (next_read.sequence_number <= sequence_number_) {
500*6777b538SAndroid Build Coastguard Worker if (next_read.mode == SYNCHRONOUS) {
501*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Returning synchronously";
502*6777b538SAndroid Build Coastguard Worker DumpMockReadWrite(next_read);
503*6777b538SAndroid Build Coastguard Worker helper_.AdvanceRead();
504*6777b538SAndroid Build Coastguard Worker ++sequence_number_;
505*6777b538SAndroid Build Coastguard Worker MaybePostWriteCompleteTask();
506*6777b538SAndroid Build Coastguard Worker return next_read;
507*6777b538SAndroid Build Coastguard Worker }
508*6777b538SAndroid Build Coastguard Worker
509*6777b538SAndroid Build Coastguard Worker // If the result is ERR_IO_PENDING, then pause.
510*6777b538SAndroid Build Coastguard Worker if (next_read.result == ERR_IO_PENDING) {
511*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Pausing read at: " << sequence_number_;
512*6777b538SAndroid Build Coastguard Worker read_state_ = IoState::kPaused;
513*6777b538SAndroid Build Coastguard Worker if (run_until_paused_run_loop_)
514*6777b538SAndroid Build Coastguard Worker run_until_paused_run_loop_->Quit();
515*6777b538SAndroid Build Coastguard Worker return MockRead(SYNCHRONOUS, ERR_IO_PENDING);
516*6777b538SAndroid Build Coastguard Worker }
517*6777b538SAndroid Build Coastguard Worker base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
518*6777b538SAndroid Build Coastguard Worker FROM_HERE, base::BindOnce(&SequencedSocketData::OnReadComplete,
519*6777b538SAndroid Build Coastguard Worker weak_factory_.GetWeakPtr()));
520*6777b538SAndroid Build Coastguard Worker CHECK_NE(IoState::kCompleting, write_state_);
521*6777b538SAndroid Build Coastguard Worker read_state_ = IoState::kCompleting;
522*6777b538SAndroid Build Coastguard Worker } else if (next_read.mode == SYNCHRONOUS) {
523*6777b538SAndroid Build Coastguard Worker ADD_FAILURE() << "Unable to perform synchronous IO while stopped";
524*6777b538SAndroid Build Coastguard Worker return MockRead(SYNCHRONOUS, ERR_UNEXPECTED);
525*6777b538SAndroid Build Coastguard Worker } else {
526*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Waiting for write to trigger read";
527*6777b538SAndroid Build Coastguard Worker read_state_ = IoState::kPending;
528*6777b538SAndroid Build Coastguard Worker }
529*6777b538SAndroid Build Coastguard Worker
530*6777b538SAndroid Build Coastguard Worker return MockRead(SYNCHRONOUS, ERR_IO_PENDING);
531*6777b538SAndroid Build Coastguard Worker }
532*6777b538SAndroid Build Coastguard Worker
OnWrite(const std::string & data)533*6777b538SAndroid Build Coastguard Worker MockWriteResult SequencedSocketData::OnWrite(const std::string& data) {
534*6777b538SAndroid Build Coastguard Worker CHECK_EQ(IoState::kIdle, write_state_);
535*6777b538SAndroid Build Coastguard Worker if (printer_) {
536*6777b538SAndroid Build Coastguard Worker CHECK(!helper_.AllWriteDataConsumed())
537*6777b538SAndroid Build Coastguard Worker << "\nNo more mock data to match write:\nFormatted write data:\n"
538*6777b538SAndroid Build Coastguard Worker << printer_->PrintWrite(data) << "Raw write data:\n"
539*6777b538SAndroid Build Coastguard Worker << HexDump(data);
540*6777b538SAndroid Build Coastguard Worker } else {
541*6777b538SAndroid Build Coastguard Worker CHECK(!helper_.AllWriteDataConsumed())
542*6777b538SAndroid Build Coastguard Worker << "\nNo more mock data to match write:\nRaw write data:\n"
543*6777b538SAndroid Build Coastguard Worker << HexDump(data);
544*6777b538SAndroid Build Coastguard Worker }
545*6777b538SAndroid Build Coastguard Worker
546*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "sequence_number: " << sequence_number_;
547*6777b538SAndroid Build Coastguard Worker const MockWrite& next_write = helper_.PeekWrite();
548*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "next_write: " << next_write.sequence_number;
549*6777b538SAndroid Build Coastguard Worker CHECK_GE(next_write.sequence_number, sequence_number_);
550*6777b538SAndroid Build Coastguard Worker
551*6777b538SAndroid Build Coastguard Worker if (!helper_.VerifyWriteData(data, printer_))
552*6777b538SAndroid Build Coastguard Worker return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
553*6777b538SAndroid Build Coastguard Worker
554*6777b538SAndroid Build Coastguard Worker if (next_write.sequence_number <= sequence_number_) {
555*6777b538SAndroid Build Coastguard Worker if (next_write.mode == SYNCHRONOUS) {
556*6777b538SAndroid Build Coastguard Worker helper_.AdvanceWrite();
557*6777b538SAndroid Build Coastguard Worker ++sequence_number_;
558*6777b538SAndroid Build Coastguard Worker MaybePostReadCompleteTask();
559*6777b538SAndroid Build Coastguard Worker // In the case that the write was successful, return the number of bytes
560*6777b538SAndroid Build Coastguard Worker // written. Otherwise return the error code.
561*6777b538SAndroid Build Coastguard Worker int rv =
562*6777b538SAndroid Build Coastguard Worker next_write.result != OK ? next_write.result : next_write.data_len;
563*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Returning synchronously";
564*6777b538SAndroid Build Coastguard Worker return MockWriteResult(SYNCHRONOUS, rv);
565*6777b538SAndroid Build Coastguard Worker }
566*6777b538SAndroid Build Coastguard Worker
567*6777b538SAndroid Build Coastguard Worker // If the result is ERR_IO_PENDING, then pause.
568*6777b538SAndroid Build Coastguard Worker if (next_write.result == ERR_IO_PENDING) {
569*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Pausing write at: " << sequence_number_;
570*6777b538SAndroid Build Coastguard Worker write_state_ = IoState::kPaused;
571*6777b538SAndroid Build Coastguard Worker if (run_until_paused_run_loop_)
572*6777b538SAndroid Build Coastguard Worker run_until_paused_run_loop_->Quit();
573*6777b538SAndroid Build Coastguard Worker return MockWriteResult(SYNCHRONOUS, ERR_IO_PENDING);
574*6777b538SAndroid Build Coastguard Worker }
575*6777b538SAndroid Build Coastguard Worker
576*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Posting task to complete write";
577*6777b538SAndroid Build Coastguard Worker base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
578*6777b538SAndroid Build Coastguard Worker FROM_HERE, base::BindOnce(&SequencedSocketData::OnWriteComplete,
579*6777b538SAndroid Build Coastguard Worker weak_factory_.GetWeakPtr()));
580*6777b538SAndroid Build Coastguard Worker CHECK_NE(IoState::kCompleting, read_state_);
581*6777b538SAndroid Build Coastguard Worker write_state_ = IoState::kCompleting;
582*6777b538SAndroid Build Coastguard Worker } else if (next_write.mode == SYNCHRONOUS) {
583*6777b538SAndroid Build Coastguard Worker ADD_FAILURE() << "Unable to perform synchronous IO while stopped";
584*6777b538SAndroid Build Coastguard Worker return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
585*6777b538SAndroid Build Coastguard Worker } else {
586*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Waiting for read to trigger write";
587*6777b538SAndroid Build Coastguard Worker write_state_ = IoState::kPending;
588*6777b538SAndroid Build Coastguard Worker }
589*6777b538SAndroid Build Coastguard Worker
590*6777b538SAndroid Build Coastguard Worker return MockWriteResult(SYNCHRONOUS, ERR_IO_PENDING);
591*6777b538SAndroid Build Coastguard Worker }
592*6777b538SAndroid Build Coastguard Worker
AllReadDataConsumed() const593*6777b538SAndroid Build Coastguard Worker bool SequencedSocketData::AllReadDataConsumed() const {
594*6777b538SAndroid Build Coastguard Worker return helper_.AllReadDataConsumed();
595*6777b538SAndroid Build Coastguard Worker }
596*6777b538SAndroid Build Coastguard Worker
CancelPendingRead()597*6777b538SAndroid Build Coastguard Worker void SequencedSocketData::CancelPendingRead() {
598*6777b538SAndroid Build Coastguard Worker DCHECK_EQ(IoState::kPending, read_state_);
599*6777b538SAndroid Build Coastguard Worker
600*6777b538SAndroid Build Coastguard Worker read_state_ = IoState::kIdle;
601*6777b538SAndroid Build Coastguard Worker }
602*6777b538SAndroid Build Coastguard Worker
AllWriteDataConsumed() const603*6777b538SAndroid Build Coastguard Worker bool SequencedSocketData::AllWriteDataConsumed() const {
604*6777b538SAndroid Build Coastguard Worker return helper_.AllWriteDataConsumed();
605*6777b538SAndroid Build Coastguard Worker }
606*6777b538SAndroid Build Coastguard Worker
ExpectAllReadDataConsumed() const607*6777b538SAndroid Build Coastguard Worker void SequencedSocketData::ExpectAllReadDataConsumed() const {
608*6777b538SAndroid Build Coastguard Worker helper_.ExpectAllReadDataConsumed(printer_.get());
609*6777b538SAndroid Build Coastguard Worker }
610*6777b538SAndroid Build Coastguard Worker
ExpectAllWriteDataConsumed() const611*6777b538SAndroid Build Coastguard Worker void SequencedSocketData::ExpectAllWriteDataConsumed() const {
612*6777b538SAndroid Build Coastguard Worker helper_.ExpectAllWriteDataConsumed(printer_.get());
613*6777b538SAndroid Build Coastguard Worker }
614*6777b538SAndroid Build Coastguard Worker
IsIdle() const615*6777b538SAndroid Build Coastguard Worker bool SequencedSocketData::IsIdle() const {
616*6777b538SAndroid Build Coastguard Worker // If |busy_before_sync_reads_| is not set, always considered idle. If
617*6777b538SAndroid Build Coastguard Worker // no reads left, or the next operation is a write, also consider it idle.
618*6777b538SAndroid Build Coastguard Worker if (!busy_before_sync_reads_ || helper_.AllReadDataConsumed() ||
619*6777b538SAndroid Build Coastguard Worker helper_.PeekRead().sequence_number != sequence_number_) {
620*6777b538SAndroid Build Coastguard Worker return true;
621*6777b538SAndroid Build Coastguard Worker }
622*6777b538SAndroid Build Coastguard Worker
623*6777b538SAndroid Build Coastguard Worker // If the next operation is synchronous read, treat the socket as not idle.
624*6777b538SAndroid Build Coastguard Worker if (helper_.PeekRead().mode == SYNCHRONOUS)
625*6777b538SAndroid Build Coastguard Worker return false;
626*6777b538SAndroid Build Coastguard Worker return true;
627*6777b538SAndroid Build Coastguard Worker }
628*6777b538SAndroid Build Coastguard Worker
IsPaused() const629*6777b538SAndroid Build Coastguard Worker bool SequencedSocketData::IsPaused() const {
630*6777b538SAndroid Build Coastguard Worker // Both states should not be paused.
631*6777b538SAndroid Build Coastguard Worker DCHECK(read_state_ != IoState::kPaused || write_state_ != IoState::kPaused);
632*6777b538SAndroid Build Coastguard Worker return write_state_ == IoState::kPaused || read_state_ == IoState::kPaused;
633*6777b538SAndroid Build Coastguard Worker }
634*6777b538SAndroid Build Coastguard Worker
Resume()635*6777b538SAndroid Build Coastguard Worker void SequencedSocketData::Resume() {
636*6777b538SAndroid Build Coastguard Worker if (!IsPaused()) {
637*6777b538SAndroid Build Coastguard Worker ADD_FAILURE() << "Unable to Resume when not paused.";
638*6777b538SAndroid Build Coastguard Worker return;
639*6777b538SAndroid Build Coastguard Worker }
640*6777b538SAndroid Build Coastguard Worker
641*6777b538SAndroid Build Coastguard Worker sequence_number_++;
642*6777b538SAndroid Build Coastguard Worker if (read_state_ == IoState::kPaused) {
643*6777b538SAndroid Build Coastguard Worker read_state_ = IoState::kPending;
644*6777b538SAndroid Build Coastguard Worker helper_.AdvanceRead();
645*6777b538SAndroid Build Coastguard Worker } else { // write_state_ == IoState::kPaused
646*6777b538SAndroid Build Coastguard Worker write_state_ = IoState::kPending;
647*6777b538SAndroid Build Coastguard Worker helper_.AdvanceWrite();
648*6777b538SAndroid Build Coastguard Worker }
649*6777b538SAndroid Build Coastguard Worker
650*6777b538SAndroid Build Coastguard Worker if (!helper_.AllWriteDataConsumed() &&
651*6777b538SAndroid Build Coastguard Worker helper_.PeekWrite().sequence_number == sequence_number_) {
652*6777b538SAndroid Build Coastguard Worker // The next event hasn't even started yet. Pausing isn't really needed in
653*6777b538SAndroid Build Coastguard Worker // that case, but may as well support it.
654*6777b538SAndroid Build Coastguard Worker if (write_state_ != IoState::kPending)
655*6777b538SAndroid Build Coastguard Worker return;
656*6777b538SAndroid Build Coastguard Worker write_state_ = IoState::kCompleting;
657*6777b538SAndroid Build Coastguard Worker OnWriteComplete();
658*6777b538SAndroid Build Coastguard Worker return;
659*6777b538SAndroid Build Coastguard Worker }
660*6777b538SAndroid Build Coastguard Worker
661*6777b538SAndroid Build Coastguard Worker CHECK(!helper_.AllReadDataConsumed());
662*6777b538SAndroid Build Coastguard Worker
663*6777b538SAndroid Build Coastguard Worker // The next event hasn't even started yet. Pausing isn't really needed in
664*6777b538SAndroid Build Coastguard Worker // that case, but may as well support it.
665*6777b538SAndroid Build Coastguard Worker if (read_state_ != IoState::kPending)
666*6777b538SAndroid Build Coastguard Worker return;
667*6777b538SAndroid Build Coastguard Worker read_state_ = IoState::kCompleting;
668*6777b538SAndroid Build Coastguard Worker OnReadComplete();
669*6777b538SAndroid Build Coastguard Worker }
670*6777b538SAndroid Build Coastguard Worker
RunUntilPaused()671*6777b538SAndroid Build Coastguard Worker void SequencedSocketData::RunUntilPaused() {
672*6777b538SAndroid Build Coastguard Worker CHECK(!run_until_paused_run_loop_);
673*6777b538SAndroid Build Coastguard Worker
674*6777b538SAndroid Build Coastguard Worker if (IsPaused())
675*6777b538SAndroid Build Coastguard Worker return;
676*6777b538SAndroid Build Coastguard Worker
677*6777b538SAndroid Build Coastguard Worker run_until_paused_run_loop_ = std::make_unique<base::RunLoop>();
678*6777b538SAndroid Build Coastguard Worker run_until_paused_run_loop_->Run();
679*6777b538SAndroid Build Coastguard Worker run_until_paused_run_loop_.reset();
680*6777b538SAndroid Build Coastguard Worker DCHECK(IsPaused());
681*6777b538SAndroid Build Coastguard Worker }
682*6777b538SAndroid Build Coastguard Worker
MaybePostReadCompleteTask()683*6777b538SAndroid Build Coastguard Worker void SequencedSocketData::MaybePostReadCompleteTask() {
684*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " ****** ") << " current: " << sequence_number_;
685*6777b538SAndroid Build Coastguard Worker // Only trigger the next read to complete if there is already a read pending
686*6777b538SAndroid Build Coastguard Worker // which should complete at the current sequence number.
687*6777b538SAndroid Build Coastguard Worker if (read_state_ != IoState::kPending ||
688*6777b538SAndroid Build Coastguard Worker helper_.PeekRead().sequence_number != sequence_number_) {
689*6777b538SAndroid Build Coastguard Worker return;
690*6777b538SAndroid Build Coastguard Worker }
691*6777b538SAndroid Build Coastguard Worker
692*6777b538SAndroid Build Coastguard Worker // If the result is ERR_IO_PENDING, then pause.
693*6777b538SAndroid Build Coastguard Worker if (helper_.PeekRead().result == ERR_IO_PENDING) {
694*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Pausing read at: " << sequence_number_;
695*6777b538SAndroid Build Coastguard Worker read_state_ = IoState::kPaused;
696*6777b538SAndroid Build Coastguard Worker if (run_until_paused_run_loop_)
697*6777b538SAndroid Build Coastguard Worker run_until_paused_run_loop_->Quit();
698*6777b538SAndroid Build Coastguard Worker return;
699*6777b538SAndroid Build Coastguard Worker }
700*6777b538SAndroid Build Coastguard Worker
701*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " ****** ") << "Posting task to complete read: "
702*6777b538SAndroid Build Coastguard Worker << sequence_number_;
703*6777b538SAndroid Build Coastguard Worker base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
704*6777b538SAndroid Build Coastguard Worker FROM_HERE, base::BindOnce(&SequencedSocketData::OnReadComplete,
705*6777b538SAndroid Build Coastguard Worker weak_factory_.GetWeakPtr()));
706*6777b538SAndroid Build Coastguard Worker CHECK_NE(IoState::kCompleting, write_state_);
707*6777b538SAndroid Build Coastguard Worker read_state_ = IoState::kCompleting;
708*6777b538SAndroid Build Coastguard Worker }
709*6777b538SAndroid Build Coastguard Worker
MaybePostWriteCompleteTask()710*6777b538SAndroid Build Coastguard Worker void SequencedSocketData::MaybePostWriteCompleteTask() {
711*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " ****** ") << " current: " << sequence_number_;
712*6777b538SAndroid Build Coastguard Worker // Only trigger the next write to complete if there is already a write pending
713*6777b538SAndroid Build Coastguard Worker // which should complete at the current sequence number.
714*6777b538SAndroid Build Coastguard Worker if (write_state_ != IoState::kPending ||
715*6777b538SAndroid Build Coastguard Worker helper_.PeekWrite().sequence_number != sequence_number_) {
716*6777b538SAndroid Build Coastguard Worker return;
717*6777b538SAndroid Build Coastguard Worker }
718*6777b538SAndroid Build Coastguard Worker
719*6777b538SAndroid Build Coastguard Worker // If the result is ERR_IO_PENDING, then pause.
720*6777b538SAndroid Build Coastguard Worker if (helper_.PeekWrite().result == ERR_IO_PENDING) {
721*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Pausing write at: " << sequence_number_;
722*6777b538SAndroid Build Coastguard Worker write_state_ = IoState::kPaused;
723*6777b538SAndroid Build Coastguard Worker if (run_until_paused_run_loop_)
724*6777b538SAndroid Build Coastguard Worker run_until_paused_run_loop_->Quit();
725*6777b538SAndroid Build Coastguard Worker return;
726*6777b538SAndroid Build Coastguard Worker }
727*6777b538SAndroid Build Coastguard Worker
728*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " ****** ") << "Posting task to complete write: "
729*6777b538SAndroid Build Coastguard Worker << sequence_number_;
730*6777b538SAndroid Build Coastguard Worker base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
731*6777b538SAndroid Build Coastguard Worker FROM_HERE, base::BindOnce(&SequencedSocketData::OnWriteComplete,
732*6777b538SAndroid Build Coastguard Worker weak_factory_.GetWeakPtr()));
733*6777b538SAndroid Build Coastguard Worker CHECK_NE(IoState::kCompleting, read_state_);
734*6777b538SAndroid Build Coastguard Worker write_state_ = IoState::kCompleting;
735*6777b538SAndroid Build Coastguard Worker }
736*6777b538SAndroid Build Coastguard Worker
Reset()737*6777b538SAndroid Build Coastguard Worker void SequencedSocketData::Reset() {
738*6777b538SAndroid Build Coastguard Worker helper_.Reset();
739*6777b538SAndroid Build Coastguard Worker sequence_number_ = 0;
740*6777b538SAndroid Build Coastguard Worker read_state_ = IoState::kIdle;
741*6777b538SAndroid Build Coastguard Worker write_state_ = IoState::kIdle;
742*6777b538SAndroid Build Coastguard Worker weak_factory_.InvalidateWeakPtrs();
743*6777b538SAndroid Build Coastguard Worker }
744*6777b538SAndroid Build Coastguard Worker
OnReadComplete()745*6777b538SAndroid Build Coastguard Worker void SequencedSocketData::OnReadComplete() {
746*6777b538SAndroid Build Coastguard Worker CHECK_EQ(IoState::kCompleting, read_state_);
747*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Completing read for: " << sequence_number_;
748*6777b538SAndroid Build Coastguard Worker
749*6777b538SAndroid Build Coastguard Worker MockRead data = helper_.AdvanceRead();
750*6777b538SAndroid Build Coastguard Worker DCHECK_EQ(sequence_number_, data.sequence_number);
751*6777b538SAndroid Build Coastguard Worker sequence_number_++;
752*6777b538SAndroid Build Coastguard Worker read_state_ = IoState::kIdle;
753*6777b538SAndroid Build Coastguard Worker
754*6777b538SAndroid Build Coastguard Worker // The result of this read completing might trigger the completion
755*6777b538SAndroid Build Coastguard Worker // of a pending write. If so, post a task to complete the write later.
756*6777b538SAndroid Build Coastguard Worker // Since the socket may call back into the SequencedSocketData
757*6777b538SAndroid Build Coastguard Worker // from socket()->OnReadComplete(), trigger the write task to be posted
758*6777b538SAndroid Build Coastguard Worker // before calling that.
759*6777b538SAndroid Build Coastguard Worker MaybePostWriteCompleteTask();
760*6777b538SAndroid Build Coastguard Worker
761*6777b538SAndroid Build Coastguard Worker if (!socket()) {
762*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "No socket available to complete read";
763*6777b538SAndroid Build Coastguard Worker return;
764*6777b538SAndroid Build Coastguard Worker }
765*6777b538SAndroid Build Coastguard Worker
766*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Completing socket read for: "
767*6777b538SAndroid Build Coastguard Worker << data.sequence_number;
768*6777b538SAndroid Build Coastguard Worker DumpMockReadWrite(data);
769*6777b538SAndroid Build Coastguard Worker socket()->OnReadComplete(data);
770*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Done";
771*6777b538SAndroid Build Coastguard Worker }
772*6777b538SAndroid Build Coastguard Worker
OnWriteComplete()773*6777b538SAndroid Build Coastguard Worker void SequencedSocketData::OnWriteComplete() {
774*6777b538SAndroid Build Coastguard Worker CHECK_EQ(IoState::kCompleting, write_state_);
775*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << " Completing write for: " << sequence_number_;
776*6777b538SAndroid Build Coastguard Worker
777*6777b538SAndroid Build Coastguard Worker const MockWrite& data = helper_.AdvanceWrite();
778*6777b538SAndroid Build Coastguard Worker DCHECK_EQ(sequence_number_, data.sequence_number);
779*6777b538SAndroid Build Coastguard Worker sequence_number_++;
780*6777b538SAndroid Build Coastguard Worker write_state_ = IoState::kIdle;
781*6777b538SAndroid Build Coastguard Worker int rv = data.result == OK ? data.data_len : data.result;
782*6777b538SAndroid Build Coastguard Worker
783*6777b538SAndroid Build Coastguard Worker // The result of this write completing might trigger the completion
784*6777b538SAndroid Build Coastguard Worker // of a pending read. If so, post a task to complete the read later.
785*6777b538SAndroid Build Coastguard Worker // Since the socket may call back into the SequencedSocketData
786*6777b538SAndroid Build Coastguard Worker // from socket()->OnWriteComplete(), trigger the write task to be posted
787*6777b538SAndroid Build Coastguard Worker // before calling that.
788*6777b538SAndroid Build Coastguard Worker MaybePostReadCompleteTask();
789*6777b538SAndroid Build Coastguard Worker
790*6777b538SAndroid Build Coastguard Worker if (!socket()) {
791*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "No socket available to complete write";
792*6777b538SAndroid Build Coastguard Worker return;
793*6777b538SAndroid Build Coastguard Worker }
794*6777b538SAndroid Build Coastguard Worker
795*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << " Completing socket write for: "
796*6777b538SAndroid Build Coastguard Worker << data.sequence_number;
797*6777b538SAndroid Build Coastguard Worker socket()->OnWriteComplete(rv);
798*6777b538SAndroid Build Coastguard Worker NET_TRACE(1, " *** ") << "Done";
799*6777b538SAndroid Build Coastguard Worker }
800*6777b538SAndroid Build Coastguard Worker
801*6777b538SAndroid Build Coastguard Worker SequencedSocketData::~SequencedSocketData() = default;
802*6777b538SAndroid Build Coastguard Worker
803*6777b538SAndroid Build Coastguard Worker MockClientSocketFactory::MockClientSocketFactory() = default;
804*6777b538SAndroid Build Coastguard Worker
805*6777b538SAndroid Build Coastguard Worker MockClientSocketFactory::~MockClientSocketFactory() = default;
806*6777b538SAndroid Build Coastguard Worker
AddSocketDataProvider(SocketDataProvider * data)807*6777b538SAndroid Build Coastguard Worker void MockClientSocketFactory::AddSocketDataProvider(SocketDataProvider* data) {
808*6777b538SAndroid Build Coastguard Worker mock_data_.Add(data);
809*6777b538SAndroid Build Coastguard Worker }
810*6777b538SAndroid Build Coastguard Worker
AddTcpSocketDataProvider(SocketDataProvider * data)811*6777b538SAndroid Build Coastguard Worker void MockClientSocketFactory::AddTcpSocketDataProvider(
812*6777b538SAndroid Build Coastguard Worker SocketDataProvider* data) {
813*6777b538SAndroid Build Coastguard Worker mock_tcp_data_.Add(data);
814*6777b538SAndroid Build Coastguard Worker }
815*6777b538SAndroid Build Coastguard Worker
AddSSLSocketDataProvider(SSLSocketDataProvider * data)816*6777b538SAndroid Build Coastguard Worker void MockClientSocketFactory::AddSSLSocketDataProvider(
817*6777b538SAndroid Build Coastguard Worker SSLSocketDataProvider* data) {
818*6777b538SAndroid Build Coastguard Worker mock_ssl_data_.Add(data);
819*6777b538SAndroid Build Coastguard Worker }
820*6777b538SAndroid Build Coastguard Worker
ResetNextMockIndexes()821*6777b538SAndroid Build Coastguard Worker void MockClientSocketFactory::ResetNextMockIndexes() {
822*6777b538SAndroid Build Coastguard Worker mock_data_.ResetNextIndex();
823*6777b538SAndroid Build Coastguard Worker mock_ssl_data_.ResetNextIndex();
824*6777b538SAndroid Build Coastguard Worker }
825*6777b538SAndroid Build Coastguard Worker
826*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DatagramClientSocket>
CreateDatagramClientSocket(DatagramSocket::BindType bind_type,NetLog * net_log,const NetLogSource & source)827*6777b538SAndroid Build Coastguard Worker MockClientSocketFactory::CreateDatagramClientSocket(
828*6777b538SAndroid Build Coastguard Worker DatagramSocket::BindType bind_type,
829*6777b538SAndroid Build Coastguard Worker NetLog* net_log,
830*6777b538SAndroid Build Coastguard Worker const NetLogSource& source) {
831*6777b538SAndroid Build Coastguard Worker SocketDataProvider* data_provider = mock_data_.GetNext();
832*6777b538SAndroid Build Coastguard Worker auto socket = std::make_unique<MockUDPClientSocket>(data_provider, net_log);
833*6777b538SAndroid Build Coastguard Worker if (bind_type == DatagramSocket::RANDOM_BIND)
834*6777b538SAndroid Build Coastguard Worker socket->set_source_port(static_cast<uint16_t>(base::RandInt(1025, 65535)));
835*6777b538SAndroid Build Coastguard Worker udp_client_socket_ports_.push_back(socket->source_port());
836*6777b538SAndroid Build Coastguard Worker return std::move(socket);
837*6777b538SAndroid Build Coastguard Worker }
838*6777b538SAndroid Build Coastguard Worker
839*6777b538SAndroid Build Coastguard Worker std::unique_ptr<TransportClientSocket>
CreateTransportClientSocket(const AddressList & addresses,std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,NetworkQualityEstimator * network_quality_estimator,NetLog * net_log,const NetLogSource & source)840*6777b538SAndroid Build Coastguard Worker MockClientSocketFactory::CreateTransportClientSocket(
841*6777b538SAndroid Build Coastguard Worker const AddressList& addresses,
842*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
843*6777b538SAndroid Build Coastguard Worker NetworkQualityEstimator* network_quality_estimator,
844*6777b538SAndroid Build Coastguard Worker NetLog* net_log,
845*6777b538SAndroid Build Coastguard Worker const NetLogSource& source) {
846*6777b538SAndroid Build Coastguard Worker SocketDataProvider* data_provider = mock_tcp_data_.GetNextWithoutAsserting();
847*6777b538SAndroid Build Coastguard Worker if (!data_provider)
848*6777b538SAndroid Build Coastguard Worker data_provider = mock_data_.GetNext();
849*6777b538SAndroid Build Coastguard Worker auto socket =
850*6777b538SAndroid Build Coastguard Worker std::make_unique<MockTCPClientSocket>(addresses, net_log, data_provider);
851*6777b538SAndroid Build Coastguard Worker if (enable_read_if_ready_)
852*6777b538SAndroid Build Coastguard Worker socket->set_enable_read_if_ready(enable_read_if_ready_);
853*6777b538SAndroid Build Coastguard Worker return std::move(socket);
854*6777b538SAndroid Build Coastguard Worker }
855*6777b538SAndroid Build Coastguard Worker
CreateSSLClientSocket(SSLClientContext * context,std::unique_ptr<StreamSocket> stream_socket,const HostPortPair & host_and_port,const SSLConfig & ssl_config)856*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SSLClientSocket> MockClientSocketFactory::CreateSSLClientSocket(
857*6777b538SAndroid Build Coastguard Worker SSLClientContext* context,
858*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> stream_socket,
859*6777b538SAndroid Build Coastguard Worker const HostPortPair& host_and_port,
860*6777b538SAndroid Build Coastguard Worker const SSLConfig& ssl_config) {
861*6777b538SAndroid Build Coastguard Worker SSLSocketDataProvider* next_ssl_data = mock_ssl_data_.GetNext();
862*6777b538SAndroid Build Coastguard Worker if (next_ssl_data->next_protos_expected_in_ssl_config.has_value()) {
863*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::ranges::equal(
864*6777b538SAndroid Build Coastguard Worker next_ssl_data->next_protos_expected_in_ssl_config.value(),
865*6777b538SAndroid Build Coastguard Worker ssl_config.alpn_protos));
866*6777b538SAndroid Build Coastguard Worker }
867*6777b538SAndroid Build Coastguard Worker if (next_ssl_data->expected_application_settings) {
868*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*next_ssl_data->expected_application_settings,
869*6777b538SAndroid Build Coastguard Worker ssl_config.application_settings);
870*6777b538SAndroid Build Coastguard Worker }
871*6777b538SAndroid Build Coastguard Worker
872*6777b538SAndroid Build Coastguard Worker // The protocol version used is a combination of the per-socket SSLConfig and
873*6777b538SAndroid Build Coastguard Worker // the SSLConfigService.
874*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
875*6777b538SAndroid Build Coastguard Worker next_ssl_data->expected_ssl_version_min,
876*6777b538SAndroid Build Coastguard Worker ssl_config.version_min_override.value_or(context->config().version_min));
877*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
878*6777b538SAndroid Build Coastguard Worker next_ssl_data->expected_ssl_version_max,
879*6777b538SAndroid Build Coastguard Worker ssl_config.version_max_override.value_or(context->config().version_max));
880*6777b538SAndroid Build Coastguard Worker
881*6777b538SAndroid Build Coastguard Worker if (next_ssl_data->expected_early_data_enabled) {
882*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*next_ssl_data->expected_early_data_enabled,
883*6777b538SAndroid Build Coastguard Worker ssl_config.early_data_enabled);
884*6777b538SAndroid Build Coastguard Worker }
885*6777b538SAndroid Build Coastguard Worker
886*6777b538SAndroid Build Coastguard Worker if (next_ssl_data->expected_send_client_cert) {
887*6777b538SAndroid Build Coastguard Worker // Client certificate preferences come from |context|.
888*6777b538SAndroid Build Coastguard Worker scoped_refptr<X509Certificate> client_cert;
889*6777b538SAndroid Build Coastguard Worker scoped_refptr<SSLPrivateKey> client_private_key;
890*6777b538SAndroid Build Coastguard Worker bool send_client_cert = context->GetClientCertificate(
891*6777b538SAndroid Build Coastguard Worker host_and_port, &client_cert, &client_private_key);
892*6777b538SAndroid Build Coastguard Worker
893*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*next_ssl_data->expected_send_client_cert, send_client_cert);
894*6777b538SAndroid Build Coastguard Worker // Note |send_client_cert| may be true while |client_cert| is null if the
895*6777b538SAndroid Build Coastguard Worker // socket is configured to continue without a certificate, as opposed to
896*6777b538SAndroid Build Coastguard Worker // surfacing the certificate challenge.
897*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(!!next_ssl_data->expected_client_cert, !!client_cert);
898*6777b538SAndroid Build Coastguard Worker if (next_ssl_data->expected_client_cert && client_cert) {
899*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(next_ssl_data->expected_client_cert->EqualsIncludingChain(
900*6777b538SAndroid Build Coastguard Worker client_cert.get()));
901*6777b538SAndroid Build Coastguard Worker }
902*6777b538SAndroid Build Coastguard Worker }
903*6777b538SAndroid Build Coastguard Worker if (next_ssl_data->expected_host_and_port) {
904*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*next_ssl_data->expected_host_and_port, host_and_port);
905*6777b538SAndroid Build Coastguard Worker }
906*6777b538SAndroid Build Coastguard Worker if (next_ssl_data->expected_ignore_certificate_errors) {
907*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*next_ssl_data->expected_ignore_certificate_errors,
908*6777b538SAndroid Build Coastguard Worker ssl_config.ignore_certificate_errors);
909*6777b538SAndroid Build Coastguard Worker }
910*6777b538SAndroid Build Coastguard Worker if (next_ssl_data->expected_network_anonymization_key) {
911*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*next_ssl_data->expected_network_anonymization_key,
912*6777b538SAndroid Build Coastguard Worker ssl_config.network_anonymization_key);
913*6777b538SAndroid Build Coastguard Worker }
914*6777b538SAndroid Build Coastguard Worker if (next_ssl_data->expected_ech_config_list) {
915*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*next_ssl_data->expected_ech_config_list,
916*6777b538SAndroid Build Coastguard Worker ssl_config.ech_config_list);
917*6777b538SAndroid Build Coastguard Worker }
918*6777b538SAndroid Build Coastguard Worker return std::make_unique<MockSSLClientSocket>(
919*6777b538SAndroid Build Coastguard Worker std::move(stream_socket), host_and_port, ssl_config, next_ssl_data);
920*6777b538SAndroid Build Coastguard Worker }
921*6777b538SAndroid Build Coastguard Worker
MockClientSocket(const NetLogWithSource & net_log)922*6777b538SAndroid Build Coastguard Worker MockClientSocket::MockClientSocket(const NetLogWithSource& net_log)
923*6777b538SAndroid Build Coastguard Worker : net_log_(net_log) {
924*6777b538SAndroid Build Coastguard Worker local_addr_ = IPEndPoint(IPAddress(192, 0, 2, 33), 123);
925*6777b538SAndroid Build Coastguard Worker peer_addr_ = IPEndPoint(IPAddress(192, 0, 2, 33), 0);
926*6777b538SAndroid Build Coastguard Worker }
927*6777b538SAndroid Build Coastguard Worker
SetReceiveBufferSize(int32_t size)928*6777b538SAndroid Build Coastguard Worker int MockClientSocket::SetReceiveBufferSize(int32_t size) {
929*6777b538SAndroid Build Coastguard Worker return OK;
930*6777b538SAndroid Build Coastguard Worker }
931*6777b538SAndroid Build Coastguard Worker
SetSendBufferSize(int32_t size)932*6777b538SAndroid Build Coastguard Worker int MockClientSocket::SetSendBufferSize(int32_t size) {
933*6777b538SAndroid Build Coastguard Worker return OK;
934*6777b538SAndroid Build Coastguard Worker }
935*6777b538SAndroid Build Coastguard Worker
Bind(const net::IPEndPoint & local_addr)936*6777b538SAndroid Build Coastguard Worker int MockClientSocket::Bind(const net::IPEndPoint& local_addr) {
937*6777b538SAndroid Build Coastguard Worker local_addr_ = local_addr;
938*6777b538SAndroid Build Coastguard Worker return net::OK;
939*6777b538SAndroid Build Coastguard Worker }
940*6777b538SAndroid Build Coastguard Worker
SetNoDelay(bool no_delay)941*6777b538SAndroid Build Coastguard Worker bool MockClientSocket::SetNoDelay(bool no_delay) {
942*6777b538SAndroid Build Coastguard Worker return true;
943*6777b538SAndroid Build Coastguard Worker }
944*6777b538SAndroid Build Coastguard Worker
SetKeepAlive(bool enable,int delay)945*6777b538SAndroid Build Coastguard Worker bool MockClientSocket::SetKeepAlive(bool enable, int delay) {
946*6777b538SAndroid Build Coastguard Worker return true;
947*6777b538SAndroid Build Coastguard Worker }
948*6777b538SAndroid Build Coastguard Worker
Disconnect()949*6777b538SAndroid Build Coastguard Worker void MockClientSocket::Disconnect() {
950*6777b538SAndroid Build Coastguard Worker connected_ = false;
951*6777b538SAndroid Build Coastguard Worker }
952*6777b538SAndroid Build Coastguard Worker
IsConnected() const953*6777b538SAndroid Build Coastguard Worker bool MockClientSocket::IsConnected() const {
954*6777b538SAndroid Build Coastguard Worker return connected_;
955*6777b538SAndroid Build Coastguard Worker }
956*6777b538SAndroid Build Coastguard Worker
IsConnectedAndIdle() const957*6777b538SAndroid Build Coastguard Worker bool MockClientSocket::IsConnectedAndIdle() const {
958*6777b538SAndroid Build Coastguard Worker return connected_;
959*6777b538SAndroid Build Coastguard Worker }
960*6777b538SAndroid Build Coastguard Worker
GetPeerAddress(IPEndPoint * address) const961*6777b538SAndroid Build Coastguard Worker int MockClientSocket::GetPeerAddress(IPEndPoint* address) const {
962*6777b538SAndroid Build Coastguard Worker if (!IsConnected())
963*6777b538SAndroid Build Coastguard Worker return ERR_SOCKET_NOT_CONNECTED;
964*6777b538SAndroid Build Coastguard Worker *address = peer_addr_;
965*6777b538SAndroid Build Coastguard Worker return OK;
966*6777b538SAndroid Build Coastguard Worker }
967*6777b538SAndroid Build Coastguard Worker
GetLocalAddress(IPEndPoint * address) const968*6777b538SAndroid Build Coastguard Worker int MockClientSocket::GetLocalAddress(IPEndPoint* address) const {
969*6777b538SAndroid Build Coastguard Worker *address = local_addr_;
970*6777b538SAndroid Build Coastguard Worker return OK;
971*6777b538SAndroid Build Coastguard Worker }
972*6777b538SAndroid Build Coastguard Worker
NetLog() const973*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& MockClientSocket::NetLog() const {
974*6777b538SAndroid Build Coastguard Worker return net_log_;
975*6777b538SAndroid Build Coastguard Worker }
976*6777b538SAndroid Build Coastguard Worker
GetNegotiatedProtocol() const977*6777b538SAndroid Build Coastguard Worker NextProto MockClientSocket::GetNegotiatedProtocol() const {
978*6777b538SAndroid Build Coastguard Worker return kProtoUnknown;
979*6777b538SAndroid Build Coastguard Worker }
980*6777b538SAndroid Build Coastguard Worker
981*6777b538SAndroid Build Coastguard Worker MockClientSocket::~MockClientSocket() = default;
982*6777b538SAndroid Build Coastguard Worker
RunCallbackAsync(CompletionOnceCallback callback,int result)983*6777b538SAndroid Build Coastguard Worker void MockClientSocket::RunCallbackAsync(CompletionOnceCallback callback,
984*6777b538SAndroid Build Coastguard Worker int result) {
985*6777b538SAndroid Build Coastguard Worker base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
986*6777b538SAndroid Build Coastguard Worker FROM_HERE,
987*6777b538SAndroid Build Coastguard Worker base::BindOnce(&MockClientSocket::RunCallback, weak_factory_.GetWeakPtr(),
988*6777b538SAndroid Build Coastguard Worker std::move(callback), result));
989*6777b538SAndroid Build Coastguard Worker }
990*6777b538SAndroid Build Coastguard Worker
RunCallback(CompletionOnceCallback callback,int result)991*6777b538SAndroid Build Coastguard Worker void MockClientSocket::RunCallback(CompletionOnceCallback callback,
992*6777b538SAndroid Build Coastguard Worker int result) {
993*6777b538SAndroid Build Coastguard Worker std::move(callback).Run(result);
994*6777b538SAndroid Build Coastguard Worker }
995*6777b538SAndroid Build Coastguard Worker
MockTCPClientSocket(const AddressList & addresses,net::NetLog * net_log,SocketDataProvider * data)996*6777b538SAndroid Build Coastguard Worker MockTCPClientSocket::MockTCPClientSocket(const AddressList& addresses,
997*6777b538SAndroid Build Coastguard Worker net::NetLog* net_log,
998*6777b538SAndroid Build Coastguard Worker SocketDataProvider* data)
999*6777b538SAndroid Build Coastguard Worker : MockClientSocket(NetLogWithSource::Make(net_log, NetLogSourceType::NONE)),
1000*6777b538SAndroid Build Coastguard Worker addresses_(addresses),
1001*6777b538SAndroid Build Coastguard Worker data_(data),
1002*6777b538SAndroid Build Coastguard Worker read_data_(SYNCHRONOUS, ERR_UNEXPECTED) {
1003*6777b538SAndroid Build Coastguard Worker DCHECK(data_);
1004*6777b538SAndroid Build Coastguard Worker peer_addr_ = data->connect_data().peer_addr;
1005*6777b538SAndroid Build Coastguard Worker data_->Initialize(this);
1006*6777b538SAndroid Build Coastguard Worker if (data_->expected_addresses()) {
1007*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(*data_->expected_addresses(), addresses);
1008*6777b538SAndroid Build Coastguard Worker }
1009*6777b538SAndroid Build Coastguard Worker }
1010*6777b538SAndroid Build Coastguard Worker
~MockTCPClientSocket()1011*6777b538SAndroid Build Coastguard Worker MockTCPClientSocket::~MockTCPClientSocket() {
1012*6777b538SAndroid Build Coastguard Worker if (data_)
1013*6777b538SAndroid Build Coastguard Worker data_->DetachSocket();
1014*6777b538SAndroid Build Coastguard Worker }
1015*6777b538SAndroid Build Coastguard Worker
Read(IOBuffer * buf,int buf_len,CompletionOnceCallback callback)1016*6777b538SAndroid Build Coastguard Worker int MockTCPClientSocket::Read(IOBuffer* buf,
1017*6777b538SAndroid Build Coastguard Worker int buf_len,
1018*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) {
1019*6777b538SAndroid Build Coastguard Worker // If the buffer is already in use, a read is already in progress!
1020*6777b538SAndroid Build Coastguard Worker DCHECK(!pending_read_buf_);
1021*6777b538SAndroid Build Coastguard Worker // Use base::Unretained() is safe because MockClientSocket::RunCallbackAsync()
1022*6777b538SAndroid Build Coastguard Worker // takes a weak ptr of the base class, MockClientSocket.
1023*6777b538SAndroid Build Coastguard Worker int rv = ReadIfReadyImpl(
1024*6777b538SAndroid Build Coastguard Worker buf, buf_len,
1025*6777b538SAndroid Build Coastguard Worker base::BindOnce(&MockTCPClientSocket::RetryRead, base::Unretained(this)));
1026*6777b538SAndroid Build Coastguard Worker if (rv == ERR_IO_PENDING) {
1027*6777b538SAndroid Build Coastguard Worker DCHECK(callback);
1028*6777b538SAndroid Build Coastguard Worker
1029*6777b538SAndroid Build Coastguard Worker pending_read_buf_ = buf;
1030*6777b538SAndroid Build Coastguard Worker pending_read_buf_len_ = buf_len;
1031*6777b538SAndroid Build Coastguard Worker pending_read_callback_ = std::move(callback);
1032*6777b538SAndroid Build Coastguard Worker }
1033*6777b538SAndroid Build Coastguard Worker return rv;
1034*6777b538SAndroid Build Coastguard Worker }
1035*6777b538SAndroid Build Coastguard Worker
ReadIfReady(IOBuffer * buf,int buf_len,CompletionOnceCallback callback)1036*6777b538SAndroid Build Coastguard Worker int MockTCPClientSocket::ReadIfReady(IOBuffer* buf,
1037*6777b538SAndroid Build Coastguard Worker int buf_len,
1038*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) {
1039*6777b538SAndroid Build Coastguard Worker DCHECK(!pending_read_if_ready_callback_);
1040*6777b538SAndroid Build Coastguard Worker
1041*6777b538SAndroid Build Coastguard Worker if (!enable_read_if_ready_)
1042*6777b538SAndroid Build Coastguard Worker return ERR_READ_IF_READY_NOT_IMPLEMENTED;
1043*6777b538SAndroid Build Coastguard Worker return ReadIfReadyImpl(buf, buf_len, std::move(callback));
1044*6777b538SAndroid Build Coastguard Worker }
1045*6777b538SAndroid Build Coastguard Worker
CancelReadIfReady()1046*6777b538SAndroid Build Coastguard Worker int MockTCPClientSocket::CancelReadIfReady() {
1047*6777b538SAndroid Build Coastguard Worker DCHECK(pending_read_if_ready_callback_);
1048*6777b538SAndroid Build Coastguard Worker
1049*6777b538SAndroid Build Coastguard Worker pending_read_if_ready_callback_.Reset();
1050*6777b538SAndroid Build Coastguard Worker data_->CancelPendingRead();
1051*6777b538SAndroid Build Coastguard Worker return OK;
1052*6777b538SAndroid Build Coastguard Worker }
1053*6777b538SAndroid Build Coastguard Worker
Write(IOBuffer * buf,int buf_len,CompletionOnceCallback callback,const NetworkTrafficAnnotationTag &)1054*6777b538SAndroid Build Coastguard Worker int MockTCPClientSocket::Write(
1055*6777b538SAndroid Build Coastguard Worker IOBuffer* buf,
1056*6777b538SAndroid Build Coastguard Worker int buf_len,
1057*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback,
1058*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
1059*6777b538SAndroid Build Coastguard Worker DCHECK(buf);
1060*6777b538SAndroid Build Coastguard Worker DCHECK_GT(buf_len, 0);
1061*6777b538SAndroid Build Coastguard Worker
1062*6777b538SAndroid Build Coastguard Worker if (!connected_ || !data_)
1063*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1064*6777b538SAndroid Build Coastguard Worker
1065*6777b538SAndroid Build Coastguard Worker std::string data(buf->data(), buf_len);
1066*6777b538SAndroid Build Coastguard Worker MockWriteResult write_result = data_->OnWrite(data);
1067*6777b538SAndroid Build Coastguard Worker
1068*6777b538SAndroid Build Coastguard Worker was_used_to_convey_data_ = true;
1069*6777b538SAndroid Build Coastguard Worker
1070*6777b538SAndroid Build Coastguard Worker if (write_result.result == ERR_CONNECTION_CLOSED) {
1071*6777b538SAndroid Build Coastguard Worker // This MockWrite is just a marker to instruct us to set
1072*6777b538SAndroid Build Coastguard Worker // peer_closed_connection_.
1073*6777b538SAndroid Build Coastguard Worker peer_closed_connection_ = true;
1074*6777b538SAndroid Build Coastguard Worker }
1075*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING is a signal that the socket data will call back
1076*6777b538SAndroid Build Coastguard Worker // asynchronously later.
1077*6777b538SAndroid Build Coastguard Worker if (write_result.result == ERR_IO_PENDING) {
1078*6777b538SAndroid Build Coastguard Worker pending_write_callback_ = std::move(callback);
1079*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1080*6777b538SAndroid Build Coastguard Worker }
1081*6777b538SAndroid Build Coastguard Worker
1082*6777b538SAndroid Build Coastguard Worker if (write_result.mode == ASYNC) {
1083*6777b538SAndroid Build Coastguard Worker RunCallbackAsync(std::move(callback), write_result.result);
1084*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1085*6777b538SAndroid Build Coastguard Worker }
1086*6777b538SAndroid Build Coastguard Worker
1087*6777b538SAndroid Build Coastguard Worker return write_result.result;
1088*6777b538SAndroid Build Coastguard Worker }
1089*6777b538SAndroid Build Coastguard Worker
SetReceiveBufferSize(int32_t size)1090*6777b538SAndroid Build Coastguard Worker int MockTCPClientSocket::SetReceiveBufferSize(int32_t size) {
1091*6777b538SAndroid Build Coastguard Worker if (!connected_)
1092*6777b538SAndroid Build Coastguard Worker return net::ERR_UNEXPECTED;
1093*6777b538SAndroid Build Coastguard Worker data_->set_receive_buffer_size(size);
1094*6777b538SAndroid Build Coastguard Worker return data_->set_receive_buffer_size_result();
1095*6777b538SAndroid Build Coastguard Worker }
1096*6777b538SAndroid Build Coastguard Worker
SetSendBufferSize(int32_t size)1097*6777b538SAndroid Build Coastguard Worker int MockTCPClientSocket::SetSendBufferSize(int32_t size) {
1098*6777b538SAndroid Build Coastguard Worker if (!connected_)
1099*6777b538SAndroid Build Coastguard Worker return net::ERR_UNEXPECTED;
1100*6777b538SAndroid Build Coastguard Worker data_->set_send_buffer_size(size);
1101*6777b538SAndroid Build Coastguard Worker return data_->set_send_buffer_size_result();
1102*6777b538SAndroid Build Coastguard Worker }
1103*6777b538SAndroid Build Coastguard Worker
SetNoDelay(bool no_delay)1104*6777b538SAndroid Build Coastguard Worker bool MockTCPClientSocket::SetNoDelay(bool no_delay) {
1105*6777b538SAndroid Build Coastguard Worker if (!connected_)
1106*6777b538SAndroid Build Coastguard Worker return false;
1107*6777b538SAndroid Build Coastguard Worker data_->set_no_delay(no_delay);
1108*6777b538SAndroid Build Coastguard Worker return data_->set_no_delay_result();
1109*6777b538SAndroid Build Coastguard Worker }
1110*6777b538SAndroid Build Coastguard Worker
SetKeepAlive(bool enable,int delay)1111*6777b538SAndroid Build Coastguard Worker bool MockTCPClientSocket::SetKeepAlive(bool enable, int delay) {
1112*6777b538SAndroid Build Coastguard Worker if (!connected_)
1113*6777b538SAndroid Build Coastguard Worker return false;
1114*6777b538SAndroid Build Coastguard Worker data_->set_keep_alive(enable, delay);
1115*6777b538SAndroid Build Coastguard Worker return data_->set_keep_alive_result();
1116*6777b538SAndroid Build Coastguard Worker }
1117*6777b538SAndroid Build Coastguard Worker
SetBeforeConnectCallback(const BeforeConnectCallback & before_connect_callback)1118*6777b538SAndroid Build Coastguard Worker void MockTCPClientSocket::SetBeforeConnectCallback(
1119*6777b538SAndroid Build Coastguard Worker const BeforeConnectCallback& before_connect_callback) {
1120*6777b538SAndroid Build Coastguard Worker DCHECK(!before_connect_callback_);
1121*6777b538SAndroid Build Coastguard Worker DCHECK(!connected_);
1122*6777b538SAndroid Build Coastguard Worker
1123*6777b538SAndroid Build Coastguard Worker before_connect_callback_ = before_connect_callback;
1124*6777b538SAndroid Build Coastguard Worker }
1125*6777b538SAndroid Build Coastguard Worker
Connect(CompletionOnceCallback callback)1126*6777b538SAndroid Build Coastguard Worker int MockTCPClientSocket::Connect(CompletionOnceCallback callback) {
1127*6777b538SAndroid Build Coastguard Worker if (!data_)
1128*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1129*6777b538SAndroid Build Coastguard Worker
1130*6777b538SAndroid Build Coastguard Worker if (connected_)
1131*6777b538SAndroid Build Coastguard Worker return OK;
1132*6777b538SAndroid Build Coastguard Worker
1133*6777b538SAndroid Build Coastguard Worker // Setting socket options fails if not connected, so need to set this before
1134*6777b538SAndroid Build Coastguard Worker // calling |before_connect_callback_|.
1135*6777b538SAndroid Build Coastguard Worker connected_ = true;
1136*6777b538SAndroid Build Coastguard Worker
1137*6777b538SAndroid Build Coastguard Worker if (before_connect_callback_) {
1138*6777b538SAndroid Build Coastguard Worker for (size_t index = 0; index < addresses_.size(); index++) {
1139*6777b538SAndroid Build Coastguard Worker int result = before_connect_callback_.Run();
1140*6777b538SAndroid Build Coastguard Worker if (data_->connect_data().first_attempt_fails && index == 0) {
1141*6777b538SAndroid Build Coastguard Worker continue;
1142*6777b538SAndroid Build Coastguard Worker }
1143*6777b538SAndroid Build Coastguard Worker DCHECK_NE(result, ERR_IO_PENDING);
1144*6777b538SAndroid Build Coastguard Worker if (result != net::OK) {
1145*6777b538SAndroid Build Coastguard Worker connected_ = false;
1146*6777b538SAndroid Build Coastguard Worker return result;
1147*6777b538SAndroid Build Coastguard Worker }
1148*6777b538SAndroid Build Coastguard Worker break;
1149*6777b538SAndroid Build Coastguard Worker }
1150*6777b538SAndroid Build Coastguard Worker }
1151*6777b538SAndroid Build Coastguard Worker
1152*6777b538SAndroid Build Coastguard Worker peer_closed_connection_ = false;
1153*6777b538SAndroid Build Coastguard Worker
1154*6777b538SAndroid Build Coastguard Worker int result = data_->connect_data().result;
1155*6777b538SAndroid Build Coastguard Worker IoMode mode = data_->connect_data().mode;
1156*6777b538SAndroid Build Coastguard Worker if (mode == SYNCHRONOUS)
1157*6777b538SAndroid Build Coastguard Worker return result;
1158*6777b538SAndroid Build Coastguard Worker
1159*6777b538SAndroid Build Coastguard Worker DCHECK(callback);
1160*6777b538SAndroid Build Coastguard Worker
1161*6777b538SAndroid Build Coastguard Worker if (result == ERR_IO_PENDING)
1162*6777b538SAndroid Build Coastguard Worker pending_connect_callback_ = std::move(callback);
1163*6777b538SAndroid Build Coastguard Worker else
1164*6777b538SAndroid Build Coastguard Worker RunCallbackAsync(std::move(callback), result);
1165*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1166*6777b538SAndroid Build Coastguard Worker }
1167*6777b538SAndroid Build Coastguard Worker
Disconnect()1168*6777b538SAndroid Build Coastguard Worker void MockTCPClientSocket::Disconnect() {
1169*6777b538SAndroid Build Coastguard Worker MockClientSocket::Disconnect();
1170*6777b538SAndroid Build Coastguard Worker pending_connect_callback_.Reset();
1171*6777b538SAndroid Build Coastguard Worker pending_read_callback_.Reset();
1172*6777b538SAndroid Build Coastguard Worker }
1173*6777b538SAndroid Build Coastguard Worker
IsConnected() const1174*6777b538SAndroid Build Coastguard Worker bool MockTCPClientSocket::IsConnected() const {
1175*6777b538SAndroid Build Coastguard Worker if (!data_)
1176*6777b538SAndroid Build Coastguard Worker return false;
1177*6777b538SAndroid Build Coastguard Worker return connected_ && !peer_closed_connection_;
1178*6777b538SAndroid Build Coastguard Worker }
1179*6777b538SAndroid Build Coastguard Worker
IsConnectedAndIdle() const1180*6777b538SAndroid Build Coastguard Worker bool MockTCPClientSocket::IsConnectedAndIdle() const {
1181*6777b538SAndroid Build Coastguard Worker if (!data_)
1182*6777b538SAndroid Build Coastguard Worker return false;
1183*6777b538SAndroid Build Coastguard Worker return IsConnected() && data_->IsIdle();
1184*6777b538SAndroid Build Coastguard Worker }
1185*6777b538SAndroid Build Coastguard Worker
GetPeerAddress(IPEndPoint * address) const1186*6777b538SAndroid Build Coastguard Worker int MockTCPClientSocket::GetPeerAddress(IPEndPoint* address) const {
1187*6777b538SAndroid Build Coastguard Worker if (addresses_.empty())
1188*6777b538SAndroid Build Coastguard Worker return MockClientSocket::GetPeerAddress(address);
1189*6777b538SAndroid Build Coastguard Worker
1190*6777b538SAndroid Build Coastguard Worker if (data_->connect_data().first_attempt_fails) {
1191*6777b538SAndroid Build Coastguard Worker DCHECK_GE(addresses_.size(), 2U);
1192*6777b538SAndroid Build Coastguard Worker *address = addresses_[1];
1193*6777b538SAndroid Build Coastguard Worker } else {
1194*6777b538SAndroid Build Coastguard Worker *address = addresses_[0];
1195*6777b538SAndroid Build Coastguard Worker }
1196*6777b538SAndroid Build Coastguard Worker return OK;
1197*6777b538SAndroid Build Coastguard Worker }
1198*6777b538SAndroid Build Coastguard Worker
WasEverUsed() const1199*6777b538SAndroid Build Coastguard Worker bool MockTCPClientSocket::WasEverUsed() const {
1200*6777b538SAndroid Build Coastguard Worker return was_used_to_convey_data_;
1201*6777b538SAndroid Build Coastguard Worker }
1202*6777b538SAndroid Build Coastguard Worker
GetSSLInfo(SSLInfo * ssl_info)1203*6777b538SAndroid Build Coastguard Worker bool MockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
1204*6777b538SAndroid Build Coastguard Worker return false;
1205*6777b538SAndroid Build Coastguard Worker }
1206*6777b538SAndroid Build Coastguard Worker
OnReadComplete(const MockRead & data)1207*6777b538SAndroid Build Coastguard Worker void MockTCPClientSocket::OnReadComplete(const MockRead& data) {
1208*6777b538SAndroid Build Coastguard Worker // If |data_| has been destroyed, safest to just do nothing.
1209*6777b538SAndroid Build Coastguard Worker if (!data_)
1210*6777b538SAndroid Build Coastguard Worker return;
1211*6777b538SAndroid Build Coastguard Worker
1212*6777b538SAndroid Build Coastguard Worker // There must be a read pending.
1213*6777b538SAndroid Build Coastguard Worker DCHECK(pending_read_if_ready_callback_);
1214*6777b538SAndroid Build Coastguard Worker // You can't complete a read with another ERR_IO_PENDING status code.
1215*6777b538SAndroid Build Coastguard Worker DCHECK_NE(ERR_IO_PENDING, data.result);
1216*6777b538SAndroid Build Coastguard Worker // Since we've been waiting for data, need_read_data_ should be true.
1217*6777b538SAndroid Build Coastguard Worker DCHECK(need_read_data_);
1218*6777b538SAndroid Build Coastguard Worker
1219*6777b538SAndroid Build Coastguard Worker read_data_ = data;
1220*6777b538SAndroid Build Coastguard Worker need_read_data_ = false;
1221*6777b538SAndroid Build Coastguard Worker
1222*6777b538SAndroid Build Coastguard Worker // The caller is simulating that this IO completes right now. Don't
1223*6777b538SAndroid Build Coastguard Worker // let CompleteRead() schedule a callback.
1224*6777b538SAndroid Build Coastguard Worker read_data_.mode = SYNCHRONOUS;
1225*6777b538SAndroid Build Coastguard Worker RunCallback(std::move(pending_read_if_ready_callback_),
1226*6777b538SAndroid Build Coastguard Worker read_data_.result > 0 ? OK : read_data_.result);
1227*6777b538SAndroid Build Coastguard Worker }
1228*6777b538SAndroid Build Coastguard Worker
OnWriteComplete(int rv)1229*6777b538SAndroid Build Coastguard Worker void MockTCPClientSocket::OnWriteComplete(int rv) {
1230*6777b538SAndroid Build Coastguard Worker // If |data_| has been destroyed, safest to just do nothing.
1231*6777b538SAndroid Build Coastguard Worker if (!data_)
1232*6777b538SAndroid Build Coastguard Worker return;
1233*6777b538SAndroid Build Coastguard Worker
1234*6777b538SAndroid Build Coastguard Worker // There must be a read pending.
1235*6777b538SAndroid Build Coastguard Worker DCHECK(!pending_write_callback_.is_null());
1236*6777b538SAndroid Build Coastguard Worker RunCallback(std::move(pending_write_callback_), rv);
1237*6777b538SAndroid Build Coastguard Worker }
1238*6777b538SAndroid Build Coastguard Worker
OnConnectComplete(const MockConnect & data)1239*6777b538SAndroid Build Coastguard Worker void MockTCPClientSocket::OnConnectComplete(const MockConnect& data) {
1240*6777b538SAndroid Build Coastguard Worker // If |data_| has been destroyed, safest to just do nothing.
1241*6777b538SAndroid Build Coastguard Worker if (!data_)
1242*6777b538SAndroid Build Coastguard Worker return;
1243*6777b538SAndroid Build Coastguard Worker
1244*6777b538SAndroid Build Coastguard Worker RunCallback(std::move(pending_connect_callback_), data.result);
1245*6777b538SAndroid Build Coastguard Worker }
1246*6777b538SAndroid Build Coastguard Worker
OnDataProviderDestroyed()1247*6777b538SAndroid Build Coastguard Worker void MockTCPClientSocket::OnDataProviderDestroyed() {
1248*6777b538SAndroid Build Coastguard Worker data_ = nullptr;
1249*6777b538SAndroid Build Coastguard Worker }
1250*6777b538SAndroid Build Coastguard Worker
RetryRead(int rv)1251*6777b538SAndroid Build Coastguard Worker void MockTCPClientSocket::RetryRead(int rv) {
1252*6777b538SAndroid Build Coastguard Worker DCHECK(pending_read_callback_);
1253*6777b538SAndroid Build Coastguard Worker DCHECK(pending_read_buf_.get());
1254*6777b538SAndroid Build Coastguard Worker DCHECK_LT(0, pending_read_buf_len_);
1255*6777b538SAndroid Build Coastguard Worker
1256*6777b538SAndroid Build Coastguard Worker if (rv == OK) {
1257*6777b538SAndroid Build Coastguard Worker rv = ReadIfReadyImpl(pending_read_buf_.get(), pending_read_buf_len_,
1258*6777b538SAndroid Build Coastguard Worker base::BindOnce(&MockTCPClientSocket::RetryRead,
1259*6777b538SAndroid Build Coastguard Worker base::Unretained(this)));
1260*6777b538SAndroid Build Coastguard Worker if (rv == ERR_IO_PENDING)
1261*6777b538SAndroid Build Coastguard Worker return;
1262*6777b538SAndroid Build Coastguard Worker }
1263*6777b538SAndroid Build Coastguard Worker pending_read_buf_ = nullptr;
1264*6777b538SAndroid Build Coastguard Worker pending_read_buf_len_ = 0;
1265*6777b538SAndroid Build Coastguard Worker RunCallback(std::move(pending_read_callback_), rv);
1266*6777b538SAndroid Build Coastguard Worker }
1267*6777b538SAndroid Build Coastguard Worker
ReadIfReadyImpl(IOBuffer * buf,int buf_len,CompletionOnceCallback callback)1268*6777b538SAndroid Build Coastguard Worker int MockTCPClientSocket::ReadIfReadyImpl(IOBuffer* buf,
1269*6777b538SAndroid Build Coastguard Worker int buf_len,
1270*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) {
1271*6777b538SAndroid Build Coastguard Worker if (!connected_ || !data_)
1272*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1273*6777b538SAndroid Build Coastguard Worker
1274*6777b538SAndroid Build Coastguard Worker DCHECK(!pending_read_if_ready_callback_);
1275*6777b538SAndroid Build Coastguard Worker
1276*6777b538SAndroid Build Coastguard Worker if (need_read_data_) {
1277*6777b538SAndroid Build Coastguard Worker read_data_ = data_->OnRead();
1278*6777b538SAndroid Build Coastguard Worker if (read_data_.result == ERR_CONNECTION_CLOSED) {
1279*6777b538SAndroid Build Coastguard Worker // This MockRead is just a marker to instruct us to set
1280*6777b538SAndroid Build Coastguard Worker // peer_closed_connection_.
1281*6777b538SAndroid Build Coastguard Worker peer_closed_connection_ = true;
1282*6777b538SAndroid Build Coastguard Worker }
1283*6777b538SAndroid Build Coastguard Worker if (read_data_.result == ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ) {
1284*6777b538SAndroid Build Coastguard Worker // This MockRead is just a marker to instruct us to set
1285*6777b538SAndroid Build Coastguard Worker // peer_closed_connection_. Skip it and get the next one.
1286*6777b538SAndroid Build Coastguard Worker read_data_ = data_->OnRead();
1287*6777b538SAndroid Build Coastguard Worker peer_closed_connection_ = true;
1288*6777b538SAndroid Build Coastguard Worker }
1289*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility
1290*6777b538SAndroid Build Coastguard Worker // to complete the async IO manually later (via OnReadComplete).
1291*6777b538SAndroid Build Coastguard Worker if (read_data_.result == ERR_IO_PENDING) {
1292*6777b538SAndroid Build Coastguard Worker // We need to be using async IO in this case.
1293*6777b538SAndroid Build Coastguard Worker DCHECK(!callback.is_null());
1294*6777b538SAndroid Build Coastguard Worker pending_read_if_ready_callback_ = std::move(callback);
1295*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1296*6777b538SAndroid Build Coastguard Worker }
1297*6777b538SAndroid Build Coastguard Worker need_read_data_ = false;
1298*6777b538SAndroid Build Coastguard Worker }
1299*6777b538SAndroid Build Coastguard Worker
1300*6777b538SAndroid Build Coastguard Worker int result = read_data_.result;
1301*6777b538SAndroid Build Coastguard Worker DCHECK_NE(ERR_IO_PENDING, result);
1302*6777b538SAndroid Build Coastguard Worker if (read_data_.mode == ASYNC) {
1303*6777b538SAndroid Build Coastguard Worker DCHECK(!callback.is_null());
1304*6777b538SAndroid Build Coastguard Worker read_data_.mode = SYNCHRONOUS;
1305*6777b538SAndroid Build Coastguard Worker pending_read_if_ready_callback_ = std::move(callback);
1306*6777b538SAndroid Build Coastguard Worker // base::Unretained() is safe here because RunCallbackAsync will wrap it
1307*6777b538SAndroid Build Coastguard Worker // with a callback associated with a weak ptr.
1308*6777b538SAndroid Build Coastguard Worker RunCallbackAsync(
1309*6777b538SAndroid Build Coastguard Worker base::BindOnce(&MockTCPClientSocket::RunReadIfReadyCallback,
1310*6777b538SAndroid Build Coastguard Worker base::Unretained(this)),
1311*6777b538SAndroid Build Coastguard Worker result);
1312*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1313*6777b538SAndroid Build Coastguard Worker }
1314*6777b538SAndroid Build Coastguard Worker
1315*6777b538SAndroid Build Coastguard Worker was_used_to_convey_data_ = true;
1316*6777b538SAndroid Build Coastguard Worker if (read_data_.data) {
1317*6777b538SAndroid Build Coastguard Worker if (read_data_.data_len - read_offset_ > 0) {
1318*6777b538SAndroid Build Coastguard Worker result = std::min(buf_len, read_data_.data_len - read_offset_);
1319*6777b538SAndroid Build Coastguard Worker memcpy(buf->data(), read_data_.data + read_offset_, result);
1320*6777b538SAndroid Build Coastguard Worker read_offset_ += result;
1321*6777b538SAndroid Build Coastguard Worker if (read_offset_ == read_data_.data_len) {
1322*6777b538SAndroid Build Coastguard Worker need_read_data_ = true;
1323*6777b538SAndroid Build Coastguard Worker read_offset_ = 0;
1324*6777b538SAndroid Build Coastguard Worker }
1325*6777b538SAndroid Build Coastguard Worker } else {
1326*6777b538SAndroid Build Coastguard Worker result = 0; // EOF
1327*6777b538SAndroid Build Coastguard Worker }
1328*6777b538SAndroid Build Coastguard Worker }
1329*6777b538SAndroid Build Coastguard Worker return result;
1330*6777b538SAndroid Build Coastguard Worker }
1331*6777b538SAndroid Build Coastguard Worker
RunReadIfReadyCallback(int result)1332*6777b538SAndroid Build Coastguard Worker void MockTCPClientSocket::RunReadIfReadyCallback(int result) {
1333*6777b538SAndroid Build Coastguard Worker // If ReadIfReady is already canceled, do nothing.
1334*6777b538SAndroid Build Coastguard Worker if (!pending_read_if_ready_callback_)
1335*6777b538SAndroid Build Coastguard Worker return;
1336*6777b538SAndroid Build Coastguard Worker std::move(pending_read_if_ready_callback_).Run(result);
1337*6777b538SAndroid Build Coastguard Worker }
1338*6777b538SAndroid Build Coastguard Worker
1339*6777b538SAndroid Build Coastguard Worker // static
ConnectCallback(MockSSLClientSocket * ssl_client_socket,CompletionOnceCallback callback,int rv)1340*6777b538SAndroid Build Coastguard Worker void MockSSLClientSocket::ConnectCallback(
1341*6777b538SAndroid Build Coastguard Worker MockSSLClientSocket* ssl_client_socket,
1342*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback,
1343*6777b538SAndroid Build Coastguard Worker int rv) {
1344*6777b538SAndroid Build Coastguard Worker if (rv == OK)
1345*6777b538SAndroid Build Coastguard Worker ssl_client_socket->connected_ = true;
1346*6777b538SAndroid Build Coastguard Worker std::move(callback).Run(rv);
1347*6777b538SAndroid Build Coastguard Worker }
1348*6777b538SAndroid Build Coastguard Worker
MockSSLClientSocket(std::unique_ptr<StreamSocket> stream_socket,const HostPortPair & host_and_port,const SSLConfig & ssl_config,SSLSocketDataProvider * data)1349*6777b538SAndroid Build Coastguard Worker MockSSLClientSocket::MockSSLClientSocket(
1350*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> stream_socket,
1351*6777b538SAndroid Build Coastguard Worker const HostPortPair& host_and_port,
1352*6777b538SAndroid Build Coastguard Worker const SSLConfig& ssl_config,
1353*6777b538SAndroid Build Coastguard Worker SSLSocketDataProvider* data)
1354*6777b538SAndroid Build Coastguard Worker : net_log_(stream_socket->NetLog()),
1355*6777b538SAndroid Build Coastguard Worker stream_socket_(std::move(stream_socket)),
1356*6777b538SAndroid Build Coastguard Worker data_(data) {
1357*6777b538SAndroid Build Coastguard Worker DCHECK(data_);
1358*6777b538SAndroid Build Coastguard Worker peer_addr_ = data->connect.peer_addr;
1359*6777b538SAndroid Build Coastguard Worker }
1360*6777b538SAndroid Build Coastguard Worker
~MockSSLClientSocket()1361*6777b538SAndroid Build Coastguard Worker MockSSLClientSocket::~MockSSLClientSocket() {
1362*6777b538SAndroid Build Coastguard Worker Disconnect();
1363*6777b538SAndroid Build Coastguard Worker }
1364*6777b538SAndroid Build Coastguard Worker
Read(IOBuffer * buf,int buf_len,CompletionOnceCallback callback)1365*6777b538SAndroid Build Coastguard Worker int MockSSLClientSocket::Read(IOBuffer* buf,
1366*6777b538SAndroid Build Coastguard Worker int buf_len,
1367*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) {
1368*6777b538SAndroid Build Coastguard Worker return stream_socket_->Read(buf, buf_len, std::move(callback));
1369*6777b538SAndroid Build Coastguard Worker }
1370*6777b538SAndroid Build Coastguard Worker
ReadIfReady(IOBuffer * buf,int buf_len,CompletionOnceCallback callback)1371*6777b538SAndroid Build Coastguard Worker int MockSSLClientSocket::ReadIfReady(IOBuffer* buf,
1372*6777b538SAndroid Build Coastguard Worker int buf_len,
1373*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) {
1374*6777b538SAndroid Build Coastguard Worker return stream_socket_->ReadIfReady(buf, buf_len, std::move(callback));
1375*6777b538SAndroid Build Coastguard Worker }
1376*6777b538SAndroid Build Coastguard Worker
Write(IOBuffer * buf,int buf_len,CompletionOnceCallback callback,const NetworkTrafficAnnotationTag & traffic_annotation)1377*6777b538SAndroid Build Coastguard Worker int MockSSLClientSocket::Write(
1378*6777b538SAndroid Build Coastguard Worker IOBuffer* buf,
1379*6777b538SAndroid Build Coastguard Worker int buf_len,
1380*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback,
1381*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation) {
1382*6777b538SAndroid Build Coastguard Worker if (!data_->is_confirm_data_consumed)
1383*6777b538SAndroid Build Coastguard Worker data_->write_called_before_confirm = true;
1384*6777b538SAndroid Build Coastguard Worker return stream_socket_->Write(buf, buf_len, std::move(callback),
1385*6777b538SAndroid Build Coastguard Worker traffic_annotation);
1386*6777b538SAndroid Build Coastguard Worker }
1387*6777b538SAndroid Build Coastguard Worker
CancelReadIfReady()1388*6777b538SAndroid Build Coastguard Worker int MockSSLClientSocket::CancelReadIfReady() {
1389*6777b538SAndroid Build Coastguard Worker return stream_socket_->CancelReadIfReady();
1390*6777b538SAndroid Build Coastguard Worker }
1391*6777b538SAndroid Build Coastguard Worker
Connect(CompletionOnceCallback callback)1392*6777b538SAndroid Build Coastguard Worker int MockSSLClientSocket::Connect(CompletionOnceCallback callback) {
1393*6777b538SAndroid Build Coastguard Worker DCHECK(stream_socket_->IsConnected());
1394*6777b538SAndroid Build Coastguard Worker data_->is_connect_data_consumed = true;
1395*6777b538SAndroid Build Coastguard Worker if (data_->connect.result == OK)
1396*6777b538SAndroid Build Coastguard Worker connected_ = true;
1397*6777b538SAndroid Build Coastguard Worker RunClosureIfNonNull(std::move(data_->connect_callback));
1398*6777b538SAndroid Build Coastguard Worker if (data_->connect.mode == ASYNC) {
1399*6777b538SAndroid Build Coastguard Worker RunCallbackAsync(std::move(callback), data_->connect.result);
1400*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1401*6777b538SAndroid Build Coastguard Worker }
1402*6777b538SAndroid Build Coastguard Worker return data_->connect.result;
1403*6777b538SAndroid Build Coastguard Worker }
1404*6777b538SAndroid Build Coastguard Worker
Disconnect()1405*6777b538SAndroid Build Coastguard Worker void MockSSLClientSocket::Disconnect() {
1406*6777b538SAndroid Build Coastguard Worker if (stream_socket_ != nullptr)
1407*6777b538SAndroid Build Coastguard Worker stream_socket_->Disconnect();
1408*6777b538SAndroid Build Coastguard Worker }
1409*6777b538SAndroid Build Coastguard Worker
RunConfirmHandshakeCallback(CompletionOnceCallback callback,int result)1410*6777b538SAndroid Build Coastguard Worker void MockSSLClientSocket::RunConfirmHandshakeCallback(
1411*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback,
1412*6777b538SAndroid Build Coastguard Worker int result) {
1413*6777b538SAndroid Build Coastguard Worker DCHECK(in_confirm_handshake_);
1414*6777b538SAndroid Build Coastguard Worker in_confirm_handshake_ = false;
1415*6777b538SAndroid Build Coastguard Worker data_->is_confirm_data_consumed = true;
1416*6777b538SAndroid Build Coastguard Worker std::move(callback).Run(result);
1417*6777b538SAndroid Build Coastguard Worker }
1418*6777b538SAndroid Build Coastguard Worker
ConfirmHandshake(CompletionOnceCallback callback)1419*6777b538SAndroid Build Coastguard Worker int MockSSLClientSocket::ConfirmHandshake(CompletionOnceCallback callback) {
1420*6777b538SAndroid Build Coastguard Worker DCHECK(stream_socket_->IsConnected());
1421*6777b538SAndroid Build Coastguard Worker DCHECK(!in_confirm_handshake_);
1422*6777b538SAndroid Build Coastguard Worker if (data_->is_confirm_data_consumed)
1423*6777b538SAndroid Build Coastguard Worker return data_->confirm.result;
1424*6777b538SAndroid Build Coastguard Worker RunClosureIfNonNull(std::move(data_->confirm_callback));
1425*6777b538SAndroid Build Coastguard Worker if (data_->confirm.mode == ASYNC) {
1426*6777b538SAndroid Build Coastguard Worker in_confirm_handshake_ = true;
1427*6777b538SAndroid Build Coastguard Worker RunCallbackAsync(
1428*6777b538SAndroid Build Coastguard Worker base::BindOnce(&MockSSLClientSocket::RunConfirmHandshakeCallback,
1429*6777b538SAndroid Build Coastguard Worker base::Unretained(this), std::move(callback)),
1430*6777b538SAndroid Build Coastguard Worker data_->confirm.result);
1431*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1432*6777b538SAndroid Build Coastguard Worker }
1433*6777b538SAndroid Build Coastguard Worker data_->is_confirm_data_consumed = true;
1434*6777b538SAndroid Build Coastguard Worker if (data_->confirm.result == ERR_IO_PENDING) {
1435*6777b538SAndroid Build Coastguard Worker // `MockConfirm(SYNCHRONOUS, ERR_IO_PENDING)` means `ConfirmHandshake()`
1436*6777b538SAndroid Build Coastguard Worker // never completes.
1437*6777b538SAndroid Build Coastguard Worker in_confirm_handshake_ = true;
1438*6777b538SAndroid Build Coastguard Worker }
1439*6777b538SAndroid Build Coastguard Worker return data_->confirm.result;
1440*6777b538SAndroid Build Coastguard Worker }
1441*6777b538SAndroid Build Coastguard Worker
IsConnected() const1442*6777b538SAndroid Build Coastguard Worker bool MockSSLClientSocket::IsConnected() const {
1443*6777b538SAndroid Build Coastguard Worker return stream_socket_->IsConnected();
1444*6777b538SAndroid Build Coastguard Worker }
1445*6777b538SAndroid Build Coastguard Worker
IsConnectedAndIdle() const1446*6777b538SAndroid Build Coastguard Worker bool MockSSLClientSocket::IsConnectedAndIdle() const {
1447*6777b538SAndroid Build Coastguard Worker return stream_socket_->IsConnectedAndIdle();
1448*6777b538SAndroid Build Coastguard Worker }
1449*6777b538SAndroid Build Coastguard Worker
WasEverUsed() const1450*6777b538SAndroid Build Coastguard Worker bool MockSSLClientSocket::WasEverUsed() const {
1451*6777b538SAndroid Build Coastguard Worker return stream_socket_->WasEverUsed();
1452*6777b538SAndroid Build Coastguard Worker }
1453*6777b538SAndroid Build Coastguard Worker
GetLocalAddress(IPEndPoint * address) const1454*6777b538SAndroid Build Coastguard Worker int MockSSLClientSocket::GetLocalAddress(IPEndPoint* address) const {
1455*6777b538SAndroid Build Coastguard Worker *address = IPEndPoint(IPAddress(192, 0, 2, 33), 123);
1456*6777b538SAndroid Build Coastguard Worker return OK;
1457*6777b538SAndroid Build Coastguard Worker }
1458*6777b538SAndroid Build Coastguard Worker
GetPeerAddress(IPEndPoint * address) const1459*6777b538SAndroid Build Coastguard Worker int MockSSLClientSocket::GetPeerAddress(IPEndPoint* address) const {
1460*6777b538SAndroid Build Coastguard Worker return stream_socket_->GetPeerAddress(address);
1461*6777b538SAndroid Build Coastguard Worker }
1462*6777b538SAndroid Build Coastguard Worker
GetNegotiatedProtocol() const1463*6777b538SAndroid Build Coastguard Worker NextProto MockSSLClientSocket::GetNegotiatedProtocol() const {
1464*6777b538SAndroid Build Coastguard Worker return data_->next_proto;
1465*6777b538SAndroid Build Coastguard Worker }
1466*6777b538SAndroid Build Coastguard Worker
1467*6777b538SAndroid Build Coastguard Worker std::optional<std::string_view>
GetPeerApplicationSettings() const1468*6777b538SAndroid Build Coastguard Worker MockSSLClientSocket::GetPeerApplicationSettings() const {
1469*6777b538SAndroid Build Coastguard Worker return data_->peer_application_settings;
1470*6777b538SAndroid Build Coastguard Worker }
1471*6777b538SAndroid Build Coastguard Worker
GetSSLInfo(SSLInfo * requested_ssl_info)1472*6777b538SAndroid Build Coastguard Worker bool MockSSLClientSocket::GetSSLInfo(SSLInfo* requested_ssl_info) {
1473*6777b538SAndroid Build Coastguard Worker *requested_ssl_info = data_->ssl_info;
1474*6777b538SAndroid Build Coastguard Worker return true;
1475*6777b538SAndroid Build Coastguard Worker }
1476*6777b538SAndroid Build Coastguard Worker
ApplySocketTag(const SocketTag & tag)1477*6777b538SAndroid Build Coastguard Worker void MockSSLClientSocket::ApplySocketTag(const SocketTag& tag) {
1478*6777b538SAndroid Build Coastguard Worker return stream_socket_->ApplySocketTag(tag);
1479*6777b538SAndroid Build Coastguard Worker }
1480*6777b538SAndroid Build Coastguard Worker
NetLog() const1481*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& MockSSLClientSocket::NetLog() const {
1482*6777b538SAndroid Build Coastguard Worker return net_log_;
1483*6777b538SAndroid Build Coastguard Worker }
1484*6777b538SAndroid Build Coastguard Worker
GetTotalReceivedBytes() const1485*6777b538SAndroid Build Coastguard Worker int64_t MockSSLClientSocket::GetTotalReceivedBytes() const {
1486*6777b538SAndroid Build Coastguard Worker NOTIMPLEMENTED();
1487*6777b538SAndroid Build Coastguard Worker return 0;
1488*6777b538SAndroid Build Coastguard Worker }
1489*6777b538SAndroid Build Coastguard Worker
GetTotalReceivedBytes() const1490*6777b538SAndroid Build Coastguard Worker int64_t MockClientSocket::GetTotalReceivedBytes() const {
1491*6777b538SAndroid Build Coastguard Worker NOTIMPLEMENTED();
1492*6777b538SAndroid Build Coastguard Worker return 0;
1493*6777b538SAndroid Build Coastguard Worker }
1494*6777b538SAndroid Build Coastguard Worker
SetReceiveBufferSize(int32_t size)1495*6777b538SAndroid Build Coastguard Worker int MockSSLClientSocket::SetReceiveBufferSize(int32_t size) {
1496*6777b538SAndroid Build Coastguard Worker return OK;
1497*6777b538SAndroid Build Coastguard Worker }
1498*6777b538SAndroid Build Coastguard Worker
SetSendBufferSize(int32_t size)1499*6777b538SAndroid Build Coastguard Worker int MockSSLClientSocket::SetSendBufferSize(int32_t size) {
1500*6777b538SAndroid Build Coastguard Worker return OK;
1501*6777b538SAndroid Build Coastguard Worker }
1502*6777b538SAndroid Build Coastguard Worker
GetSSLCertRequestInfo(SSLCertRequestInfo * cert_request_info) const1503*6777b538SAndroid Build Coastguard Worker void MockSSLClientSocket::GetSSLCertRequestInfo(
1504*6777b538SAndroid Build Coastguard Worker SSLCertRequestInfo* cert_request_info) const {
1505*6777b538SAndroid Build Coastguard Worker DCHECK(cert_request_info);
1506*6777b538SAndroid Build Coastguard Worker if (data_->cert_request_info) {
1507*6777b538SAndroid Build Coastguard Worker cert_request_info->host_and_port = data_->cert_request_info->host_and_port;
1508*6777b538SAndroid Build Coastguard Worker cert_request_info->is_proxy = data_->cert_request_info->is_proxy;
1509*6777b538SAndroid Build Coastguard Worker cert_request_info->cert_authorities =
1510*6777b538SAndroid Build Coastguard Worker data_->cert_request_info->cert_authorities;
1511*6777b538SAndroid Build Coastguard Worker cert_request_info->signature_algorithms =
1512*6777b538SAndroid Build Coastguard Worker data_->cert_request_info->signature_algorithms;
1513*6777b538SAndroid Build Coastguard Worker } else {
1514*6777b538SAndroid Build Coastguard Worker cert_request_info->Reset();
1515*6777b538SAndroid Build Coastguard Worker }
1516*6777b538SAndroid Build Coastguard Worker }
1517*6777b538SAndroid Build Coastguard Worker
ExportKeyingMaterial(std::string_view label,bool has_context,std::string_view context,unsigned char * out,unsigned int outlen)1518*6777b538SAndroid Build Coastguard Worker int MockSSLClientSocket::ExportKeyingMaterial(std::string_view label,
1519*6777b538SAndroid Build Coastguard Worker bool has_context,
1520*6777b538SAndroid Build Coastguard Worker std::string_view context,
1521*6777b538SAndroid Build Coastguard Worker unsigned char* out,
1522*6777b538SAndroid Build Coastguard Worker unsigned int outlen) {
1523*6777b538SAndroid Build Coastguard Worker memset(out, 'A', outlen);
1524*6777b538SAndroid Build Coastguard Worker return OK;
1525*6777b538SAndroid Build Coastguard Worker }
1526*6777b538SAndroid Build Coastguard Worker
GetECHRetryConfigs()1527*6777b538SAndroid Build Coastguard Worker std::vector<uint8_t> MockSSLClientSocket::GetECHRetryConfigs() {
1528*6777b538SAndroid Build Coastguard Worker return data_->ech_retry_configs;
1529*6777b538SAndroid Build Coastguard Worker }
1530*6777b538SAndroid Build Coastguard Worker
RunCallbackAsync(CompletionOnceCallback callback,int result)1531*6777b538SAndroid Build Coastguard Worker void MockSSLClientSocket::RunCallbackAsync(CompletionOnceCallback callback,
1532*6777b538SAndroid Build Coastguard Worker int result) {
1533*6777b538SAndroid Build Coastguard Worker base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
1534*6777b538SAndroid Build Coastguard Worker FROM_HERE,
1535*6777b538SAndroid Build Coastguard Worker base::BindOnce(&MockSSLClientSocket::RunCallback,
1536*6777b538SAndroid Build Coastguard Worker weak_factory_.GetWeakPtr(), std::move(callback), result));
1537*6777b538SAndroid Build Coastguard Worker }
1538*6777b538SAndroid Build Coastguard Worker
RunCallback(CompletionOnceCallback callback,int result)1539*6777b538SAndroid Build Coastguard Worker void MockSSLClientSocket::RunCallback(CompletionOnceCallback callback,
1540*6777b538SAndroid Build Coastguard Worker int result) {
1541*6777b538SAndroid Build Coastguard Worker std::move(callback).Run(result);
1542*6777b538SAndroid Build Coastguard Worker }
1543*6777b538SAndroid Build Coastguard Worker
OnReadComplete(const MockRead & data)1544*6777b538SAndroid Build Coastguard Worker void MockSSLClientSocket::OnReadComplete(const MockRead& data) {
1545*6777b538SAndroid Build Coastguard Worker NOTIMPLEMENTED();
1546*6777b538SAndroid Build Coastguard Worker }
1547*6777b538SAndroid Build Coastguard Worker
OnWriteComplete(int rv)1548*6777b538SAndroid Build Coastguard Worker void MockSSLClientSocket::OnWriteComplete(int rv) {
1549*6777b538SAndroid Build Coastguard Worker NOTIMPLEMENTED();
1550*6777b538SAndroid Build Coastguard Worker }
1551*6777b538SAndroid Build Coastguard Worker
OnConnectComplete(const MockConnect & data)1552*6777b538SAndroid Build Coastguard Worker void MockSSLClientSocket::OnConnectComplete(const MockConnect& data) {
1553*6777b538SAndroid Build Coastguard Worker NOTIMPLEMENTED();
1554*6777b538SAndroid Build Coastguard Worker }
1555*6777b538SAndroid Build Coastguard Worker
MockUDPClientSocket(SocketDataProvider * data,net::NetLog * net_log)1556*6777b538SAndroid Build Coastguard Worker MockUDPClientSocket::MockUDPClientSocket(SocketDataProvider* data,
1557*6777b538SAndroid Build Coastguard Worker net::NetLog* net_log)
1558*6777b538SAndroid Build Coastguard Worker : data_(data),
1559*6777b538SAndroid Build Coastguard Worker read_data_(SYNCHRONOUS, ERR_UNEXPECTED),
1560*6777b538SAndroid Build Coastguard Worker source_host_(IPAddress(192, 0, 2, 33)),
1561*6777b538SAndroid Build Coastguard Worker net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::NONE)) {
1562*6777b538SAndroid Build Coastguard Worker if (data_) {
1563*6777b538SAndroid Build Coastguard Worker data_->Initialize(this);
1564*6777b538SAndroid Build Coastguard Worker peer_addr_ = data->connect_data().peer_addr;
1565*6777b538SAndroid Build Coastguard Worker }
1566*6777b538SAndroid Build Coastguard Worker }
1567*6777b538SAndroid Build Coastguard Worker
~MockUDPClientSocket()1568*6777b538SAndroid Build Coastguard Worker MockUDPClientSocket::~MockUDPClientSocket() {
1569*6777b538SAndroid Build Coastguard Worker if (data_)
1570*6777b538SAndroid Build Coastguard Worker data_->DetachSocket();
1571*6777b538SAndroid Build Coastguard Worker }
1572*6777b538SAndroid Build Coastguard Worker
Read(IOBuffer * buf,int buf_len,CompletionOnceCallback callback)1573*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::Read(IOBuffer* buf,
1574*6777b538SAndroid Build Coastguard Worker int buf_len,
1575*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) {
1576*6777b538SAndroid Build Coastguard Worker DCHECK(callback);
1577*6777b538SAndroid Build Coastguard Worker
1578*6777b538SAndroid Build Coastguard Worker if (!connected_ || !data_)
1579*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1580*6777b538SAndroid Build Coastguard Worker data_transferred_ = true;
1581*6777b538SAndroid Build Coastguard Worker
1582*6777b538SAndroid Build Coastguard Worker // If the buffer is already in use, a read is already in progress!
1583*6777b538SAndroid Build Coastguard Worker DCHECK(!pending_read_buf_);
1584*6777b538SAndroid Build Coastguard Worker
1585*6777b538SAndroid Build Coastguard Worker // Store our async IO data.
1586*6777b538SAndroid Build Coastguard Worker pending_read_buf_ = buf;
1587*6777b538SAndroid Build Coastguard Worker pending_read_buf_len_ = buf_len;
1588*6777b538SAndroid Build Coastguard Worker pending_read_callback_ = std::move(callback);
1589*6777b538SAndroid Build Coastguard Worker
1590*6777b538SAndroid Build Coastguard Worker if (need_read_data_) {
1591*6777b538SAndroid Build Coastguard Worker read_data_ = data_->OnRead();
1592*6777b538SAndroid Build Coastguard Worker last_tos_ = read_data_.tos;
1593*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility
1594*6777b538SAndroid Build Coastguard Worker // to complete the async IO manually later (via OnReadComplete).
1595*6777b538SAndroid Build Coastguard Worker if (read_data_.result == ERR_IO_PENDING) {
1596*6777b538SAndroid Build Coastguard Worker // We need to be using async IO in this case.
1597*6777b538SAndroid Build Coastguard Worker DCHECK(!pending_read_callback_.is_null());
1598*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1599*6777b538SAndroid Build Coastguard Worker }
1600*6777b538SAndroid Build Coastguard Worker need_read_data_ = false;
1601*6777b538SAndroid Build Coastguard Worker }
1602*6777b538SAndroid Build Coastguard Worker
1603*6777b538SAndroid Build Coastguard Worker return CompleteRead();
1604*6777b538SAndroid Build Coastguard Worker }
1605*6777b538SAndroid Build Coastguard Worker
Write(IOBuffer * buf,int buf_len,CompletionOnceCallback callback,const NetworkTrafficAnnotationTag &)1606*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::Write(
1607*6777b538SAndroid Build Coastguard Worker IOBuffer* buf,
1608*6777b538SAndroid Build Coastguard Worker int buf_len,
1609*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback,
1610*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& /* traffic_annotation */) {
1611*6777b538SAndroid Build Coastguard Worker DCHECK(buf);
1612*6777b538SAndroid Build Coastguard Worker DCHECK_GT(buf_len, 0);
1613*6777b538SAndroid Build Coastguard Worker DCHECK(callback);
1614*6777b538SAndroid Build Coastguard Worker
1615*6777b538SAndroid Build Coastguard Worker if (!connected_ || !data_)
1616*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1617*6777b538SAndroid Build Coastguard Worker data_transferred_ = true;
1618*6777b538SAndroid Build Coastguard Worker
1619*6777b538SAndroid Build Coastguard Worker std::string data(buf->data(), buf_len);
1620*6777b538SAndroid Build Coastguard Worker MockWriteResult write_result = data_->OnWrite(data);
1621*6777b538SAndroid Build Coastguard Worker
1622*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING is a signal that the socket data will call back
1623*6777b538SAndroid Build Coastguard Worker // asynchronously.
1624*6777b538SAndroid Build Coastguard Worker if (write_result.result == ERR_IO_PENDING) {
1625*6777b538SAndroid Build Coastguard Worker pending_write_callback_ = std::move(callback);
1626*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1627*6777b538SAndroid Build Coastguard Worker }
1628*6777b538SAndroid Build Coastguard Worker if (write_result.mode == ASYNC) {
1629*6777b538SAndroid Build Coastguard Worker RunCallbackAsync(std::move(callback), write_result.result);
1630*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1631*6777b538SAndroid Build Coastguard Worker }
1632*6777b538SAndroid Build Coastguard Worker return write_result.result;
1633*6777b538SAndroid Build Coastguard Worker }
1634*6777b538SAndroid Build Coastguard Worker
SetReceiveBufferSize(int32_t size)1635*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::SetReceiveBufferSize(int32_t size) {
1636*6777b538SAndroid Build Coastguard Worker return OK;
1637*6777b538SAndroid Build Coastguard Worker }
1638*6777b538SAndroid Build Coastguard Worker
SetSendBufferSize(int32_t size)1639*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::SetSendBufferSize(int32_t size) {
1640*6777b538SAndroid Build Coastguard Worker return OK;
1641*6777b538SAndroid Build Coastguard Worker }
1642*6777b538SAndroid Build Coastguard Worker
SetDoNotFragment()1643*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::SetDoNotFragment() {
1644*6777b538SAndroid Build Coastguard Worker return OK;
1645*6777b538SAndroid Build Coastguard Worker }
1646*6777b538SAndroid Build Coastguard Worker
SetRecvTos()1647*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::SetRecvTos() {
1648*6777b538SAndroid Build Coastguard Worker return OK;
1649*6777b538SAndroid Build Coastguard Worker }
1650*6777b538SAndroid Build Coastguard Worker
SetTos(DiffServCodePoint dscp,EcnCodePoint ecn)1651*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::SetTos(DiffServCodePoint dscp, EcnCodePoint ecn) {
1652*6777b538SAndroid Build Coastguard Worker return OK;
1653*6777b538SAndroid Build Coastguard Worker }
1654*6777b538SAndroid Build Coastguard Worker
Close()1655*6777b538SAndroid Build Coastguard Worker void MockUDPClientSocket::Close() {
1656*6777b538SAndroid Build Coastguard Worker connected_ = false;
1657*6777b538SAndroid Build Coastguard Worker }
1658*6777b538SAndroid Build Coastguard Worker
GetPeerAddress(IPEndPoint * address) const1659*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::GetPeerAddress(IPEndPoint* address) const {
1660*6777b538SAndroid Build Coastguard Worker if (!data_)
1661*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1662*6777b538SAndroid Build Coastguard Worker
1663*6777b538SAndroid Build Coastguard Worker *address = peer_addr_;
1664*6777b538SAndroid Build Coastguard Worker return OK;
1665*6777b538SAndroid Build Coastguard Worker }
1666*6777b538SAndroid Build Coastguard Worker
GetLocalAddress(IPEndPoint * address) const1667*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::GetLocalAddress(IPEndPoint* address) const {
1668*6777b538SAndroid Build Coastguard Worker *address = IPEndPoint(source_host_, source_port_);
1669*6777b538SAndroid Build Coastguard Worker return OK;
1670*6777b538SAndroid Build Coastguard Worker }
1671*6777b538SAndroid Build Coastguard Worker
UseNonBlockingIO()1672*6777b538SAndroid Build Coastguard Worker void MockUDPClientSocket::UseNonBlockingIO() {}
1673*6777b538SAndroid Build Coastguard Worker
SetMulticastInterface(uint32_t interface_index)1674*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::SetMulticastInterface(uint32_t interface_index) {
1675*6777b538SAndroid Build Coastguard Worker return OK;
1676*6777b538SAndroid Build Coastguard Worker }
1677*6777b538SAndroid Build Coastguard Worker
NetLog() const1678*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& MockUDPClientSocket::NetLog() const {
1679*6777b538SAndroid Build Coastguard Worker return net_log_;
1680*6777b538SAndroid Build Coastguard Worker }
1681*6777b538SAndroid Build Coastguard Worker
Connect(const IPEndPoint & address)1682*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::Connect(const IPEndPoint& address) {
1683*6777b538SAndroid Build Coastguard Worker if (!data_)
1684*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1685*6777b538SAndroid Build Coastguard Worker DCHECK_NE(data_->connect_data().result, ERR_IO_PENDING);
1686*6777b538SAndroid Build Coastguard Worker connected_ = true;
1687*6777b538SAndroid Build Coastguard Worker peer_addr_ = address;
1688*6777b538SAndroid Build Coastguard Worker return data_->connect_data().result;
1689*6777b538SAndroid Build Coastguard Worker }
1690*6777b538SAndroid Build Coastguard Worker
ConnectUsingNetwork(handles::NetworkHandle network,const IPEndPoint & address)1691*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::ConnectUsingNetwork(handles::NetworkHandle network,
1692*6777b538SAndroid Build Coastguard Worker const IPEndPoint& address) {
1693*6777b538SAndroid Build Coastguard Worker DCHECK(!connected_);
1694*6777b538SAndroid Build Coastguard Worker if (!data_)
1695*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1696*6777b538SAndroid Build Coastguard Worker DCHECK_NE(data_->connect_data().result, ERR_IO_PENDING);
1697*6777b538SAndroid Build Coastguard Worker network_ = network;
1698*6777b538SAndroid Build Coastguard Worker connected_ = true;
1699*6777b538SAndroid Build Coastguard Worker peer_addr_ = address;
1700*6777b538SAndroid Build Coastguard Worker return data_->connect_data().result;
1701*6777b538SAndroid Build Coastguard Worker }
1702*6777b538SAndroid Build Coastguard Worker
ConnectUsingDefaultNetwork(const IPEndPoint & address)1703*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::ConnectUsingDefaultNetwork(const IPEndPoint& address) {
1704*6777b538SAndroid Build Coastguard Worker DCHECK(!connected_);
1705*6777b538SAndroid Build Coastguard Worker if (!data_)
1706*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1707*6777b538SAndroid Build Coastguard Worker DCHECK_NE(data_->connect_data().result, ERR_IO_PENDING);
1708*6777b538SAndroid Build Coastguard Worker network_ = kDefaultNetworkForTests;
1709*6777b538SAndroid Build Coastguard Worker connected_ = true;
1710*6777b538SAndroid Build Coastguard Worker peer_addr_ = address;
1711*6777b538SAndroid Build Coastguard Worker return data_->connect_data().result;
1712*6777b538SAndroid Build Coastguard Worker }
1713*6777b538SAndroid Build Coastguard Worker
ConnectAsync(const IPEndPoint & address,CompletionOnceCallback callback)1714*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::ConnectAsync(const IPEndPoint& address,
1715*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) {
1716*6777b538SAndroid Build Coastguard Worker DCHECK(callback);
1717*6777b538SAndroid Build Coastguard Worker if (!data_) {
1718*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1719*6777b538SAndroid Build Coastguard Worker }
1720*6777b538SAndroid Build Coastguard Worker connected_ = true;
1721*6777b538SAndroid Build Coastguard Worker peer_addr_ = address;
1722*6777b538SAndroid Build Coastguard Worker int result = data_->connect_data().result;
1723*6777b538SAndroid Build Coastguard Worker IoMode mode = data_->connect_data().mode;
1724*6777b538SAndroid Build Coastguard Worker if (mode == SYNCHRONOUS) {
1725*6777b538SAndroid Build Coastguard Worker return result;
1726*6777b538SAndroid Build Coastguard Worker }
1727*6777b538SAndroid Build Coastguard Worker RunCallbackAsync(std::move(callback), result);
1728*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1729*6777b538SAndroid Build Coastguard Worker }
1730*6777b538SAndroid Build Coastguard Worker
ConnectUsingNetworkAsync(handles::NetworkHandle network,const IPEndPoint & address,CompletionOnceCallback callback)1731*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::ConnectUsingNetworkAsync(
1732*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle network,
1733*6777b538SAndroid Build Coastguard Worker const IPEndPoint& address,
1734*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) {
1735*6777b538SAndroid Build Coastguard Worker DCHECK(callback);
1736*6777b538SAndroid Build Coastguard Worker DCHECK(!connected_);
1737*6777b538SAndroid Build Coastguard Worker if (!data_)
1738*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1739*6777b538SAndroid Build Coastguard Worker network_ = network;
1740*6777b538SAndroid Build Coastguard Worker connected_ = true;
1741*6777b538SAndroid Build Coastguard Worker peer_addr_ = address;
1742*6777b538SAndroid Build Coastguard Worker int result = data_->connect_data().result;
1743*6777b538SAndroid Build Coastguard Worker IoMode mode = data_->connect_data().mode;
1744*6777b538SAndroid Build Coastguard Worker if (mode == SYNCHRONOUS) {
1745*6777b538SAndroid Build Coastguard Worker return result;
1746*6777b538SAndroid Build Coastguard Worker }
1747*6777b538SAndroid Build Coastguard Worker RunCallbackAsync(std::move(callback), result);
1748*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1749*6777b538SAndroid Build Coastguard Worker }
1750*6777b538SAndroid Build Coastguard Worker
ConnectUsingDefaultNetworkAsync(const IPEndPoint & address,CompletionOnceCallback callback)1751*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::ConnectUsingDefaultNetworkAsync(
1752*6777b538SAndroid Build Coastguard Worker const IPEndPoint& address,
1753*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) {
1754*6777b538SAndroid Build Coastguard Worker DCHECK(!connected_);
1755*6777b538SAndroid Build Coastguard Worker if (!data_)
1756*6777b538SAndroid Build Coastguard Worker return ERR_UNEXPECTED;
1757*6777b538SAndroid Build Coastguard Worker network_ = kDefaultNetworkForTests;
1758*6777b538SAndroid Build Coastguard Worker connected_ = true;
1759*6777b538SAndroid Build Coastguard Worker peer_addr_ = address;
1760*6777b538SAndroid Build Coastguard Worker int result = data_->connect_data().result;
1761*6777b538SAndroid Build Coastguard Worker IoMode mode = data_->connect_data().mode;
1762*6777b538SAndroid Build Coastguard Worker if (mode == SYNCHRONOUS) {
1763*6777b538SAndroid Build Coastguard Worker return result;
1764*6777b538SAndroid Build Coastguard Worker }
1765*6777b538SAndroid Build Coastguard Worker RunCallbackAsync(std::move(callback), result);
1766*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1767*6777b538SAndroid Build Coastguard Worker }
1768*6777b538SAndroid Build Coastguard Worker
GetBoundNetwork() const1769*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle MockUDPClientSocket::GetBoundNetwork() const {
1770*6777b538SAndroid Build Coastguard Worker return network_;
1771*6777b538SAndroid Build Coastguard Worker }
1772*6777b538SAndroid Build Coastguard Worker
ApplySocketTag(const SocketTag & tag)1773*6777b538SAndroid Build Coastguard Worker void MockUDPClientSocket::ApplySocketTag(const SocketTag& tag) {
1774*6777b538SAndroid Build Coastguard Worker tagged_before_data_transferred_ &= !data_transferred_ || tag == tag_;
1775*6777b538SAndroid Build Coastguard Worker tag_ = tag;
1776*6777b538SAndroid Build Coastguard Worker }
1777*6777b538SAndroid Build Coastguard Worker
GetLastTos() const1778*6777b538SAndroid Build Coastguard Worker DscpAndEcn MockUDPClientSocket::GetLastTos() const {
1779*6777b538SAndroid Build Coastguard Worker return TosToDscpAndEcn(last_tos_);
1780*6777b538SAndroid Build Coastguard Worker }
1781*6777b538SAndroid Build Coastguard Worker
OnReadComplete(const MockRead & data)1782*6777b538SAndroid Build Coastguard Worker void MockUDPClientSocket::OnReadComplete(const MockRead& data) {
1783*6777b538SAndroid Build Coastguard Worker if (!data_)
1784*6777b538SAndroid Build Coastguard Worker return;
1785*6777b538SAndroid Build Coastguard Worker
1786*6777b538SAndroid Build Coastguard Worker // There must be a read pending.
1787*6777b538SAndroid Build Coastguard Worker DCHECK(pending_read_buf_.get());
1788*6777b538SAndroid Build Coastguard Worker DCHECK(pending_read_callback_);
1789*6777b538SAndroid Build Coastguard Worker // You can't complete a read with another ERR_IO_PENDING status code.
1790*6777b538SAndroid Build Coastguard Worker DCHECK_NE(ERR_IO_PENDING, data.result);
1791*6777b538SAndroid Build Coastguard Worker // Since we've been waiting for data, need_read_data_ should be true.
1792*6777b538SAndroid Build Coastguard Worker DCHECK(need_read_data_);
1793*6777b538SAndroid Build Coastguard Worker
1794*6777b538SAndroid Build Coastguard Worker read_data_ = data;
1795*6777b538SAndroid Build Coastguard Worker last_tos_ = data.tos;
1796*6777b538SAndroid Build Coastguard Worker need_read_data_ = false;
1797*6777b538SAndroid Build Coastguard Worker
1798*6777b538SAndroid Build Coastguard Worker // The caller is simulating that this IO completes right now. Don't
1799*6777b538SAndroid Build Coastguard Worker // let CompleteRead() schedule a callback.
1800*6777b538SAndroid Build Coastguard Worker read_data_.mode = SYNCHRONOUS;
1801*6777b538SAndroid Build Coastguard Worker
1802*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback = std::move(pending_read_callback_);
1803*6777b538SAndroid Build Coastguard Worker int rv = CompleteRead();
1804*6777b538SAndroid Build Coastguard Worker RunCallback(std::move(callback), rv);
1805*6777b538SAndroid Build Coastguard Worker }
1806*6777b538SAndroid Build Coastguard Worker
OnWriteComplete(int rv)1807*6777b538SAndroid Build Coastguard Worker void MockUDPClientSocket::OnWriteComplete(int rv) {
1808*6777b538SAndroid Build Coastguard Worker if (!data_)
1809*6777b538SAndroid Build Coastguard Worker return;
1810*6777b538SAndroid Build Coastguard Worker
1811*6777b538SAndroid Build Coastguard Worker // There must be a read pending.
1812*6777b538SAndroid Build Coastguard Worker DCHECK(!pending_write_callback_.is_null());
1813*6777b538SAndroid Build Coastguard Worker RunCallback(std::move(pending_write_callback_), rv);
1814*6777b538SAndroid Build Coastguard Worker }
1815*6777b538SAndroid Build Coastguard Worker
OnConnectComplete(const MockConnect & data)1816*6777b538SAndroid Build Coastguard Worker void MockUDPClientSocket::OnConnectComplete(const MockConnect& data) {
1817*6777b538SAndroid Build Coastguard Worker NOTIMPLEMENTED();
1818*6777b538SAndroid Build Coastguard Worker }
1819*6777b538SAndroid Build Coastguard Worker
OnDataProviderDestroyed()1820*6777b538SAndroid Build Coastguard Worker void MockUDPClientSocket::OnDataProviderDestroyed() {
1821*6777b538SAndroid Build Coastguard Worker data_ = nullptr;
1822*6777b538SAndroid Build Coastguard Worker }
1823*6777b538SAndroid Build Coastguard Worker
CompleteRead()1824*6777b538SAndroid Build Coastguard Worker int MockUDPClientSocket::CompleteRead() {
1825*6777b538SAndroid Build Coastguard Worker DCHECK(pending_read_buf_.get());
1826*6777b538SAndroid Build Coastguard Worker DCHECK(pending_read_buf_len_ > 0);
1827*6777b538SAndroid Build Coastguard Worker
1828*6777b538SAndroid Build Coastguard Worker // Save the pending async IO data and reset our |pending_| state.
1829*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBuffer> buf = pending_read_buf_;
1830*6777b538SAndroid Build Coastguard Worker int buf_len = pending_read_buf_len_;
1831*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback = std::move(pending_read_callback_);
1832*6777b538SAndroid Build Coastguard Worker pending_read_buf_ = nullptr;
1833*6777b538SAndroid Build Coastguard Worker pending_read_buf_len_ = 0;
1834*6777b538SAndroid Build Coastguard Worker
1835*6777b538SAndroid Build Coastguard Worker int result = read_data_.result;
1836*6777b538SAndroid Build Coastguard Worker DCHECK(result != ERR_IO_PENDING);
1837*6777b538SAndroid Build Coastguard Worker
1838*6777b538SAndroid Build Coastguard Worker if (read_data_.data) {
1839*6777b538SAndroid Build Coastguard Worker if (read_data_.data_len - read_offset_ > 0) {
1840*6777b538SAndroid Build Coastguard Worker result = std::min(buf_len, read_data_.data_len - read_offset_);
1841*6777b538SAndroid Build Coastguard Worker memcpy(buf->data(), read_data_.data + read_offset_, result);
1842*6777b538SAndroid Build Coastguard Worker read_offset_ += result;
1843*6777b538SAndroid Build Coastguard Worker if (read_offset_ == read_data_.data_len) {
1844*6777b538SAndroid Build Coastguard Worker need_read_data_ = true;
1845*6777b538SAndroid Build Coastguard Worker read_offset_ = 0;
1846*6777b538SAndroid Build Coastguard Worker }
1847*6777b538SAndroid Build Coastguard Worker } else {
1848*6777b538SAndroid Build Coastguard Worker result = 0; // EOF
1849*6777b538SAndroid Build Coastguard Worker }
1850*6777b538SAndroid Build Coastguard Worker }
1851*6777b538SAndroid Build Coastguard Worker
1852*6777b538SAndroid Build Coastguard Worker if (read_data_.mode == ASYNC) {
1853*6777b538SAndroid Build Coastguard Worker DCHECK(!callback.is_null());
1854*6777b538SAndroid Build Coastguard Worker RunCallbackAsync(std::move(callback), result);
1855*6777b538SAndroid Build Coastguard Worker return ERR_IO_PENDING;
1856*6777b538SAndroid Build Coastguard Worker }
1857*6777b538SAndroid Build Coastguard Worker return result;
1858*6777b538SAndroid Build Coastguard Worker }
1859*6777b538SAndroid Build Coastguard Worker
RunCallbackAsync(CompletionOnceCallback callback,int result)1860*6777b538SAndroid Build Coastguard Worker void MockUDPClientSocket::RunCallbackAsync(CompletionOnceCallback callback,
1861*6777b538SAndroid Build Coastguard Worker int result) {
1862*6777b538SAndroid Build Coastguard Worker base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
1863*6777b538SAndroid Build Coastguard Worker FROM_HERE,
1864*6777b538SAndroid Build Coastguard Worker base::BindOnce(&MockUDPClientSocket::RunCallback,
1865*6777b538SAndroid Build Coastguard Worker weak_factory_.GetWeakPtr(), std::move(callback), result));
1866*6777b538SAndroid Build Coastguard Worker }
1867*6777b538SAndroid Build Coastguard Worker
RunCallback(CompletionOnceCallback callback,int result)1868*6777b538SAndroid Build Coastguard Worker void MockUDPClientSocket::RunCallback(CompletionOnceCallback callback,
1869*6777b538SAndroid Build Coastguard Worker int result) {
1870*6777b538SAndroid Build Coastguard Worker std::move(callback).Run(result);
1871*6777b538SAndroid Build Coastguard Worker }
1872*6777b538SAndroid Build Coastguard Worker
TestSocketRequest(std::vector<raw_ptr<TestSocketRequest,VectorExperimental>> * request_order,size_t * completion_count)1873*6777b538SAndroid Build Coastguard Worker TestSocketRequest::TestSocketRequest(
1874*6777b538SAndroid Build Coastguard Worker std::vector<raw_ptr<TestSocketRequest, VectorExperimental>>* request_order,
1875*6777b538SAndroid Build Coastguard Worker size_t* completion_count)
1876*6777b538SAndroid Build Coastguard Worker : request_order_(request_order), completion_count_(completion_count) {
1877*6777b538SAndroid Build Coastguard Worker DCHECK(request_order);
1878*6777b538SAndroid Build Coastguard Worker DCHECK(completion_count);
1879*6777b538SAndroid Build Coastguard Worker }
1880*6777b538SAndroid Build Coastguard Worker
1881*6777b538SAndroid Build Coastguard Worker TestSocketRequest::~TestSocketRequest() = default;
1882*6777b538SAndroid Build Coastguard Worker
OnComplete(int result)1883*6777b538SAndroid Build Coastguard Worker void TestSocketRequest::OnComplete(int result) {
1884*6777b538SAndroid Build Coastguard Worker SetResult(result);
1885*6777b538SAndroid Build Coastguard Worker (*completion_count_)++;
1886*6777b538SAndroid Build Coastguard Worker request_order_->push_back(this);
1887*6777b538SAndroid Build Coastguard Worker }
1888*6777b538SAndroid Build Coastguard Worker
1889*6777b538SAndroid Build Coastguard Worker // static
1890*6777b538SAndroid Build Coastguard Worker const int ClientSocketPoolTest::kIndexOutOfBounds = -1;
1891*6777b538SAndroid Build Coastguard Worker
1892*6777b538SAndroid Build Coastguard Worker // static
1893*6777b538SAndroid Build Coastguard Worker const int ClientSocketPoolTest::kRequestNotFound = -2;
1894*6777b538SAndroid Build Coastguard Worker
1895*6777b538SAndroid Build Coastguard Worker ClientSocketPoolTest::ClientSocketPoolTest() = default;
1896*6777b538SAndroid Build Coastguard Worker ClientSocketPoolTest::~ClientSocketPoolTest() = default;
1897*6777b538SAndroid Build Coastguard Worker
GetOrderOfRequest(size_t index) const1898*6777b538SAndroid Build Coastguard Worker int ClientSocketPoolTest::GetOrderOfRequest(size_t index) const {
1899*6777b538SAndroid Build Coastguard Worker index--;
1900*6777b538SAndroid Build Coastguard Worker if (index >= requests_.size())
1901*6777b538SAndroid Build Coastguard Worker return kIndexOutOfBounds;
1902*6777b538SAndroid Build Coastguard Worker
1903*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < request_order_.size(); i++)
1904*6777b538SAndroid Build Coastguard Worker if (requests_[index].get() == request_order_[i])
1905*6777b538SAndroid Build Coastguard Worker return i + 1;
1906*6777b538SAndroid Build Coastguard Worker
1907*6777b538SAndroid Build Coastguard Worker return kRequestNotFound;
1908*6777b538SAndroid Build Coastguard Worker }
1909*6777b538SAndroid Build Coastguard Worker
ReleaseOneConnection(KeepAlive keep_alive)1910*6777b538SAndroid Build Coastguard Worker bool ClientSocketPoolTest::ReleaseOneConnection(KeepAlive keep_alive) {
1911*6777b538SAndroid Build Coastguard Worker for (std::unique_ptr<TestSocketRequest>& it : requests_) {
1912*6777b538SAndroid Build Coastguard Worker if (it->handle()->is_initialized()) {
1913*6777b538SAndroid Build Coastguard Worker if (keep_alive == NO_KEEP_ALIVE)
1914*6777b538SAndroid Build Coastguard Worker it->handle()->socket()->Disconnect();
1915*6777b538SAndroid Build Coastguard Worker it->handle()->Reset();
1916*6777b538SAndroid Build Coastguard Worker base::RunLoop().RunUntilIdle();
1917*6777b538SAndroid Build Coastguard Worker return true;
1918*6777b538SAndroid Build Coastguard Worker }
1919*6777b538SAndroid Build Coastguard Worker }
1920*6777b538SAndroid Build Coastguard Worker return false;
1921*6777b538SAndroid Build Coastguard Worker }
1922*6777b538SAndroid Build Coastguard Worker
ReleaseAllConnections(KeepAlive keep_alive)1923*6777b538SAndroid Build Coastguard Worker void ClientSocketPoolTest::ReleaseAllConnections(KeepAlive keep_alive) {
1924*6777b538SAndroid Build Coastguard Worker bool released_one;
1925*6777b538SAndroid Build Coastguard Worker do {
1926*6777b538SAndroid Build Coastguard Worker released_one = ReleaseOneConnection(keep_alive);
1927*6777b538SAndroid Build Coastguard Worker } while (released_one);
1928*6777b538SAndroid Build Coastguard Worker }
1929*6777b538SAndroid Build Coastguard Worker
MockConnectJob(std::unique_ptr<StreamSocket> socket,ClientSocketHandle * handle,const SocketTag & socket_tag,CompletionOnceCallback callback,RequestPriority priority)1930*6777b538SAndroid Build Coastguard Worker MockTransportClientSocketPool::MockConnectJob::MockConnectJob(
1931*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> socket,
1932*6777b538SAndroid Build Coastguard Worker ClientSocketHandle* handle,
1933*6777b538SAndroid Build Coastguard Worker const SocketTag& socket_tag,
1934*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback,
1935*6777b538SAndroid Build Coastguard Worker RequestPriority priority)
1936*6777b538SAndroid Build Coastguard Worker : socket_(std::move(socket)),
1937*6777b538SAndroid Build Coastguard Worker handle_(handle),
1938*6777b538SAndroid Build Coastguard Worker socket_tag_(socket_tag),
1939*6777b538SAndroid Build Coastguard Worker user_callback_(std::move(callback)),
1940*6777b538SAndroid Build Coastguard Worker priority_(priority) {}
1941*6777b538SAndroid Build Coastguard Worker
1942*6777b538SAndroid Build Coastguard Worker MockTransportClientSocketPool::MockConnectJob::~MockConnectJob() = default;
1943*6777b538SAndroid Build Coastguard Worker
Connect()1944*6777b538SAndroid Build Coastguard Worker int MockTransportClientSocketPool::MockConnectJob::Connect() {
1945*6777b538SAndroid Build Coastguard Worker socket_->ApplySocketTag(socket_tag_);
1946*6777b538SAndroid Build Coastguard Worker int rv = socket_->Connect(
1947*6777b538SAndroid Build Coastguard Worker base::BindOnce(&MockConnectJob::OnConnect, base::Unretained(this)));
1948*6777b538SAndroid Build Coastguard Worker if (rv != ERR_IO_PENDING) {
1949*6777b538SAndroid Build Coastguard Worker user_callback_.Reset();
1950*6777b538SAndroid Build Coastguard Worker OnConnect(rv);
1951*6777b538SAndroid Build Coastguard Worker }
1952*6777b538SAndroid Build Coastguard Worker return rv;
1953*6777b538SAndroid Build Coastguard Worker }
1954*6777b538SAndroid Build Coastguard Worker
CancelHandle(const ClientSocketHandle * handle)1955*6777b538SAndroid Build Coastguard Worker bool MockTransportClientSocketPool::MockConnectJob::CancelHandle(
1956*6777b538SAndroid Build Coastguard Worker const ClientSocketHandle* handle) {
1957*6777b538SAndroid Build Coastguard Worker if (handle != handle_)
1958*6777b538SAndroid Build Coastguard Worker return false;
1959*6777b538SAndroid Build Coastguard Worker socket_.reset();
1960*6777b538SAndroid Build Coastguard Worker handle_ = nullptr;
1961*6777b538SAndroid Build Coastguard Worker user_callback_.Reset();
1962*6777b538SAndroid Build Coastguard Worker return true;
1963*6777b538SAndroid Build Coastguard Worker }
1964*6777b538SAndroid Build Coastguard Worker
OnConnect(int rv)1965*6777b538SAndroid Build Coastguard Worker void MockTransportClientSocketPool::MockConnectJob::OnConnect(int rv) {
1966*6777b538SAndroid Build Coastguard Worker if (!socket_.get())
1967*6777b538SAndroid Build Coastguard Worker return;
1968*6777b538SAndroid Build Coastguard Worker if (rv == OK) {
1969*6777b538SAndroid Build Coastguard Worker handle_->SetSocket(std::move(socket_));
1970*6777b538SAndroid Build Coastguard Worker
1971*6777b538SAndroid Build Coastguard Worker // Needed for socket pool tests that layer other sockets on top of mock
1972*6777b538SAndroid Build Coastguard Worker // sockets.
1973*6777b538SAndroid Build Coastguard Worker LoadTimingInfo::ConnectTiming connect_timing;
1974*6777b538SAndroid Build Coastguard Worker base::TimeTicks now = base::TimeTicks::Now();
1975*6777b538SAndroid Build Coastguard Worker connect_timing.domain_lookup_start = now;
1976*6777b538SAndroid Build Coastguard Worker connect_timing.domain_lookup_end = now;
1977*6777b538SAndroid Build Coastguard Worker connect_timing.connect_start = now;
1978*6777b538SAndroid Build Coastguard Worker connect_timing.connect_end = now;
1979*6777b538SAndroid Build Coastguard Worker handle_->set_connect_timing(connect_timing);
1980*6777b538SAndroid Build Coastguard Worker } else {
1981*6777b538SAndroid Build Coastguard Worker socket_.reset();
1982*6777b538SAndroid Build Coastguard Worker
1983*6777b538SAndroid Build Coastguard Worker // Needed to test copying of ConnectionAttempts in SSL ConnectJob.
1984*6777b538SAndroid Build Coastguard Worker ConnectionAttempts attempts;
1985*6777b538SAndroid Build Coastguard Worker attempts.push_back(ConnectionAttempt(IPEndPoint(), rv));
1986*6777b538SAndroid Build Coastguard Worker handle_->set_connection_attempts(attempts);
1987*6777b538SAndroid Build Coastguard Worker }
1988*6777b538SAndroid Build Coastguard Worker
1989*6777b538SAndroid Build Coastguard Worker handle_ = nullptr;
1990*6777b538SAndroid Build Coastguard Worker
1991*6777b538SAndroid Build Coastguard Worker if (!user_callback_.is_null()) {
1992*6777b538SAndroid Build Coastguard Worker std::move(user_callback_).Run(rv);
1993*6777b538SAndroid Build Coastguard Worker }
1994*6777b538SAndroid Build Coastguard Worker }
1995*6777b538SAndroid Build Coastguard Worker
MockTransportClientSocketPool(int max_sockets,int max_sockets_per_group,const CommonConnectJobParams * common_connect_job_params)1996*6777b538SAndroid Build Coastguard Worker MockTransportClientSocketPool::MockTransportClientSocketPool(
1997*6777b538SAndroid Build Coastguard Worker int max_sockets,
1998*6777b538SAndroid Build Coastguard Worker int max_sockets_per_group,
1999*6777b538SAndroid Build Coastguard Worker const CommonConnectJobParams* common_connect_job_params)
2000*6777b538SAndroid Build Coastguard Worker : TransportClientSocketPool(
2001*6777b538SAndroid Build Coastguard Worker max_sockets,
2002*6777b538SAndroid Build Coastguard Worker max_sockets_per_group,
2003*6777b538SAndroid Build Coastguard Worker base::Seconds(10) /* unused_idle_socket_timeout */,
2004*6777b538SAndroid Build Coastguard Worker ProxyChain::Direct(),
2005*6777b538SAndroid Build Coastguard Worker false /* is_for_websockets */,
2006*6777b538SAndroid Build Coastguard Worker common_connect_job_params),
2007*6777b538SAndroid Build Coastguard Worker client_socket_factory_(common_connect_job_params->client_socket_factory) {
2008*6777b538SAndroid Build Coastguard Worker }
2009*6777b538SAndroid Build Coastguard Worker
2010*6777b538SAndroid Build Coastguard Worker MockTransportClientSocketPool::~MockTransportClientSocketPool() = default;
2011*6777b538SAndroid Build Coastguard Worker
RequestSocket(const ClientSocketPool::GroupId & group_id,scoped_refptr<ClientSocketPool::SocketParams> socket_params,const std::optional<NetworkTrafficAnnotationTag> & proxy_annotation_tag,RequestPriority priority,const SocketTag & socket_tag,RespectLimits respect_limits,ClientSocketHandle * handle,CompletionOnceCallback callback,const ProxyAuthCallback & on_auth_callback,const NetLogWithSource & net_log)2012*6777b538SAndroid Build Coastguard Worker int MockTransportClientSocketPool::RequestSocket(
2013*6777b538SAndroid Build Coastguard Worker const ClientSocketPool::GroupId& group_id,
2014*6777b538SAndroid Build Coastguard Worker scoped_refptr<ClientSocketPool::SocketParams> socket_params,
2015*6777b538SAndroid Build Coastguard Worker const std::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
2016*6777b538SAndroid Build Coastguard Worker RequestPriority priority,
2017*6777b538SAndroid Build Coastguard Worker const SocketTag& socket_tag,
2018*6777b538SAndroid Build Coastguard Worker RespectLimits respect_limits,
2019*6777b538SAndroid Build Coastguard Worker ClientSocketHandle* handle,
2020*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback,
2021*6777b538SAndroid Build Coastguard Worker const ProxyAuthCallback& on_auth_callback,
2022*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log) {
2023*6777b538SAndroid Build Coastguard Worker last_request_priority_ = priority;
2024*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> socket =
2025*6777b538SAndroid Build Coastguard Worker client_socket_factory_->CreateTransportClientSocket(
2026*6777b538SAndroid Build Coastguard Worker AddressList(), nullptr, nullptr, net_log.net_log(), NetLogSource());
2027*6777b538SAndroid Build Coastguard Worker auto job = std::make_unique<MockConnectJob>(
2028*6777b538SAndroid Build Coastguard Worker std::move(socket), handle, socket_tag, std::move(callback), priority);
2029*6777b538SAndroid Build Coastguard Worker auto* job_ptr = job.get();
2030*6777b538SAndroid Build Coastguard Worker job_list_.push_back(std::move(job));
2031*6777b538SAndroid Build Coastguard Worker handle->set_group_generation(1);
2032*6777b538SAndroid Build Coastguard Worker return job_ptr->Connect();
2033*6777b538SAndroid Build Coastguard Worker }
2034*6777b538SAndroid Build Coastguard Worker
SetPriority(const ClientSocketPool::GroupId & group_id,ClientSocketHandle * handle,RequestPriority priority)2035*6777b538SAndroid Build Coastguard Worker void MockTransportClientSocketPool::SetPriority(
2036*6777b538SAndroid Build Coastguard Worker const ClientSocketPool::GroupId& group_id,
2037*6777b538SAndroid Build Coastguard Worker ClientSocketHandle* handle,
2038*6777b538SAndroid Build Coastguard Worker RequestPriority priority) {
2039*6777b538SAndroid Build Coastguard Worker for (auto& job : job_list_) {
2040*6777b538SAndroid Build Coastguard Worker if (job->handle() == handle) {
2041*6777b538SAndroid Build Coastguard Worker job->set_priority(priority);
2042*6777b538SAndroid Build Coastguard Worker return;
2043*6777b538SAndroid Build Coastguard Worker }
2044*6777b538SAndroid Build Coastguard Worker }
2045*6777b538SAndroid Build Coastguard Worker NOTREACHED();
2046*6777b538SAndroid Build Coastguard Worker }
2047*6777b538SAndroid Build Coastguard Worker
CancelRequest(const ClientSocketPool::GroupId & group_id,ClientSocketHandle * handle,bool cancel_connect_job)2048*6777b538SAndroid Build Coastguard Worker void MockTransportClientSocketPool::CancelRequest(
2049*6777b538SAndroid Build Coastguard Worker const ClientSocketPool::GroupId& group_id,
2050*6777b538SAndroid Build Coastguard Worker ClientSocketHandle* handle,
2051*6777b538SAndroid Build Coastguard Worker bool cancel_connect_job) {
2052*6777b538SAndroid Build Coastguard Worker for (std::unique_ptr<MockConnectJob>& it : job_list_) {
2053*6777b538SAndroid Build Coastguard Worker if (it->CancelHandle(handle)) {
2054*6777b538SAndroid Build Coastguard Worker cancel_count_++;
2055*6777b538SAndroid Build Coastguard Worker break;
2056*6777b538SAndroid Build Coastguard Worker }
2057*6777b538SAndroid Build Coastguard Worker }
2058*6777b538SAndroid Build Coastguard Worker }
2059*6777b538SAndroid Build Coastguard Worker
ReleaseSocket(const ClientSocketPool::GroupId & group_id,std::unique_ptr<StreamSocket> socket,int64_t generation)2060*6777b538SAndroid Build Coastguard Worker void MockTransportClientSocketPool::ReleaseSocket(
2061*6777b538SAndroid Build Coastguard Worker const ClientSocketPool::GroupId& group_id,
2062*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> socket,
2063*6777b538SAndroid Build Coastguard Worker int64_t generation) {
2064*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, generation);
2065*6777b538SAndroid Build Coastguard Worker release_count_++;
2066*6777b538SAndroid Build Coastguard Worker }
2067*6777b538SAndroid Build Coastguard Worker
WrappedStreamSocket(std::unique_ptr<StreamSocket> transport)2068*6777b538SAndroid Build Coastguard Worker WrappedStreamSocket::WrappedStreamSocket(
2069*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> transport)
2070*6777b538SAndroid Build Coastguard Worker : transport_(std::move(transport)) {}
2071*6777b538SAndroid Build Coastguard Worker WrappedStreamSocket::~WrappedStreamSocket() = default;
2072*6777b538SAndroid Build Coastguard Worker
Bind(const net::IPEndPoint & local_addr)2073*6777b538SAndroid Build Coastguard Worker int WrappedStreamSocket::Bind(const net::IPEndPoint& local_addr) {
2074*6777b538SAndroid Build Coastguard Worker NOTREACHED();
2075*6777b538SAndroid Build Coastguard Worker return ERR_FAILED;
2076*6777b538SAndroid Build Coastguard Worker }
2077*6777b538SAndroid Build Coastguard Worker
Connect(CompletionOnceCallback callback)2078*6777b538SAndroid Build Coastguard Worker int WrappedStreamSocket::Connect(CompletionOnceCallback callback) {
2079*6777b538SAndroid Build Coastguard Worker return transport_->Connect(std::move(callback));
2080*6777b538SAndroid Build Coastguard Worker }
2081*6777b538SAndroid Build Coastguard Worker
Disconnect()2082*6777b538SAndroid Build Coastguard Worker void WrappedStreamSocket::Disconnect() {
2083*6777b538SAndroid Build Coastguard Worker transport_->Disconnect();
2084*6777b538SAndroid Build Coastguard Worker }
2085*6777b538SAndroid Build Coastguard Worker
IsConnected() const2086*6777b538SAndroid Build Coastguard Worker bool WrappedStreamSocket::IsConnected() const {
2087*6777b538SAndroid Build Coastguard Worker return transport_->IsConnected();
2088*6777b538SAndroid Build Coastguard Worker }
2089*6777b538SAndroid Build Coastguard Worker
IsConnectedAndIdle() const2090*6777b538SAndroid Build Coastguard Worker bool WrappedStreamSocket::IsConnectedAndIdle() const {
2091*6777b538SAndroid Build Coastguard Worker return transport_->IsConnectedAndIdle();
2092*6777b538SAndroid Build Coastguard Worker }
2093*6777b538SAndroid Build Coastguard Worker
GetPeerAddress(IPEndPoint * address) const2094*6777b538SAndroid Build Coastguard Worker int WrappedStreamSocket::GetPeerAddress(IPEndPoint* address) const {
2095*6777b538SAndroid Build Coastguard Worker return transport_->GetPeerAddress(address);
2096*6777b538SAndroid Build Coastguard Worker }
2097*6777b538SAndroid Build Coastguard Worker
GetLocalAddress(IPEndPoint * address) const2098*6777b538SAndroid Build Coastguard Worker int WrappedStreamSocket::GetLocalAddress(IPEndPoint* address) const {
2099*6777b538SAndroid Build Coastguard Worker return transport_->GetLocalAddress(address);
2100*6777b538SAndroid Build Coastguard Worker }
2101*6777b538SAndroid Build Coastguard Worker
NetLog() const2102*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& WrappedStreamSocket::NetLog() const {
2103*6777b538SAndroid Build Coastguard Worker return transport_->NetLog();
2104*6777b538SAndroid Build Coastguard Worker }
2105*6777b538SAndroid Build Coastguard Worker
WasEverUsed() const2106*6777b538SAndroid Build Coastguard Worker bool WrappedStreamSocket::WasEverUsed() const {
2107*6777b538SAndroid Build Coastguard Worker return transport_->WasEverUsed();
2108*6777b538SAndroid Build Coastguard Worker }
2109*6777b538SAndroid Build Coastguard Worker
GetNegotiatedProtocol() const2110*6777b538SAndroid Build Coastguard Worker NextProto WrappedStreamSocket::GetNegotiatedProtocol() const {
2111*6777b538SAndroid Build Coastguard Worker return transport_->GetNegotiatedProtocol();
2112*6777b538SAndroid Build Coastguard Worker }
2113*6777b538SAndroid Build Coastguard Worker
GetSSLInfo(SSLInfo * ssl_info)2114*6777b538SAndroid Build Coastguard Worker bool WrappedStreamSocket::GetSSLInfo(SSLInfo* ssl_info) {
2115*6777b538SAndroid Build Coastguard Worker return transport_->GetSSLInfo(ssl_info);
2116*6777b538SAndroid Build Coastguard Worker }
2117*6777b538SAndroid Build Coastguard Worker
GetTotalReceivedBytes() const2118*6777b538SAndroid Build Coastguard Worker int64_t WrappedStreamSocket::GetTotalReceivedBytes() const {
2119*6777b538SAndroid Build Coastguard Worker return transport_->GetTotalReceivedBytes();
2120*6777b538SAndroid Build Coastguard Worker }
2121*6777b538SAndroid Build Coastguard Worker
ApplySocketTag(const SocketTag & tag)2122*6777b538SAndroid Build Coastguard Worker void WrappedStreamSocket::ApplySocketTag(const SocketTag& tag) {
2123*6777b538SAndroid Build Coastguard Worker transport_->ApplySocketTag(tag);
2124*6777b538SAndroid Build Coastguard Worker }
2125*6777b538SAndroid Build Coastguard Worker
Read(IOBuffer * buf,int buf_len,CompletionOnceCallback callback)2126*6777b538SAndroid Build Coastguard Worker int WrappedStreamSocket::Read(IOBuffer* buf,
2127*6777b538SAndroid Build Coastguard Worker int buf_len,
2128*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) {
2129*6777b538SAndroid Build Coastguard Worker return transport_->Read(buf, buf_len, std::move(callback));
2130*6777b538SAndroid Build Coastguard Worker }
2131*6777b538SAndroid Build Coastguard Worker
ReadIfReady(IOBuffer * buf,int buf_len,CompletionOnceCallback callback)2132*6777b538SAndroid Build Coastguard Worker int WrappedStreamSocket::ReadIfReady(IOBuffer* buf,
2133*6777b538SAndroid Build Coastguard Worker int buf_len,
2134*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) {
2135*6777b538SAndroid Build Coastguard Worker return transport_->ReadIfReady(buf, buf_len, std::move((callback)));
2136*6777b538SAndroid Build Coastguard Worker }
2137*6777b538SAndroid Build Coastguard Worker
Write(IOBuffer * buf,int buf_len,CompletionOnceCallback callback,const NetworkTrafficAnnotationTag & traffic_annotation)2138*6777b538SAndroid Build Coastguard Worker int WrappedStreamSocket::Write(
2139*6777b538SAndroid Build Coastguard Worker IOBuffer* buf,
2140*6777b538SAndroid Build Coastguard Worker int buf_len,
2141*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback,
2142*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation) {
2143*6777b538SAndroid Build Coastguard Worker return transport_->Write(buf, buf_len, std::move(callback),
2144*6777b538SAndroid Build Coastguard Worker TRAFFIC_ANNOTATION_FOR_TESTS);
2145*6777b538SAndroid Build Coastguard Worker }
2146*6777b538SAndroid Build Coastguard Worker
SetReceiveBufferSize(int32_t size)2147*6777b538SAndroid Build Coastguard Worker int WrappedStreamSocket::SetReceiveBufferSize(int32_t size) {
2148*6777b538SAndroid Build Coastguard Worker return transport_->SetReceiveBufferSize(size);
2149*6777b538SAndroid Build Coastguard Worker }
2150*6777b538SAndroid Build Coastguard Worker
SetSendBufferSize(int32_t size)2151*6777b538SAndroid Build Coastguard Worker int WrappedStreamSocket::SetSendBufferSize(int32_t size) {
2152*6777b538SAndroid Build Coastguard Worker return transport_->SetSendBufferSize(size);
2153*6777b538SAndroid Build Coastguard Worker }
2154*6777b538SAndroid Build Coastguard Worker
Connect(CompletionOnceCallback callback)2155*6777b538SAndroid Build Coastguard Worker int MockTaggingStreamSocket::Connect(CompletionOnceCallback callback) {
2156*6777b538SAndroid Build Coastguard Worker connected_ = true;
2157*6777b538SAndroid Build Coastguard Worker return WrappedStreamSocket::Connect(std::move(callback));
2158*6777b538SAndroid Build Coastguard Worker }
2159*6777b538SAndroid Build Coastguard Worker
ApplySocketTag(const SocketTag & tag)2160*6777b538SAndroid Build Coastguard Worker void MockTaggingStreamSocket::ApplySocketTag(const SocketTag& tag) {
2161*6777b538SAndroid Build Coastguard Worker tagged_before_connected_ &= !connected_ || tag == tag_;
2162*6777b538SAndroid Build Coastguard Worker tag_ = tag;
2163*6777b538SAndroid Build Coastguard Worker transport_->ApplySocketTag(tag);
2164*6777b538SAndroid Build Coastguard Worker }
2165*6777b538SAndroid Build Coastguard Worker
2166*6777b538SAndroid Build Coastguard Worker std::unique_ptr<TransportClientSocket>
CreateTransportClientSocket(const AddressList & addresses,std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,NetworkQualityEstimator * network_quality_estimator,NetLog * net_log,const NetLogSource & source)2167*6777b538SAndroid Build Coastguard Worker MockTaggingClientSocketFactory::CreateTransportClientSocket(
2168*6777b538SAndroid Build Coastguard Worker const AddressList& addresses,
2169*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
2170*6777b538SAndroid Build Coastguard Worker NetworkQualityEstimator* network_quality_estimator,
2171*6777b538SAndroid Build Coastguard Worker NetLog* net_log,
2172*6777b538SAndroid Build Coastguard Worker const NetLogSource& source) {
2173*6777b538SAndroid Build Coastguard Worker auto socket = std::make_unique<MockTaggingStreamSocket>(
2174*6777b538SAndroid Build Coastguard Worker MockClientSocketFactory::CreateTransportClientSocket(
2175*6777b538SAndroid Build Coastguard Worker addresses, std::move(socket_performance_watcher),
2176*6777b538SAndroid Build Coastguard Worker network_quality_estimator, net_log, source));
2177*6777b538SAndroid Build Coastguard Worker tcp_socket_ = socket.get();
2178*6777b538SAndroid Build Coastguard Worker return std::move(socket);
2179*6777b538SAndroid Build Coastguard Worker }
2180*6777b538SAndroid Build Coastguard Worker
2181*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DatagramClientSocket>
CreateDatagramClientSocket(DatagramSocket::BindType bind_type,NetLog * net_log,const NetLogSource & source)2182*6777b538SAndroid Build Coastguard Worker MockTaggingClientSocketFactory::CreateDatagramClientSocket(
2183*6777b538SAndroid Build Coastguard Worker DatagramSocket::BindType bind_type,
2184*6777b538SAndroid Build Coastguard Worker NetLog* net_log,
2185*6777b538SAndroid Build Coastguard Worker const NetLogSource& source) {
2186*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DatagramClientSocket> socket(
2187*6777b538SAndroid Build Coastguard Worker MockClientSocketFactory::CreateDatagramClientSocket(bind_type, net_log,
2188*6777b538SAndroid Build Coastguard Worker source));
2189*6777b538SAndroid Build Coastguard Worker udp_socket_ = static_cast<MockUDPClientSocket*>(socket.get());
2190*6777b538SAndroid Build Coastguard Worker return socket;
2191*6777b538SAndroid Build Coastguard Worker }
2192*6777b538SAndroid Build Coastguard Worker
2193*6777b538SAndroid Build Coastguard Worker const char kSOCKS4TestHost[] = "127.0.0.1";
2194*6777b538SAndroid Build Coastguard Worker const int kSOCKS4TestPort = 80;
2195*6777b538SAndroid Build Coastguard Worker
2196*6777b538SAndroid Build Coastguard Worker const char kSOCKS4OkRequestLocalHostPort80[] = {0x04, 0x01, 0x00, 0x50, 127,
2197*6777b538SAndroid Build Coastguard Worker 0, 0, 1, 0};
2198*6777b538SAndroid Build Coastguard Worker const int kSOCKS4OkRequestLocalHostPort80Length =
2199*6777b538SAndroid Build Coastguard Worker std::size(kSOCKS4OkRequestLocalHostPort80);
2200*6777b538SAndroid Build Coastguard Worker
2201*6777b538SAndroid Build Coastguard Worker const char kSOCKS4OkReply[] = {0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0};
2202*6777b538SAndroid Build Coastguard Worker const int kSOCKS4OkReplyLength = std::size(kSOCKS4OkReply);
2203*6777b538SAndroid Build Coastguard Worker
2204*6777b538SAndroid Build Coastguard Worker const char kSOCKS5TestHost[] = "host";
2205*6777b538SAndroid Build Coastguard Worker const int kSOCKS5TestPort = 80;
2206*6777b538SAndroid Build Coastguard Worker
2207*6777b538SAndroid Build Coastguard Worker const char kSOCKS5GreetRequest[] = {0x05, 0x01, 0x00};
2208*6777b538SAndroid Build Coastguard Worker const int kSOCKS5GreetRequestLength = std::size(kSOCKS5GreetRequest);
2209*6777b538SAndroid Build Coastguard Worker
2210*6777b538SAndroid Build Coastguard Worker const char kSOCKS5GreetResponse[] = {0x05, 0x00};
2211*6777b538SAndroid Build Coastguard Worker const int kSOCKS5GreetResponseLength = std::size(kSOCKS5GreetResponse);
2212*6777b538SAndroid Build Coastguard Worker
2213*6777b538SAndroid Build Coastguard Worker const char kSOCKS5OkRequest[] = {0x05, 0x01, 0x00, 0x03, 0x04, 'h',
2214*6777b538SAndroid Build Coastguard Worker 'o', 's', 't', 0x00, 0x50};
2215*6777b538SAndroid Build Coastguard Worker const int kSOCKS5OkRequestLength = std::size(kSOCKS5OkRequest);
2216*6777b538SAndroid Build Coastguard Worker
2217*6777b538SAndroid Build Coastguard Worker const char kSOCKS5OkResponse[] = {0x05, 0x00, 0x00, 0x01, 127,
2218*6777b538SAndroid Build Coastguard Worker 0, 0, 1, 0x00, 0x50};
2219*6777b538SAndroid Build Coastguard Worker const int kSOCKS5OkResponseLength = std::size(kSOCKS5OkResponse);
2220*6777b538SAndroid Build Coastguard Worker
CountReadBytes(base::span<const MockRead> reads)2221*6777b538SAndroid Build Coastguard Worker int64_t CountReadBytes(base::span<const MockRead> reads) {
2222*6777b538SAndroid Build Coastguard Worker int64_t total = 0;
2223*6777b538SAndroid Build Coastguard Worker for (const MockRead& read : reads)
2224*6777b538SAndroid Build Coastguard Worker total += read.data_len;
2225*6777b538SAndroid Build Coastguard Worker return total;
2226*6777b538SAndroid Build Coastguard Worker }
2227*6777b538SAndroid Build Coastguard Worker
CountWriteBytes(base::span<const MockWrite> writes)2228*6777b538SAndroid Build Coastguard Worker int64_t CountWriteBytes(base::span<const MockWrite> writes) {
2229*6777b538SAndroid Build Coastguard Worker int64_t total = 0;
2230*6777b538SAndroid Build Coastguard Worker for (const MockWrite& write : writes)
2231*6777b538SAndroid Build Coastguard Worker total += write.data_len;
2232*6777b538SAndroid Build Coastguard Worker return total;
2233*6777b538SAndroid Build Coastguard Worker }
2234*6777b538SAndroid Build Coastguard Worker
2235*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
CanGetTaggedBytes()2236*6777b538SAndroid Build Coastguard Worker bool CanGetTaggedBytes() {
2237*6777b538SAndroid Build Coastguard Worker // In Android P, /proc/net/xt_qtaguid/stats is no longer guaranteed to be
2238*6777b538SAndroid Build Coastguard Worker // present, and has been replaced with eBPF Traffic Monitoring in netd. See:
2239*6777b538SAndroid Build Coastguard Worker // https://source.android.com/devices/tech/datausage/ebpf-traffic-monitor
2240*6777b538SAndroid Build Coastguard Worker //
2241*6777b538SAndroid Build Coastguard Worker // To read traffic statistics from netd, apps should use the API
2242*6777b538SAndroid Build Coastguard Worker // NetworkStatsManager.queryDetailsForUidTag(). But this API does not provide
2243*6777b538SAndroid Build Coastguard Worker // statistics for local traffic, only mobile and WiFi traffic, so it would not
2244*6777b538SAndroid Build Coastguard Worker // work in tests that spin up a local server. So for now, GetTaggedBytes is
2245*6777b538SAndroid Build Coastguard Worker // only supported on Android releases older than P.
2246*6777b538SAndroid Build Coastguard Worker return base::android::BuildInfo::GetInstance()->sdk_int() <
2247*6777b538SAndroid Build Coastguard Worker base::android::SDK_VERSION_P;
2248*6777b538SAndroid Build Coastguard Worker }
2249*6777b538SAndroid Build Coastguard Worker
GetTaggedBytes(int32_t expected_tag)2250*6777b538SAndroid Build Coastguard Worker uint64_t GetTaggedBytes(int32_t expected_tag) {
2251*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CanGetTaggedBytes());
2252*6777b538SAndroid Build Coastguard Worker
2253*6777b538SAndroid Build Coastguard Worker // To determine how many bytes the system saw with a particular tag read
2254*6777b538SAndroid Build Coastguard Worker // the /proc/net/xt_qtaguid/stats file which contains the kernel's
2255*6777b538SAndroid Build Coastguard Worker // dump of all the UIDs and their tags sent and received bytes.
2256*6777b538SAndroid Build Coastguard Worker uint64_t bytes = 0;
2257*6777b538SAndroid Build Coastguard Worker std::string contents;
2258*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::ReadFileToString(
2259*6777b538SAndroid Build Coastguard Worker base::FilePath::FromUTF8Unsafe("/proc/net/xt_qtaguid/stats"), &contents));
2260*6777b538SAndroid Build Coastguard Worker for (size_t i = contents.find('\n'); // Skip first line which is headers.
2261*6777b538SAndroid Build Coastguard Worker i != std::string::npos && i < contents.length();) {
2262*6777b538SAndroid Build Coastguard Worker uint64_t tag, rx_bytes;
2263*6777b538SAndroid Build Coastguard Worker uid_t uid;
2264*6777b538SAndroid Build Coastguard Worker int n;
2265*6777b538SAndroid Build Coastguard Worker // Parse out the numbers we care about. For reference here's the column
2266*6777b538SAndroid Build Coastguard Worker // headers:
2267*6777b538SAndroid Build Coastguard Worker // idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes
2268*6777b538SAndroid Build Coastguard Worker // tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets
2269*6777b538SAndroid Build Coastguard Worker // rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes
2270*6777b538SAndroid Build Coastguard Worker // tx_udp_packets tx_other_bytes tx_other_packets
2271*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(sscanf(contents.c_str() + i,
2272*6777b538SAndroid Build Coastguard Worker "%*d %*s 0x%" SCNx64 " %d %*d %" SCNu64
2273*6777b538SAndroid Build Coastguard Worker " %*d %*d %*d %*d %*d %*d %*d %*d "
2274*6777b538SAndroid Build Coastguard Worker "%*d %*d %*d %*d %*d %*d %*d%n",
2275*6777b538SAndroid Build Coastguard Worker &tag, &uid, &rx_bytes, &n),
2276*6777b538SAndroid Build Coastguard Worker 3);
2277*6777b538SAndroid Build Coastguard Worker // If this line matches our UID and |expected_tag| then add it to the total.
2278*6777b538SAndroid Build Coastguard Worker if (uid == getuid() && (int32_t)(tag >> 32) == expected_tag) {
2279*6777b538SAndroid Build Coastguard Worker bytes += rx_bytes;
2280*6777b538SAndroid Build Coastguard Worker }
2281*6777b538SAndroid Build Coastguard Worker // Move |i| to the next line.
2282*6777b538SAndroid Build Coastguard Worker i += n + 1;
2283*6777b538SAndroid Build Coastguard Worker }
2284*6777b538SAndroid Build Coastguard Worker return bytes;
2285*6777b538SAndroid Build Coastguard Worker }
2286*6777b538SAndroid Build Coastguard Worker #endif
2287*6777b538SAndroid Build Coastguard Worker
2288*6777b538SAndroid Build Coastguard Worker } // namespace net
2289