1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "net/socket/socket_test_util.h"
10 #include "base/basictypes.h"
11 #include "base/bind.h"
12 #include "base/bind_helpers.h"
13 #include "base/callback_helpers.h"
14 #include "base/compiler_specific.h"
15 #include "base/message_loop/message_loop.h"
16 #include "base/run_loop.h"
17 #include "base/time/time.h"
18 #include "net/base/address_family.h"
19 #include "net/base/address_list.h"
20 #include "net/base/auth.h"
21 #include "net/base/load_timing_info.h"
22 #include "net/http/http_network_session.h"
23 #include "net/http/http_request_headers.h"
24 #include "net/http/http_response_headers.h"
25 #include "net/socket/client_socket_pool_histograms.h"
26 #include "net/socket/socket.h"
27 #include "net/ssl/ssl_cert_request_info.h"
28 #include "net/ssl/ssl_connection_status_flags.h"
29 #include "net/ssl/ssl_info.h"
30 #include "testing/gtest/include/gtest/gtest.h"
32 // Socket events are easier to debug if you log individual reads and writes.
33 // Enable these if locally debugging, but they are too noisy for the waterfall.
35 #define NET_TRACE(level, s) DLOG(level) << s << __FUNCTION__ << "() "
37 #define NET_TRACE(level, s) EAT_STREAM_PARAMETERS
44 inline char AsciifyHigh(char x
) {
45 char nybble
= static_cast<char>((x
>> 4) & 0x0F);
46 return nybble
+ ((nybble
< 0x0A) ? '0' : 'A' - 10);
49 inline char AsciifyLow(char x
) {
50 char nybble
= static_cast<char>((x
>> 0) & 0x0F);
51 return nybble
+ ((nybble
< 0x0A) ? '0' : 'A' - 10);
54 inline char Asciify(char x
) {
55 if ((x
< 0) || !isprint(x
))
60 void DumpData(const char* data
, int data_len
) {
61 if (logging::LOG_INFO
< logging::GetMinLogLevel())
63 DVLOG(1) << "Length: " << data_len
;
64 const char* pfx
= "Data: ";
65 if (!data
|| (data_len
<= 0)) {
66 DVLOG(1) << pfx
<< "<None>";
69 for (i
= 0; i
<= (data_len
- 4); i
+= 4) {
71 << AsciifyHigh(data
[i
+ 0]) << AsciifyLow(data
[i
+ 0])
72 << AsciifyHigh(data
[i
+ 1]) << AsciifyLow(data
[i
+ 1])
73 << AsciifyHigh(data
[i
+ 2]) << AsciifyLow(data
[i
+ 2])
74 << AsciifyHigh(data
[i
+ 3]) << AsciifyLow(data
[i
+ 3])
76 << Asciify(data
[i
+ 0])
77 << Asciify(data
[i
+ 1])
78 << Asciify(data
[i
+ 2])
79 << Asciify(data
[i
+ 3])
83 // Take care of any 'trailing' bytes, if data_len was not a multiple of 4.
84 switch (data_len
- i
) {
87 << AsciifyHigh(data
[i
+ 0]) << AsciifyLow(data
[i
+ 0])
88 << AsciifyHigh(data
[i
+ 1]) << AsciifyLow(data
[i
+ 1])
89 << AsciifyHigh(data
[i
+ 2]) << AsciifyLow(data
[i
+ 2])
91 << Asciify(data
[i
+ 0])
92 << Asciify(data
[i
+ 1])
93 << Asciify(data
[i
+ 2])
98 << AsciifyHigh(data
[i
+ 0]) << AsciifyLow(data
[i
+ 0])
99 << AsciifyHigh(data
[i
+ 1]) << AsciifyLow(data
[i
+ 1])
101 << Asciify(data
[i
+ 0])
102 << Asciify(data
[i
+ 1])
107 << AsciifyHigh(data
[i
+ 0]) << AsciifyLow(data
[i
+ 0])
109 << Asciify(data
[i
+ 0])
116 template <MockReadWriteType type
>
117 void DumpMockReadWrite(const MockReadWrite
<type
>& r
) {
118 if (logging::LOG_INFO
< logging::GetMinLogLevel())
120 DVLOG(1) << "Async: " << (r
.mode
== ASYNC
)
121 << "\nResult: " << r
.result
;
122 DumpData(r
.data
, r
.data_len
);
123 const char* stop
= (r
.sequence_number
& MockRead::STOPLOOP
) ? " (STOP)" : "";
124 DVLOG(1) << "Stage: " << (r
.sequence_number
& ~MockRead::STOPLOOP
) << stop
125 << "\nTime: " << r
.time_stamp
.ToInternalValue();
130 MockConnect::MockConnect() : mode(ASYNC
), result(OK
) {
132 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip
));
133 peer_addr
= IPEndPoint(ip
, 0);
136 MockConnect::MockConnect(IoMode io_mode
, int r
) : mode(io_mode
), result(r
) {
138 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip
));
139 peer_addr
= IPEndPoint(ip
, 0);
142 MockConnect::MockConnect(IoMode io_mode
, int r
, IPEndPoint addr
) :
148 MockConnect::~MockConnect() {}
150 StaticSocketDataProvider::StaticSocketDataProvider()
159 StaticSocketDataProvider::StaticSocketDataProvider(MockRead
* reads
,
165 read_count_(reads_count
),
168 write_count_(writes_count
) {
171 StaticSocketDataProvider::~StaticSocketDataProvider() {}
173 const MockRead
& StaticSocketDataProvider::PeekRead() const {
174 CHECK(!at_read_eof());
175 return reads_
[read_index_
];
178 const MockWrite
& StaticSocketDataProvider::PeekWrite() const {
179 CHECK(!at_write_eof());
180 return writes_
[write_index_
];
183 const MockRead
& StaticSocketDataProvider::PeekRead(size_t index
) const {
184 CHECK_LT(index
, read_count_
);
185 return reads_
[index
];
188 const MockWrite
& StaticSocketDataProvider::PeekWrite(size_t index
) const {
189 CHECK_LT(index
, write_count_
);
190 return writes_
[index
];
193 MockRead
StaticSocketDataProvider::GetNextRead() {
194 CHECK(!at_read_eof());
195 reads_
[read_index_
].time_stamp
= base::Time::Now();
196 return reads_
[read_index_
++];
199 MockWriteResult
StaticSocketDataProvider::OnWrite(const std::string
& data
) {
201 // Not using mock writes; succeed synchronously.
202 return MockWriteResult(SYNCHRONOUS
, data
.length());
204 EXPECT_FALSE(at_write_eof());
205 if (at_write_eof()) {
206 // Show what the extra write actually consists of.
207 EXPECT_EQ("<unexpected write>", data
);
208 return MockWriteResult(SYNCHRONOUS
, ERR_UNEXPECTED
);
211 // Check that what we are writing matches the expectation.
212 // Then give the mocked return value.
213 MockWrite
* w
= &writes_
[write_index_
++];
214 w
->time_stamp
= base::Time::Now();
215 int result
= w
->result
;
217 // Note - we can simulate a partial write here. If the expected data
218 // is a match, but shorter than the write actually written, that is legal.
220 // Application writes "foobarbaz" (9 bytes)
221 // Expected write was "foo" (3 bytes)
222 // This is a success, and we return 3 to the application.
223 std::string
expected_data(w
->data
, w
->data_len
);
224 EXPECT_GE(data
.length(), expected_data
.length());
225 std::string
actual_data(data
.substr(0, w
->data_len
));
226 EXPECT_EQ(expected_data
, actual_data
);
227 if (expected_data
!= actual_data
)
228 return MockWriteResult(SYNCHRONOUS
, ERR_UNEXPECTED
);
230 result
= w
->data_len
;
232 return MockWriteResult(w
->mode
, result
);
235 void StaticSocketDataProvider::Reset() {
240 DynamicSocketDataProvider::DynamicSocketDataProvider()
241 : short_read_limit_(0),
242 allow_unconsumed_reads_(false) {
245 DynamicSocketDataProvider::~DynamicSocketDataProvider() {}
247 MockRead
DynamicSocketDataProvider::GetNextRead() {
249 return MockRead(SYNCHRONOUS
, ERR_UNEXPECTED
);
250 MockRead result
= reads_
.front();
251 if (short_read_limit_
== 0 || result
.data_len
<= short_read_limit_
) {
254 result
.data_len
= short_read_limit_
;
255 reads_
.front().data
+= result
.data_len
;
256 reads_
.front().data_len
-= result
.data_len
;
261 void DynamicSocketDataProvider::Reset() {
265 void DynamicSocketDataProvider::SimulateRead(const char* data
,
266 const size_t length
) {
267 if (!allow_unconsumed_reads_
) {
268 EXPECT_TRUE(reads_
.empty()) << "Unconsumed read: " << reads_
.front().data
;
270 reads_
.push_back(MockRead(ASYNC
, data
, length
));
273 SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode
, int result
)
274 : connect(mode
, result
),
275 next_proto_status(SSLClientSocket::kNextProtoUnsupported
),
276 was_npn_negotiated(false),
277 protocol_negotiated(kProtoUnknown
),
278 client_cert_sent(false),
279 cert_request_info(NULL
),
280 channel_id_sent(false),
281 connection_status(0),
282 should_pause_on_connect(false),
283 is_in_session_cache(false) {
284 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2
,
286 // Set to TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
287 SSLConnectionStatusSetCipherSuite(0xcc14, &connection_status
);
290 SSLSocketDataProvider::~SSLSocketDataProvider() {
293 void SSLSocketDataProvider::SetNextProto(NextProto proto
) {
294 was_npn_negotiated
= true;
295 next_proto_status
= SSLClientSocket::kNextProtoNegotiated
;
296 protocol_negotiated
= proto
;
297 next_proto
= SSLClientSocket::NextProtoToString(proto
);
300 DelayedSocketData::DelayedSocketData(
301 int write_delay
, MockRead
* reads
, size_t reads_count
,
302 MockWrite
* writes
, size_t writes_count
)
303 : StaticSocketDataProvider(reads
, reads_count
, writes
, writes_count
),
304 write_delay_(write_delay
),
305 read_in_progress_(false),
306 weak_factory_(this) {
307 DCHECK_GE(write_delay_
, 0);
310 DelayedSocketData::DelayedSocketData(
311 const MockConnect
& connect
, int write_delay
, MockRead
* reads
,
312 size_t reads_count
, MockWrite
* writes
, size_t writes_count
)
313 : StaticSocketDataProvider(reads
, reads_count
, writes
, writes_count
),
314 write_delay_(write_delay
),
315 read_in_progress_(false),
316 weak_factory_(this) {
317 DCHECK_GE(write_delay_
, 0);
318 set_connect_data(connect
);
321 DelayedSocketData::~DelayedSocketData() {
324 void DelayedSocketData::ForceNextRead() {
325 DCHECK(read_in_progress_
);
330 MockRead
DelayedSocketData::GetNextRead() {
331 MockRead out
= MockRead(ASYNC
, ERR_IO_PENDING
);
332 if (write_delay_
<= 0)
333 out
= StaticSocketDataProvider::GetNextRead();
334 read_in_progress_
= (out
.result
== ERR_IO_PENDING
);
338 MockWriteResult
DelayedSocketData::OnWrite(const std::string
& data
) {
339 MockWriteResult rv
= StaticSocketDataProvider::OnWrite(data
);
340 // Now that our write has completed, we can allow reads to continue.
341 if (!--write_delay_
&& read_in_progress_
)
342 base::MessageLoop::current()->PostDelayedTask(
344 base::Bind(&DelayedSocketData::CompleteRead
,
345 weak_factory_
.GetWeakPtr()),
346 base::TimeDelta::FromMilliseconds(100));
350 void DelayedSocketData::Reset() {
352 read_in_progress_
= false;
353 weak_factory_
.InvalidateWeakPtrs();
354 StaticSocketDataProvider::Reset();
357 void DelayedSocketData::CompleteRead() {
358 if (socket() && read_in_progress_
)
359 socket()->OnReadComplete(GetNextRead());
362 OrderedSocketData::OrderedSocketData(
363 MockRead
* reads
, size_t reads_count
, MockWrite
* writes
, size_t writes_count
)
364 : StaticSocketDataProvider(reads
, reads_count
, writes
, writes_count
),
365 sequence_number_(0), loop_stop_stage_(0),
366 blocked_(false), weak_factory_(this) {
369 OrderedSocketData::OrderedSocketData(
370 const MockConnect
& connect
,
371 MockRead
* reads
, size_t reads_count
,
372 MockWrite
* writes
, size_t writes_count
)
373 : StaticSocketDataProvider(reads
, reads_count
, writes
, writes_count
),
374 sequence_number_(0), loop_stop_stage_(0),
375 blocked_(false), weak_factory_(this) {
376 set_connect_data(connect
);
379 void OrderedSocketData::EndLoop() {
380 // If we've already stopped the loop, don't do it again until we've advanced
381 // to the next sequence_number.
382 NET_TRACE(INFO
, " *** ") << "Stage " << sequence_number_
<< ": EndLoop()";
383 if (loop_stop_stage_
> 0) {
384 const MockRead
& next_read
= StaticSocketDataProvider::PeekRead();
385 if ((next_read
.sequence_number
& ~MockRead::STOPLOOP
) >
387 NET_TRACE(INFO
, " *** ") << "Stage " << sequence_number_
388 << ": Clearing stop index";
389 loop_stop_stage_
= 0;
394 // Record the sequence_number at which we stopped the loop.
395 NET_TRACE(INFO
, " *** ") << "Stage " << sequence_number_
396 << ": Posting Quit at read " << read_index();
397 loop_stop_stage_
= sequence_number_
;
400 MockRead
OrderedSocketData::GetNextRead() {
401 weak_factory_
.InvalidateWeakPtrs();
403 const MockRead
& next_read
= StaticSocketDataProvider::PeekRead();
404 if (next_read
.sequence_number
& MockRead::STOPLOOP
)
406 if ((next_read
.sequence_number
& ~MockRead::STOPLOOP
) <=
407 sequence_number_
++) {
408 NET_TRACE(INFO
, " *** ") << "Stage " << sequence_number_
- 1
409 << ": Read " << read_index();
410 DumpMockReadWrite(next_read
);
411 blocked_
= (next_read
.result
== ERR_IO_PENDING
);
412 return StaticSocketDataProvider::GetNextRead();
414 NET_TRACE(INFO
, " *** ") << "Stage " << sequence_number_
- 1
416 MockRead result
= MockRead(ASYNC
, ERR_IO_PENDING
);
417 DumpMockReadWrite(result
);
422 MockWriteResult
OrderedSocketData::OnWrite(const std::string
& data
) {
423 NET_TRACE(INFO
, " *** ") << "Stage " << sequence_number_
424 << ": Write " << write_index();
425 DumpMockReadWrite(PeekWrite());
428 // TODO(willchan): This 100ms delay seems to work around some weirdness. We
429 // should probably fix the weirdness. One example is in SpdyStream,
430 // DoSendRequest() will return ERR_IO_PENDING, and there's a race. If the
431 // SYN_REPLY causes OnResponseReceived() to get called before
432 // SpdyStream::ReadResponseHeaders() is called, we hit a NOTREACHED().
433 base::MessageLoop::current()->PostDelayedTask(
435 base::Bind(&OrderedSocketData::CompleteRead
,
436 weak_factory_
.GetWeakPtr()),
437 base::TimeDelta::FromMilliseconds(100));
439 return StaticSocketDataProvider::OnWrite(data
);
442 void OrderedSocketData::Reset() {
443 NET_TRACE(INFO
, " *** ") << "Stage "
444 << sequence_number_
<< ": Reset()";
445 sequence_number_
= 0;
446 loop_stop_stage_
= 0;
448 weak_factory_
.InvalidateWeakPtrs();
449 StaticSocketDataProvider::Reset();
452 void OrderedSocketData::CompleteRead() {
453 if (socket() && blocked_
) {
454 NET_TRACE(INFO
, " *** ") << "Stage " << sequence_number_
;
455 socket()->OnReadComplete(GetNextRead());
459 OrderedSocketData::~OrderedSocketData() {}
461 DeterministicSocketData::DeterministicSocketData(MockRead
* reads
,
462 size_t reads_count
, MockWrite
* writes
, size_t writes_count
)
463 : StaticSocketDataProvider(reads
, reads_count
, writes
, writes_count
),
467 stopping_sequence_number_(0),
471 VerifyCorrectSequenceNumbers(reads
, reads_count
, writes
, writes_count
);
474 DeterministicSocketData::~DeterministicSocketData() {}
476 void DeterministicSocketData::Run() {
477 DCHECK(!is_running_
);
482 // Continue to consume data until all data has run out, or the stopped_ flag
483 // has been set. Consuming data requires two separate operations -- running
484 // the tasks in the message loop, and explicitly invoking the read/write
485 // callbacks (simulating network I/O). We check our conditions between each,
486 // since they can change in either.
487 while ((!at_write_eof() || !at_read_eof()) && !stopped()) {
488 if (counter
% 2 == 0)
489 base::RunLoop().RunUntilIdle();
490 if (counter
% 2 == 1) {
495 // We're done consuming new data, but it is possible there are still some
496 // pending callbacks which we expect to complete before returning.
497 while (delegate_
.get() &&
498 (delegate_
->WritePending() || delegate_
->ReadPending()) &&
501 base::RunLoop().RunUntilIdle();
507 void DeterministicSocketData::RunFor(int steps
) {
512 void DeterministicSocketData::SetStop(int seq
) {
513 DCHECK_LT(sequence_number_
, seq
);
514 stopping_sequence_number_
= seq
;
518 void DeterministicSocketData::StopAfter(int seq
) {
519 SetStop(sequence_number_
+ seq
);
522 MockRead
DeterministicSocketData::GetNextRead() {
523 current_read_
= StaticSocketDataProvider::PeekRead();
525 // Synchronous read while stopped is an error
526 if (stopped() && current_read_
.mode
== SYNCHRONOUS
) {
527 LOG(ERROR
) << "Unable to perform synchronous IO while stopped";
528 return MockRead(SYNCHRONOUS
, ERR_UNEXPECTED
);
531 // Async read which will be called back in a future step.
532 if (sequence_number_
< current_read_
.sequence_number
) {
533 NET_TRACE(INFO
, " *** ") << "Stage " << sequence_number_
535 MockRead result
= MockRead(SYNCHRONOUS
, ERR_IO_PENDING
);
536 if (current_read_
.mode
== SYNCHRONOUS
) {
537 LOG(ERROR
) << "Unable to perform synchronous read: "
538 << current_read_
.sequence_number
539 << " at stage: " << sequence_number_
;
540 result
= MockRead(SYNCHRONOUS
, ERR_UNEXPECTED
);
543 DumpMockReadWrite(result
);
547 NET_TRACE(INFO
, " *** ") << "Stage " << sequence_number_
548 << ": Read " << read_index();
550 DumpMockReadWrite(current_read_
);
552 // Increment the sequence number if IO is complete
553 if (current_read_
.mode
== SYNCHRONOUS
)
556 DCHECK_NE(ERR_IO_PENDING
, current_read_
.result
);
557 StaticSocketDataProvider::GetNextRead();
559 return current_read_
;
562 MockWriteResult
DeterministicSocketData::OnWrite(const std::string
& data
) {
563 const MockWrite
& next_write
= StaticSocketDataProvider::PeekWrite();
564 current_write_
= next_write
;
566 // Synchronous write while stopped is an error
567 if (stopped() && next_write
.mode
== SYNCHRONOUS
) {
568 LOG(ERROR
) << "Unable to perform synchronous IO while stopped";
569 return MockWriteResult(SYNCHRONOUS
, ERR_UNEXPECTED
);
572 // Async write which will be called back in a future step.
573 if (sequence_number_
< next_write
.sequence_number
) {
574 NET_TRACE(INFO
, " *** ") << "Stage " << sequence_number_
576 if (next_write
.mode
== SYNCHRONOUS
) {
577 LOG(ERROR
) << "Unable to perform synchronous write: "
578 << next_write
.sequence_number
<< " at stage: " << sequence_number_
;
579 return MockWriteResult(SYNCHRONOUS
, ERR_UNEXPECTED
);
582 NET_TRACE(INFO
, " *** ") << "Stage " << sequence_number_
583 << ": Write " << write_index();
587 DumpMockReadWrite(next_write
);
589 // Move to the next step if I/O is synchronous, since the operation will
590 // complete when this method returns.
591 if (next_write
.mode
== SYNCHRONOUS
)
594 // This is either a sync write for this step, or an async write.
595 return StaticSocketDataProvider::OnWrite(data
);
598 void DeterministicSocketData::Reset() {
599 NET_TRACE(INFO
, " *** ") << "Stage "
600 << sequence_number_
<< ": Reset()";
601 sequence_number_
= 0;
602 StaticSocketDataProvider::Reset();
606 void DeterministicSocketData::InvokeCallbacks() {
607 if (delegate_
.get() && delegate_
->WritePending() &&
608 (current_write().sequence_number
== sequence_number())) {
610 delegate_
->CompleteWrite();
613 if (delegate_
.get() && delegate_
->ReadPending() &&
614 (current_read().sequence_number
== sequence_number())) {
616 delegate_
->CompleteRead();
621 void DeterministicSocketData::NextStep() {
622 // Invariant: Can never move *past* the stopping step.
623 DCHECK_LT(sequence_number_
, stopping_sequence_number_
);
625 if (sequence_number_
== stopping_sequence_number_
)
629 void DeterministicSocketData::VerifyCorrectSequenceNumbers(
630 MockRead
* reads
, size_t reads_count
,
631 MockWrite
* writes
, size_t writes_count
) {
635 while (read
< reads_count
|| write
< writes_count
) {
636 // Check to see that we have a read or write at the expected
638 if (read
< reads_count
&& reads
[read
].sequence_number
== expected
) {
643 if (write
< writes_count
&& writes
[write
].sequence_number
== expected
) {
648 NOTREACHED() << "Missing sequence number: " << expected
;
651 DCHECK_EQ(read
, reads_count
);
652 DCHECK_EQ(write
, writes_count
);
655 MockClientSocketFactory::MockClientSocketFactory() {}
657 MockClientSocketFactory::~MockClientSocketFactory() {}
659 void MockClientSocketFactory::AddSocketDataProvider(
660 SocketDataProvider
* data
) {
661 mock_data_
.Add(data
);
664 void MockClientSocketFactory::AddSSLSocketDataProvider(
665 SSLSocketDataProvider
* data
) {
666 mock_ssl_data_
.Add(data
);
669 void MockClientSocketFactory::ResetNextMockIndexes() {
670 mock_data_
.ResetNextIndex();
671 mock_ssl_data_
.ResetNextIndex();
674 scoped_ptr
<DatagramClientSocket
>
675 MockClientSocketFactory::CreateDatagramClientSocket(
676 DatagramSocket::BindType bind_type
,
677 const RandIntCallback
& rand_int_cb
,
678 net::NetLog
* net_log
,
679 const net::NetLog::Source
& source
) {
680 SocketDataProvider
* data_provider
= mock_data_
.GetNext();
681 scoped_ptr
<MockUDPClientSocket
> socket(
682 new MockUDPClientSocket(data_provider
, net_log
));
683 data_provider
->set_socket(socket
.get());
684 if (bind_type
== DatagramSocket::RANDOM_BIND
)
685 socket
->set_source_port(static_cast<uint16
>(rand_int_cb
.Run(1025, 65535)));
686 return socket
.Pass();
689 scoped_ptr
<StreamSocket
> MockClientSocketFactory::CreateTransportClientSocket(
690 const AddressList
& addresses
,
691 net::NetLog
* net_log
,
692 const net::NetLog::Source
& source
) {
693 SocketDataProvider
* data_provider
= mock_data_
.GetNext();
694 scoped_ptr
<MockTCPClientSocket
> socket(
695 new MockTCPClientSocket(addresses
, net_log
, data_provider
));
696 data_provider
->set_socket(socket
.get());
697 return socket
.Pass();
700 scoped_ptr
<SSLClientSocket
> MockClientSocketFactory::CreateSSLClientSocket(
701 scoped_ptr
<ClientSocketHandle
> transport_socket
,
702 const HostPortPair
& host_and_port
,
703 const SSLConfig
& ssl_config
,
704 const SSLClientSocketContext
& context
) {
705 SSLSocketDataProvider
* next_ssl_data
= mock_ssl_data_
.GetNext();
706 if (!next_ssl_data
->next_protos_expected_in_ssl_config
.empty()) {
707 EXPECT_EQ(next_ssl_data
->next_protos_expected_in_ssl_config
.size(),
708 ssl_config
.next_protos
.size());
710 std::equal(next_ssl_data
->next_protos_expected_in_ssl_config
.begin(),
711 next_ssl_data
->next_protos_expected_in_ssl_config
.end(),
712 ssl_config
.next_protos
.begin()));
714 scoped_ptr
<MockSSLClientSocket
> socket(new MockSSLClientSocket(
715 transport_socket
.Pass(), host_and_port
, ssl_config
, next_ssl_data
));
716 ssl_client_sockets_
.push_back(socket
.get());
717 return socket
.Pass();
720 void MockClientSocketFactory::ClearSSLSessionCache() {
723 const char MockClientSocket::kTlsUnique
[] = "MOCK_TLSUNIQ";
725 MockClientSocket::MockClientSocket(const BoundNetLog
& net_log
)
728 weak_factory_(this) {
730 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip
));
731 peer_addr_
= IPEndPoint(ip
, 0);
734 int MockClientSocket::SetReceiveBufferSize(int32 size
) {
738 int MockClientSocket::SetSendBufferSize(int32 size
) {
742 void MockClientSocket::Disconnect() {
746 bool MockClientSocket::IsConnected() const {
750 bool MockClientSocket::IsConnectedAndIdle() const {
754 int MockClientSocket::GetPeerAddress(IPEndPoint
* address
) const {
756 return ERR_SOCKET_NOT_CONNECTED
;
757 *address
= peer_addr_
;
761 int MockClientSocket::GetLocalAddress(IPEndPoint
* address
) const {
763 bool rv
= ParseIPLiteralToNumber("192.0.2.33", &ip
);
765 *address
= IPEndPoint(ip
, 123);
769 const BoundNetLog
& MockClientSocket::NetLog() const {
773 std::string
MockClientSocket::GetSessionCacheKey() const {
775 return std::string();
778 bool MockClientSocket::InSessionCache() const {
783 void MockClientSocket::SetHandshakeCompletionCallback(const base::Closure
& cb
) {
787 void MockClientSocket::GetSSLCertRequestInfo(
788 SSLCertRequestInfo
* cert_request_info
) {
791 int MockClientSocket::ExportKeyingMaterial(const base::StringPiece
& label
,
793 const base::StringPiece
& context
,
795 unsigned int outlen
) {
796 memset(out
, 'A', outlen
);
800 int MockClientSocket::GetTLSUniqueChannelBinding(std::string
* out
) {
801 out
->assign(MockClientSocket::kTlsUnique
);
805 ChannelIDService
* MockClientSocket::GetChannelIDService() const {
810 SSLClientSocket::NextProtoStatus
811 MockClientSocket::GetNextProto(std::string
* proto
) {
813 return SSLClientSocket::kNextProtoUnsupported
;
816 scoped_refptr
<X509Certificate
>
817 MockClientSocket::GetUnverifiedServerCertificateChain() const {
822 MockClientSocket::~MockClientSocket() {}
824 void MockClientSocket::RunCallbackAsync(const CompletionCallback
& callback
,
826 base::MessageLoop::current()->PostTask(
828 base::Bind(&MockClientSocket::RunCallback
,
829 weak_factory_
.GetWeakPtr(),
834 void MockClientSocket::RunCallback(const net::CompletionCallback
& callback
,
836 if (!callback
.is_null())
837 callback
.Run(result
);
840 MockTCPClientSocket::MockTCPClientSocket(const AddressList
& addresses
,
841 net::NetLog
* net_log
,
842 SocketDataProvider
* data
)
843 : MockClientSocket(BoundNetLog::Make(net_log
, net::NetLog::SOURCE_NONE
)),
844 addresses_(addresses
),
847 read_data_(SYNCHRONOUS
, ERR_UNEXPECTED
),
848 need_read_data_(true),
849 peer_closed_connection_(false),
852 was_used_to_convey_data_(false) {
854 peer_addr_
= data
->connect_data().peer_addr
;
858 MockTCPClientSocket::~MockTCPClientSocket() {}
860 int MockTCPClientSocket::Read(IOBuffer
* buf
, int buf_len
,
861 const CompletionCallback
& callback
) {
863 return ERR_UNEXPECTED
;
865 // If the buffer is already in use, a read is already in progress!
866 DCHECK(pending_buf_
.get() == NULL
);
868 // Store our async IO data.
870 pending_buf_len_
= buf_len
;
871 pending_callback_
= callback
;
873 if (need_read_data_
) {
874 read_data_
= data_
->GetNextRead();
875 if (read_data_
.result
== ERR_CONNECTION_CLOSED
) {
876 // This MockRead is just a marker to instruct us to set
877 // peer_closed_connection_.
878 peer_closed_connection_
= true;
880 if (read_data_
.result
== ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ
) {
881 // This MockRead is just a marker to instruct us to set
882 // peer_closed_connection_. Skip it and get the next one.
883 read_data_
= data_
->GetNextRead();
884 peer_closed_connection_
= true;
886 // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility
887 // to complete the async IO manually later (via OnReadComplete).
888 if (read_data_
.result
== ERR_IO_PENDING
) {
889 // We need to be using async IO in this case.
890 DCHECK(!callback
.is_null());
891 return ERR_IO_PENDING
;
893 need_read_data_
= false;
896 return CompleteRead();
899 int MockTCPClientSocket::Write(IOBuffer
* buf
, int buf_len
,
900 const CompletionCallback
& callback
) {
902 DCHECK_GT(buf_len
, 0);
905 return ERR_UNEXPECTED
;
907 std::string
data(buf
->data(), buf_len
);
908 MockWriteResult write_result
= data_
->OnWrite(data
);
910 was_used_to_convey_data_
= true;
912 if (write_result
.mode
== ASYNC
) {
913 RunCallbackAsync(callback
, write_result
.result
);
914 return ERR_IO_PENDING
;
917 return write_result
.result
;
920 int MockTCPClientSocket::Connect(const CompletionCallback
& callback
) {
924 peer_closed_connection_
= false;
925 if (data_
->connect_data().mode
== ASYNC
) {
926 if (data_
->connect_data().result
== ERR_IO_PENDING
)
927 pending_callback_
= callback
;
929 RunCallbackAsync(callback
, data_
->connect_data().result
);
930 return ERR_IO_PENDING
;
932 return data_
->connect_data().result
;
935 void MockTCPClientSocket::Disconnect() {
936 MockClientSocket::Disconnect();
937 pending_callback_
.Reset();
940 bool MockTCPClientSocket::IsConnected() const {
941 return connected_
&& !peer_closed_connection_
;
944 bool MockTCPClientSocket::IsConnectedAndIdle() const {
945 return IsConnected();
948 int MockTCPClientSocket::GetPeerAddress(IPEndPoint
* address
) const {
949 if (addresses_
.empty())
950 return MockClientSocket::GetPeerAddress(address
);
952 *address
= addresses_
[0];
956 bool MockTCPClientSocket::WasEverUsed() const {
957 return was_used_to_convey_data_
;
960 bool MockTCPClientSocket::UsingTCPFastOpen() const {
964 bool MockTCPClientSocket::WasNpnNegotiated() const {
968 bool MockTCPClientSocket::GetSSLInfo(SSLInfo
* ssl_info
) {
972 void MockTCPClientSocket::OnReadComplete(const MockRead
& data
) {
973 // There must be a read pending.
974 DCHECK(pending_buf_
.get());
975 // You can't complete a read with another ERR_IO_PENDING status code.
976 DCHECK_NE(ERR_IO_PENDING
, data
.result
);
977 // Since we've been waiting for data, need_read_data_ should be true.
978 DCHECK(need_read_data_
);
981 need_read_data_
= false;
983 // The caller is simulating that this IO completes right now. Don't
984 // let CompleteRead() schedule a callback.
985 read_data_
.mode
= SYNCHRONOUS
;
987 CompletionCallback callback
= pending_callback_
;
988 int rv
= CompleteRead();
989 RunCallback(callback
, rv
);
992 void MockTCPClientSocket::OnConnectComplete(const MockConnect
& data
) {
993 CompletionCallback callback
= pending_callback_
;
994 RunCallback(callback
, data
.result
);
997 int MockTCPClientSocket::CompleteRead() {
998 DCHECK(pending_buf_
.get());
999 DCHECK(pending_buf_len_
> 0);
1001 was_used_to_convey_data_
= true;
1003 // Save the pending async IO data and reset our |pending_| state.
1004 scoped_refptr
<IOBuffer
> buf
= pending_buf_
;
1005 int buf_len
= pending_buf_len_
;
1006 CompletionCallback callback
= pending_callback_
;
1007 pending_buf_
= NULL
;
1008 pending_buf_len_
= 0;
1009 pending_callback_
.Reset();
1011 int result
= read_data_
.result
;
1012 DCHECK(result
!= ERR_IO_PENDING
);
1014 if (read_data_
.data
) {
1015 if (read_data_
.data_len
- read_offset_
> 0) {
1016 result
= std::min(buf_len
, read_data_
.data_len
- read_offset_
);
1017 memcpy(buf
->data(), read_data_
.data
+ read_offset_
, result
);
1018 read_offset_
+= result
;
1019 if (read_offset_
== read_data_
.data_len
) {
1020 need_read_data_
= true;
1028 if (read_data_
.mode
== ASYNC
) {
1029 DCHECK(!callback
.is_null());
1030 RunCallbackAsync(callback
, result
);
1031 return ERR_IO_PENDING
;
1036 DeterministicSocketHelper::DeterministicSocketHelper(
1037 net::NetLog
* net_log
,
1038 DeterministicSocketData
* data
)
1039 : write_pending_(false),
1044 read_pending_(false),
1046 was_used_to_convey_data_(false),
1047 peer_closed_connection_(false),
1048 net_log_(BoundNetLog::Make(net_log
, net::NetLog::SOURCE_NONE
)) {
1051 DeterministicSocketHelper::~DeterministicSocketHelper() {}
1053 void DeterministicSocketHelper::CompleteWrite() {
1054 was_used_to_convey_data_
= true;
1055 write_pending_
= false;
1056 write_callback_
.Run(write_result_
);
1059 int DeterministicSocketHelper::CompleteRead() {
1060 DCHECK_GT(read_buf_len_
, 0);
1061 DCHECK_LE(read_data_
.data_len
, read_buf_len_
);
1064 was_used_to_convey_data_
= true;
1066 if (read_data_
.result
== ERR_IO_PENDING
)
1067 read_data_
= data_
->GetNextRead();
1068 DCHECK_NE(ERR_IO_PENDING
, read_data_
.result
);
1069 // If read_data_.mode is ASYNC, we do not need to wait, since this is already
1070 // the callback. Therefore we don't even bother to check it.
1071 int result
= read_data_
.result
;
1073 if (read_data_
.data_len
> 0) {
1074 DCHECK(read_data_
.data
);
1075 result
= std::min(read_buf_len_
, read_data_
.data_len
);
1076 memcpy(read_buf_
->data(), read_data_
.data
, result
);
1079 if (read_pending_
) {
1080 read_pending_
= false;
1081 read_callback_
.Run(result
);
1087 int DeterministicSocketHelper::Write(
1088 IOBuffer
* buf
, int buf_len
, const CompletionCallback
& callback
) {
1090 DCHECK_GT(buf_len
, 0);
1092 std::string
data(buf
->data(), buf_len
);
1093 MockWriteResult write_result
= data_
->OnWrite(data
);
1095 if (write_result
.mode
== ASYNC
) {
1096 write_callback_
= callback
;
1097 write_result_
= write_result
.result
;
1098 DCHECK(!write_callback_
.is_null());
1099 write_pending_
= true;
1100 return ERR_IO_PENDING
;
1103 was_used_to_convey_data_
= true;
1104 write_pending_
= false;
1105 return write_result
.result
;
1108 int DeterministicSocketHelper::Read(
1109 IOBuffer
* buf
, int buf_len
, const CompletionCallback
& callback
) {
1111 read_data_
= data_
->GetNextRead();
1112 // The buffer should always be big enough to contain all the MockRead data. To
1113 // use small buffers, split the data into multiple MockReads.
1114 DCHECK_LE(read_data_
.data_len
, buf_len
);
1116 if (read_data_
.result
== ERR_CONNECTION_CLOSED
) {
1117 // This MockRead is just a marker to instruct us to set
1118 // peer_closed_connection_.
1119 peer_closed_connection_
= true;
1121 if (read_data_
.result
== ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ
) {
1122 // This MockRead is just a marker to instruct us to set
1123 // peer_closed_connection_. Skip it and get the next one.
1124 read_data_
= data_
->GetNextRead();
1125 peer_closed_connection_
= true;
1129 read_buf_len_
= buf_len
;
1130 read_callback_
= callback
;
1132 if (read_data_
.mode
== ASYNC
|| (read_data_
.result
== ERR_IO_PENDING
)) {
1133 read_pending_
= true;
1134 DCHECK(!read_callback_
.is_null());
1135 return ERR_IO_PENDING
;
1138 was_used_to_convey_data_
= true;
1139 return CompleteRead();
1142 DeterministicMockUDPClientSocket::DeterministicMockUDPClientSocket(
1143 net::NetLog
* net_log
,
1144 DeterministicSocketData
* data
)
1145 : connected_(false),
1146 helper_(net_log
, data
),
1150 DeterministicMockUDPClientSocket::~DeterministicMockUDPClientSocket() {}
1152 bool DeterministicMockUDPClientSocket::WritePending() const {
1153 return helper_
.write_pending();
1156 bool DeterministicMockUDPClientSocket::ReadPending() const {
1157 return helper_
.read_pending();
1160 void DeterministicMockUDPClientSocket::CompleteWrite() {
1161 helper_
.CompleteWrite();
1164 int DeterministicMockUDPClientSocket::CompleteRead() {
1165 return helper_
.CompleteRead();
1168 int DeterministicMockUDPClientSocket::Connect(const IPEndPoint
& address
) {
1172 peer_address_
= address
;
1173 return helper_
.data()->connect_data().result
;
1176 int DeterministicMockUDPClientSocket::Write(
1179 const CompletionCallback
& callback
) {
1181 return ERR_UNEXPECTED
;
1183 return helper_
.Write(buf
, buf_len
, callback
);
1186 int DeterministicMockUDPClientSocket::Read(
1189 const CompletionCallback
& callback
) {
1191 return ERR_UNEXPECTED
;
1193 return helper_
.Read(buf
, buf_len
, callback
);
1196 int DeterministicMockUDPClientSocket::SetReceiveBufferSize(int32 size
) {
1200 int DeterministicMockUDPClientSocket::SetSendBufferSize(int32 size
) {
1204 void DeterministicMockUDPClientSocket::Close() {
1208 int DeterministicMockUDPClientSocket::GetPeerAddress(
1209 IPEndPoint
* address
) const {
1210 *address
= peer_address_
;
1214 int DeterministicMockUDPClientSocket::GetLocalAddress(
1215 IPEndPoint
* address
) const {
1217 bool rv
= ParseIPLiteralToNumber("192.0.2.33", &ip
);
1219 *address
= IPEndPoint(ip
, source_port_
);
1223 const BoundNetLog
& DeterministicMockUDPClientSocket::NetLog() const {
1224 return helper_
.net_log();
1227 void DeterministicMockUDPClientSocket::OnReadComplete(const MockRead
& data
) {}
1229 void DeterministicMockUDPClientSocket::OnConnectComplete(
1230 const MockConnect
& data
) {
1234 DeterministicMockTCPClientSocket::DeterministicMockTCPClientSocket(
1235 net::NetLog
* net_log
,
1236 DeterministicSocketData
* data
)
1237 : MockClientSocket(BoundNetLog::Make(net_log
, net::NetLog::SOURCE_NONE
)),
1238 helper_(net_log
, data
) {
1239 peer_addr_
= data
->connect_data().peer_addr
;
1242 DeterministicMockTCPClientSocket::~DeterministicMockTCPClientSocket() {}
1244 bool DeterministicMockTCPClientSocket::WritePending() const {
1245 return helper_
.write_pending();
1248 bool DeterministicMockTCPClientSocket::ReadPending() const {
1249 return helper_
.read_pending();
1252 void DeterministicMockTCPClientSocket::CompleteWrite() {
1253 helper_
.CompleteWrite();
1256 int DeterministicMockTCPClientSocket::CompleteRead() {
1257 return helper_
.CompleteRead();
1260 int DeterministicMockTCPClientSocket::Write(
1263 const CompletionCallback
& callback
) {
1265 return ERR_UNEXPECTED
;
1267 return helper_
.Write(buf
, buf_len
, callback
);
1270 int DeterministicMockTCPClientSocket::Read(
1273 const CompletionCallback
& callback
) {
1275 return ERR_UNEXPECTED
;
1277 return helper_
.Read(buf
, buf_len
, callback
);
1280 // TODO(erikchen): Support connect sequencing.
1281 int DeterministicMockTCPClientSocket::Connect(
1282 const CompletionCallback
& callback
) {
1286 if (helper_
.data()->connect_data().mode
== ASYNC
) {
1287 RunCallbackAsync(callback
, helper_
.data()->connect_data().result
);
1288 return ERR_IO_PENDING
;
1290 return helper_
.data()->connect_data().result
;
1293 void DeterministicMockTCPClientSocket::Disconnect() {
1294 MockClientSocket::Disconnect();
1297 bool DeterministicMockTCPClientSocket::IsConnected() const {
1298 return connected_
&& !helper_
.peer_closed_connection();
1301 bool DeterministicMockTCPClientSocket::IsConnectedAndIdle() const {
1302 return IsConnected();
1305 bool DeterministicMockTCPClientSocket::WasEverUsed() const {
1306 return helper_
.was_used_to_convey_data();
1309 bool DeterministicMockTCPClientSocket::UsingTCPFastOpen() const {
1313 bool DeterministicMockTCPClientSocket::WasNpnNegotiated() const {
1317 bool DeterministicMockTCPClientSocket::GetSSLInfo(SSLInfo
* ssl_info
) {
1321 void DeterministicMockTCPClientSocket::OnReadComplete(const MockRead
& data
) {}
1323 void DeterministicMockTCPClientSocket::OnConnectComplete(
1324 const MockConnect
& data
) {}
1326 MockSSLClientSocket::MockSSLClientSocket(
1327 scoped_ptr
<ClientSocketHandle
> transport_socket
,
1328 const HostPortPair
& host_port_pair
,
1329 const SSLConfig
& ssl_config
,
1330 SSLSocketDataProvider
* data
)
1332 // Have to use the right BoundNetLog for LoadTimingInfo regression
1334 transport_socket
->socket()->NetLog()),
1335 transport_(transport_socket
.Pass()),
1336 host_port_pair_(host_port_pair
),
1338 is_npn_state_set_(false),
1339 new_npn_value_(false),
1340 is_protocol_negotiated_set_(false),
1341 protocol_negotiated_(kProtoUnknown
),
1342 next_connect_state_(STATE_NONE
),
1343 reached_connect_(false),
1344 weak_factory_(this) {
1346 peer_addr_
= data
->connect
.peer_addr
;
1349 MockSSLClientSocket::~MockSSLClientSocket() {
1353 int MockSSLClientSocket::Read(IOBuffer
* buf
, int buf_len
,
1354 const CompletionCallback
& callback
) {
1355 return transport_
->socket()->Read(buf
, buf_len
, callback
);
1358 int MockSSLClientSocket::Write(IOBuffer
* buf
, int buf_len
,
1359 const CompletionCallback
& callback
) {
1360 return transport_
->socket()->Write(buf
, buf_len
, callback
);
1363 int MockSSLClientSocket::Connect(const CompletionCallback
& callback
) {
1364 next_connect_state_
= STATE_SSL_CONNECT
;
1365 reached_connect_
= true;
1366 int rv
= DoConnectLoop(OK
);
1367 if (rv
== ERR_IO_PENDING
)
1368 connect_callback_
= callback
;
1372 void MockSSLClientSocket::Disconnect() {
1373 weak_factory_
.InvalidateWeakPtrs();
1374 MockClientSocket::Disconnect();
1375 if (transport_
->socket() != NULL
)
1376 transport_
->socket()->Disconnect();
1379 bool MockSSLClientSocket::IsConnected() const {
1380 return transport_
->socket()->IsConnected() && connected_
;
1383 bool MockSSLClientSocket::WasEverUsed() const {
1384 return transport_
->socket()->WasEverUsed();
1387 bool MockSSLClientSocket::UsingTCPFastOpen() const {
1388 return transport_
->socket()->UsingTCPFastOpen();
1391 int MockSSLClientSocket::GetPeerAddress(IPEndPoint
* address
) const {
1392 return transport_
->socket()->GetPeerAddress(address
);
1395 bool MockSSLClientSocket::GetSSLInfo(SSLInfo
* ssl_info
) {
1397 ssl_info
->cert
= data_
->cert
;
1398 ssl_info
->client_cert_sent
= data_
->client_cert_sent
;
1399 ssl_info
->channel_id_sent
= data_
->channel_id_sent
;
1400 ssl_info
->connection_status
= data_
->connection_status
;
1404 std::string
MockSSLClientSocket::GetSessionCacheKey() const {
1405 // For the purposes of these tests, |host_and_port| will serve as the
1407 return host_port_pair_
.ToString();
1410 bool MockSSLClientSocket::InSessionCache() const {
1411 return data_
->is_in_session_cache
;
1414 void MockSSLClientSocket::SetHandshakeCompletionCallback(
1415 const base::Closure
& cb
) {
1416 handshake_completion_callback_
= cb
;
1419 void MockSSLClientSocket::GetSSLCertRequestInfo(
1420 SSLCertRequestInfo
* cert_request_info
) {
1421 DCHECK(cert_request_info
);
1422 if (data_
->cert_request_info
) {
1423 cert_request_info
->host_and_port
=
1424 data_
->cert_request_info
->host_and_port
;
1425 cert_request_info
->client_certs
= data_
->cert_request_info
->client_certs
;
1427 cert_request_info
->Reset();
1431 SSLClientSocket::NextProtoStatus
MockSSLClientSocket::GetNextProto(
1432 std::string
* proto
) {
1433 *proto
= data_
->next_proto
;
1434 return data_
->next_proto_status
;
1437 bool MockSSLClientSocket::set_was_npn_negotiated(bool negotiated
) {
1438 is_npn_state_set_
= true;
1439 return new_npn_value_
= negotiated
;
1442 bool MockSSLClientSocket::WasNpnNegotiated() const {
1443 if (is_npn_state_set_
)
1444 return new_npn_value_
;
1445 return data_
->was_npn_negotiated
;
1448 NextProto
MockSSLClientSocket::GetNegotiatedProtocol() const {
1449 if (is_protocol_negotiated_set_
)
1450 return protocol_negotiated_
;
1451 return data_
->protocol_negotiated
;
1454 void MockSSLClientSocket::set_protocol_negotiated(
1455 NextProto protocol_negotiated
) {
1456 is_protocol_negotiated_set_
= true;
1457 protocol_negotiated_
= protocol_negotiated
;
1460 bool MockSSLClientSocket::WasChannelIDSent() const {
1461 return data_
->channel_id_sent
;
1464 void MockSSLClientSocket::set_channel_id_sent(bool channel_id_sent
) {
1465 data_
->channel_id_sent
= channel_id_sent
;
1468 ChannelIDService
* MockSSLClientSocket::GetChannelIDService() const {
1469 return data_
->channel_id_service
;
1472 void MockSSLClientSocket::OnReadComplete(const MockRead
& data
) {
1476 void MockSSLClientSocket::OnConnectComplete(const MockConnect
& data
) {
1480 void MockSSLClientSocket::RestartPausedConnect() {
1481 DCHECK(data_
->should_pause_on_connect
);
1482 DCHECK_EQ(next_connect_state_
, STATE_SSL_CONNECT_COMPLETE
);
1483 OnIOComplete(data_
->connect
.result
);
1486 void MockSSLClientSocket::OnIOComplete(int result
) {
1487 int rv
= DoConnectLoop(result
);
1488 if (rv
!= ERR_IO_PENDING
)
1489 base::ResetAndReturn(&connect_callback_
).Run(rv
);
1492 int MockSSLClientSocket::DoConnectLoop(int result
) {
1493 DCHECK_NE(next_connect_state_
, STATE_NONE
);
1497 ConnectState state
= next_connect_state_
;
1498 next_connect_state_
= STATE_NONE
;
1500 case STATE_SSL_CONNECT
:
1501 rv
= DoSSLConnect();
1503 case STATE_SSL_CONNECT_COMPLETE
:
1504 rv
= DoSSLConnectComplete(rv
);
1507 NOTREACHED() << "bad state";
1508 rv
= ERR_UNEXPECTED
;
1511 } while (rv
!= ERR_IO_PENDING
&& next_connect_state_
!= STATE_NONE
);
1516 int MockSSLClientSocket::DoSSLConnect() {
1517 next_connect_state_
= STATE_SSL_CONNECT_COMPLETE
;
1519 if (data_
->should_pause_on_connect
)
1520 return ERR_IO_PENDING
;
1522 if (data_
->connect
.mode
== ASYNC
) {
1523 base::MessageLoop::current()->PostTask(
1525 base::Bind(&MockSSLClientSocket::OnIOComplete
,
1526 weak_factory_
.GetWeakPtr(),
1527 data_
->connect
.result
));
1528 return ERR_IO_PENDING
;
1531 return data_
->connect
.result
;
1534 int MockSSLClientSocket::DoSSLConnectComplete(int result
) {
1538 if (!handshake_completion_callback_
.is_null())
1539 base::ResetAndReturn(&handshake_completion_callback_
).Run();
1543 MockUDPClientSocket::MockUDPClientSocket(SocketDataProvider
* data
,
1544 net::NetLog
* net_log
)
1545 : connected_(false),
1548 read_data_(SYNCHRONOUS
, ERR_UNEXPECTED
),
1549 need_read_data_(true),
1552 pending_buf_len_(0),
1553 net_log_(BoundNetLog::Make(net_log
, net::NetLog::SOURCE_NONE
)),
1554 weak_factory_(this) {
1557 peer_addr_
= data
->connect_data().peer_addr
;
1560 MockUDPClientSocket::~MockUDPClientSocket() {}
1562 int MockUDPClientSocket::Read(IOBuffer
* buf
,
1564 const CompletionCallback
& callback
) {
1566 return ERR_UNEXPECTED
;
1568 // If the buffer is already in use, a read is already in progress!
1569 DCHECK(pending_buf_
.get() == NULL
);
1571 // Store our async IO data.
1573 pending_buf_len_
= buf_len
;
1574 pending_callback_
= callback
;
1576 if (need_read_data_
) {
1577 read_data_
= data_
->GetNextRead();
1578 // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility
1579 // to complete the async IO manually later (via OnReadComplete).
1580 if (read_data_
.result
== ERR_IO_PENDING
) {
1581 // We need to be using async IO in this case.
1582 DCHECK(!callback
.is_null());
1583 return ERR_IO_PENDING
;
1585 need_read_data_
= false;
1588 return CompleteRead();
1591 int MockUDPClientSocket::Write(IOBuffer
* buf
, int buf_len
,
1592 const CompletionCallback
& callback
) {
1594 DCHECK_GT(buf_len
, 0);
1597 return ERR_UNEXPECTED
;
1599 std::string
data(buf
->data(), buf_len
);
1600 MockWriteResult write_result
= data_
->OnWrite(data
);
1602 if (write_result
.mode
== ASYNC
) {
1603 RunCallbackAsync(callback
, write_result
.result
);
1604 return ERR_IO_PENDING
;
1606 return write_result
.result
;
1609 int MockUDPClientSocket::SetReceiveBufferSize(int32 size
) {
1613 int MockUDPClientSocket::SetSendBufferSize(int32 size
) {
1617 void MockUDPClientSocket::Close() {
1621 int MockUDPClientSocket::GetPeerAddress(IPEndPoint
* address
) const {
1622 *address
= peer_addr_
;
1626 int MockUDPClientSocket::GetLocalAddress(IPEndPoint
* address
) const {
1628 bool rv
= ParseIPLiteralToNumber("192.0.2.33", &ip
);
1630 *address
= IPEndPoint(ip
, source_port_
);
1634 const BoundNetLog
& MockUDPClientSocket::NetLog() const {
1638 int MockUDPClientSocket::Connect(const IPEndPoint
& address
) {
1640 peer_addr_
= address
;
1641 return data_
->connect_data().result
;
1644 void MockUDPClientSocket::OnReadComplete(const MockRead
& data
) {
1645 // There must be a read pending.
1646 DCHECK(pending_buf_
.get());
1647 // You can't complete a read with another ERR_IO_PENDING status code.
1648 DCHECK_NE(ERR_IO_PENDING
, data
.result
);
1649 // Since we've been waiting for data, need_read_data_ should be true.
1650 DCHECK(need_read_data_
);
1653 need_read_data_
= false;
1655 // The caller is simulating that this IO completes right now. Don't
1656 // let CompleteRead() schedule a callback.
1657 read_data_
.mode
= SYNCHRONOUS
;
1659 net::CompletionCallback callback
= pending_callback_
;
1660 int rv
= CompleteRead();
1661 RunCallback(callback
, rv
);
1664 void MockUDPClientSocket::OnConnectComplete(const MockConnect
& data
) {
1668 int MockUDPClientSocket::CompleteRead() {
1669 DCHECK(pending_buf_
.get());
1670 DCHECK(pending_buf_len_
> 0);
1672 // Save the pending async IO data and reset our |pending_| state.
1673 scoped_refptr
<IOBuffer
> buf
= pending_buf_
;
1674 int buf_len
= pending_buf_len_
;
1675 CompletionCallback callback
= pending_callback_
;
1676 pending_buf_
= NULL
;
1677 pending_buf_len_
= 0;
1678 pending_callback_
.Reset();
1680 int result
= read_data_
.result
;
1681 DCHECK(result
!= ERR_IO_PENDING
);
1683 if (read_data_
.data
) {
1684 if (read_data_
.data_len
- read_offset_
> 0) {
1685 result
= std::min(buf_len
, read_data_
.data_len
- read_offset_
);
1686 memcpy(buf
->data(), read_data_
.data
+ read_offset_
, result
);
1687 read_offset_
+= result
;
1688 if (read_offset_
== read_data_
.data_len
) {
1689 need_read_data_
= true;
1697 if (read_data_
.mode
== ASYNC
) {
1698 DCHECK(!callback
.is_null());
1699 RunCallbackAsync(callback
, result
);
1700 return ERR_IO_PENDING
;
1705 void MockUDPClientSocket::RunCallbackAsync(const CompletionCallback
& callback
,
1707 base::MessageLoop::current()->PostTask(
1709 base::Bind(&MockUDPClientSocket::RunCallback
,
1710 weak_factory_
.GetWeakPtr(),
1715 void MockUDPClientSocket::RunCallback(const CompletionCallback
& callback
,
1717 if (!callback
.is_null())
1718 callback
.Run(result
);
1721 TestSocketRequest::TestSocketRequest(
1722 std::vector
<TestSocketRequest
*>* request_order
, size_t* completion_count
)
1723 : request_order_(request_order
),
1724 completion_count_(completion_count
),
1725 callback_(base::Bind(&TestSocketRequest::OnComplete
,
1726 base::Unretained(this))) {
1727 DCHECK(request_order
);
1728 DCHECK(completion_count
);
1731 TestSocketRequest::~TestSocketRequest() {
1734 void TestSocketRequest::OnComplete(int result
) {
1736 (*completion_count_
)++;
1737 request_order_
->push_back(this);
1741 const int ClientSocketPoolTest::kIndexOutOfBounds
= -1;
1744 const int ClientSocketPoolTest::kRequestNotFound
= -2;
1746 ClientSocketPoolTest::ClientSocketPoolTest() : completion_count_(0) {}
1747 ClientSocketPoolTest::~ClientSocketPoolTest() {}
1749 int ClientSocketPoolTest::GetOrderOfRequest(size_t index
) const {
1751 if (index
>= requests_
.size())
1752 return kIndexOutOfBounds
;
1754 for (size_t i
= 0; i
< request_order_
.size(); i
++)
1755 if (requests_
[index
] == request_order_
[i
])
1758 return kRequestNotFound
;
1761 bool ClientSocketPoolTest::ReleaseOneConnection(KeepAlive keep_alive
) {
1762 ScopedVector
<TestSocketRequest
>::iterator i
;
1763 for (i
= requests_
.begin(); i
!= requests_
.end(); ++i
) {
1764 if ((*i
)->handle()->is_initialized()) {
1765 if (keep_alive
== NO_KEEP_ALIVE
)
1766 (*i
)->handle()->socket()->Disconnect();
1767 (*i
)->handle()->Reset();
1768 base::RunLoop().RunUntilIdle();
1775 void ClientSocketPoolTest::ReleaseAllConnections(KeepAlive keep_alive
) {
1778 released_one
= ReleaseOneConnection(keep_alive
);
1779 } while (released_one
);
1782 MockTransportClientSocketPool::MockConnectJob::MockConnectJob(
1783 scoped_ptr
<StreamSocket
> socket
,
1784 ClientSocketHandle
* handle
,
1785 const CompletionCallback
& callback
)
1786 : socket_(socket
.Pass()),
1788 user_callback_(callback
) {
1791 MockTransportClientSocketPool::MockConnectJob::~MockConnectJob() {}
1793 int MockTransportClientSocketPool::MockConnectJob::Connect() {
1794 int rv
= socket_
->Connect(base::Bind(&MockConnectJob::OnConnect
,
1795 base::Unretained(this)));
1797 user_callback_
.Reset();
1803 bool MockTransportClientSocketPool::MockConnectJob::CancelHandle(
1804 const ClientSocketHandle
* handle
) {
1805 if (handle
!= handle_
)
1809 user_callback_
.Reset();
1813 void MockTransportClientSocketPool::MockConnectJob::OnConnect(int rv
) {
1817 handle_
->SetSocket(socket_
.Pass());
1819 // Needed for socket pool tests that layer other sockets on top of mock
1821 LoadTimingInfo::ConnectTiming connect_timing
;
1822 base::TimeTicks now
= base::TimeTicks::Now();
1823 connect_timing
.dns_start
= now
;
1824 connect_timing
.dns_end
= now
;
1825 connect_timing
.connect_start
= now
;
1826 connect_timing
.connect_end
= now
;
1827 handle_
->set_connect_timing(connect_timing
);
1834 if (!user_callback_
.is_null()) {
1835 CompletionCallback callback
= user_callback_
;
1836 user_callback_
.Reset();
1841 MockTransportClientSocketPool::MockTransportClientSocketPool(
1843 int max_sockets_per_group
,
1844 ClientSocketPoolHistograms
* histograms
,
1845 ClientSocketFactory
* socket_factory
)
1846 : TransportClientSocketPool(max_sockets
, max_sockets_per_group
, histograms
,
1848 client_socket_factory_(socket_factory
),
1849 last_request_priority_(DEFAULT_PRIORITY
),
1854 MockTransportClientSocketPool::~MockTransportClientSocketPool() {}
1856 int MockTransportClientSocketPool::RequestSocket(
1857 const std::string
& group_name
, const void* socket_params
,
1858 RequestPriority priority
, ClientSocketHandle
* handle
,
1859 const CompletionCallback
& callback
, const BoundNetLog
& net_log
) {
1860 last_request_priority_
= priority
;
1861 scoped_ptr
<StreamSocket
> socket
=
1862 client_socket_factory_
->CreateTransportClientSocket(
1863 AddressList(), net_log
.net_log(), net::NetLog::Source());
1864 MockConnectJob
* job
= new MockConnectJob(socket
.Pass(), handle
, callback
);
1865 job_list_
.push_back(job
);
1866 handle
->set_pool_id(1);
1867 return job
->Connect();
1870 void MockTransportClientSocketPool::CancelRequest(const std::string
& group_name
,
1871 ClientSocketHandle
* handle
) {
1872 std::vector
<MockConnectJob
*>::iterator i
;
1873 for (i
= job_list_
.begin(); i
!= job_list_
.end(); ++i
) {
1874 if ((*i
)->CancelHandle(handle
)) {
1881 void MockTransportClientSocketPool::ReleaseSocket(
1882 const std::string
& group_name
,
1883 scoped_ptr
<StreamSocket
> socket
,
1889 DeterministicMockClientSocketFactory::DeterministicMockClientSocketFactory() {}
1891 DeterministicMockClientSocketFactory::~DeterministicMockClientSocketFactory() {}
1893 void DeterministicMockClientSocketFactory::AddSocketDataProvider(
1894 DeterministicSocketData
* data
) {
1895 mock_data_
.Add(data
);
1898 void DeterministicMockClientSocketFactory::AddSSLSocketDataProvider(
1899 SSLSocketDataProvider
* data
) {
1900 mock_ssl_data_
.Add(data
);
1903 void DeterministicMockClientSocketFactory::ResetNextMockIndexes() {
1904 mock_data_
.ResetNextIndex();
1905 mock_ssl_data_
.ResetNextIndex();
1908 MockSSLClientSocket
* DeterministicMockClientSocketFactory::
1909 GetMockSSLClientSocket(size_t index
) const {
1910 DCHECK_LT(index
, ssl_client_sockets_
.size());
1911 return ssl_client_sockets_
[index
];
1914 scoped_ptr
<DatagramClientSocket
>
1915 DeterministicMockClientSocketFactory::CreateDatagramClientSocket(
1916 DatagramSocket::BindType bind_type
,
1917 const RandIntCallback
& rand_int_cb
,
1918 net::NetLog
* net_log
,
1919 const NetLog::Source
& source
) {
1920 DeterministicSocketData
* data_provider
= mock_data().GetNext();
1921 scoped_ptr
<DeterministicMockUDPClientSocket
> socket(
1922 new DeterministicMockUDPClientSocket(net_log
, data_provider
));
1923 data_provider
->set_delegate(socket
->AsWeakPtr());
1924 udp_client_sockets().push_back(socket
.get());
1925 if (bind_type
== DatagramSocket::RANDOM_BIND
)
1926 socket
->set_source_port(static_cast<uint16
>(rand_int_cb
.Run(1025, 65535)));
1927 return socket
.Pass();
1930 scoped_ptr
<StreamSocket
>
1931 DeterministicMockClientSocketFactory::CreateTransportClientSocket(
1932 const AddressList
& addresses
,
1933 net::NetLog
* net_log
,
1934 const net::NetLog::Source
& source
) {
1935 DeterministicSocketData
* data_provider
= mock_data().GetNext();
1936 scoped_ptr
<DeterministicMockTCPClientSocket
> socket(
1937 new DeterministicMockTCPClientSocket(net_log
, data_provider
));
1938 data_provider
->set_delegate(socket
->AsWeakPtr());
1939 tcp_client_sockets().push_back(socket
.get());
1940 return socket
.Pass();
1943 scoped_ptr
<SSLClientSocket
>
1944 DeterministicMockClientSocketFactory::CreateSSLClientSocket(
1945 scoped_ptr
<ClientSocketHandle
> transport_socket
,
1946 const HostPortPair
& host_and_port
,
1947 const SSLConfig
& ssl_config
,
1948 const SSLClientSocketContext
& context
) {
1949 scoped_ptr
<MockSSLClientSocket
> socket(
1950 new MockSSLClientSocket(transport_socket
.Pass(),
1951 host_and_port
, ssl_config
,
1952 mock_ssl_data_
.GetNext()));
1953 ssl_client_sockets_
.push_back(socket
.get());
1954 return socket
.Pass();
1957 void DeterministicMockClientSocketFactory::ClearSSLSessionCache() {
1960 MockSOCKSClientSocketPool::MockSOCKSClientSocketPool(
1962 int max_sockets_per_group
,
1963 ClientSocketPoolHistograms
* histograms
,
1964 TransportClientSocketPool
* transport_pool
)
1965 : SOCKSClientSocketPool(max_sockets
, max_sockets_per_group
, histograms
,
1966 NULL
, transport_pool
, NULL
),
1967 transport_pool_(transport_pool
) {
1970 MockSOCKSClientSocketPool::~MockSOCKSClientSocketPool() {}
1972 int MockSOCKSClientSocketPool::RequestSocket(
1973 const std::string
& group_name
, const void* socket_params
,
1974 RequestPriority priority
, ClientSocketHandle
* handle
,
1975 const CompletionCallback
& callback
, const BoundNetLog
& net_log
) {
1976 return transport_pool_
->RequestSocket(
1977 group_name
, socket_params
, priority
, handle
, callback
, net_log
);
1980 void MockSOCKSClientSocketPool::CancelRequest(
1981 const std::string
& group_name
,
1982 ClientSocketHandle
* handle
) {
1983 return transport_pool_
->CancelRequest(group_name
, handle
);
1986 void MockSOCKSClientSocketPool::ReleaseSocket(const std::string
& group_name
,
1987 scoped_ptr
<StreamSocket
> socket
,
1989 return transport_pool_
->ReleaseSocket(group_name
, socket
.Pass(), id
);
1992 const char kSOCKS5GreetRequest
[] = { 0x05, 0x01, 0x00 };
1993 const int kSOCKS5GreetRequestLength
= arraysize(kSOCKS5GreetRequest
);
1995 const char kSOCKS5GreetResponse
[] = { 0x05, 0x00 };
1996 const int kSOCKS5GreetResponseLength
= arraysize(kSOCKS5GreetResponse
);
1998 const char kSOCKS5OkRequest
[] =
1999 { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 };
2000 const int kSOCKS5OkRequestLength
= arraysize(kSOCKS5OkRequest
);
2002 const char kSOCKS5OkResponse
[] =
2003 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 };
2004 const int kSOCKS5OkResponseLength
= arraysize(kSOCKS5OkResponse
);