Fix a crash in the LegacyRenderWidgetHostHWND destruction code path which occurs...
[chromium-blink-merge.git] / net / socket / socket_test_util.cc
blobf993801adeb2814aede788bcf82c693bfa99696f
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"
7 #include <algorithm>
8 #include <vector>
10 #include "base/basictypes.h"
11 #include "base/bind.h"
12 #include "base/bind_helpers.h"
13 #include "base/compiler_specific.h"
14 #include "base/message_loop/message_loop.h"
15 #include "base/run_loop.h"
16 #include "base/time/time.h"
17 #include "net/base/address_family.h"
18 #include "net/base/address_list.h"
19 #include "net/base/auth.h"
20 #include "net/base/load_timing_info.h"
21 #include "net/http/http_network_session.h"
22 #include "net/http/http_request_headers.h"
23 #include "net/http/http_response_headers.h"
24 #include "net/socket/client_socket_pool_histograms.h"
25 #include "net/socket/socket.h"
26 #include "net/ssl/ssl_cert_request_info.h"
27 #include "net/ssl/ssl_connection_status_flags.h"
28 #include "net/ssl/ssl_info.h"
29 #include "testing/gtest/include/gtest/gtest.h"
31 // Socket events are easier to debug if you log individual reads and writes.
32 // Enable these if locally debugging, but they are too noisy for the waterfall.
33 #if 0
34 #define NET_TRACE(level, s) DLOG(level) << s << __FUNCTION__ << "() "
35 #else
36 #define NET_TRACE(level, s) EAT_STREAM_PARAMETERS
37 #endif
39 namespace net {
41 namespace {
43 inline char AsciifyHigh(char x) {
44 char nybble = static_cast<char>((x >> 4) & 0x0F);
45 return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10);
48 inline char AsciifyLow(char x) {
49 char nybble = static_cast<char>((x >> 0) & 0x0F);
50 return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10);
53 inline char Asciify(char x) {
54 if ((x < 0) || !isprint(x))
55 return '.';
56 return x;
59 void DumpData(const char* data, int data_len) {
60 if (logging::LOG_INFO < logging::GetMinLogLevel())
61 return;
62 DVLOG(1) << "Length: " << data_len;
63 const char* pfx = "Data: ";
64 if (!data || (data_len <= 0)) {
65 DVLOG(1) << pfx << "<None>";
66 } else {
67 int i;
68 for (i = 0; i <= (data_len - 4); i += 4) {
69 DVLOG(1) << pfx
70 << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
71 << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
72 << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2])
73 << AsciifyHigh(data[i + 3]) << AsciifyLow(data[i + 3])
74 << " '"
75 << Asciify(data[i + 0])
76 << Asciify(data[i + 1])
77 << Asciify(data[i + 2])
78 << Asciify(data[i + 3])
79 << "'";
80 pfx = " ";
82 // Take care of any 'trailing' bytes, if data_len was not a multiple of 4.
83 switch (data_len - i) {
84 case 3:
85 DVLOG(1) << pfx
86 << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
87 << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
88 << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2])
89 << " '"
90 << Asciify(data[i + 0])
91 << Asciify(data[i + 1])
92 << Asciify(data[i + 2])
93 << " '";
94 break;
95 case 2:
96 DVLOG(1) << pfx
97 << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
98 << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
99 << " '"
100 << Asciify(data[i + 0])
101 << Asciify(data[i + 1])
102 << " '";
103 break;
104 case 1:
105 DVLOG(1) << pfx
106 << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
107 << " '"
108 << Asciify(data[i + 0])
109 << " '";
110 break;
115 template <MockReadWriteType type>
116 void DumpMockReadWrite(const MockReadWrite<type>& r) {
117 if (logging::LOG_INFO < logging::GetMinLogLevel())
118 return;
119 DVLOG(1) << "Async: " << (r.mode == ASYNC)
120 << "\nResult: " << r.result;
121 DumpData(r.data, r.data_len);
122 const char* stop = (r.sequence_number & MockRead::STOPLOOP) ? " (STOP)" : "";
123 DVLOG(1) << "Stage: " << (r.sequence_number & ~MockRead::STOPLOOP) << stop
124 << "\nTime: " << r.time_stamp.ToInternalValue();
127 } // namespace
129 MockConnect::MockConnect() : mode(ASYNC), result(OK) {
130 IPAddressNumber ip;
131 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
132 peer_addr = IPEndPoint(ip, 0);
135 MockConnect::MockConnect(IoMode io_mode, int r) : mode(io_mode), result(r) {
136 IPAddressNumber ip;
137 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
138 peer_addr = IPEndPoint(ip, 0);
141 MockConnect::MockConnect(IoMode io_mode, int r, IPEndPoint addr) :
142 mode(io_mode),
143 result(r),
144 peer_addr(addr) {
147 MockConnect::~MockConnect() {}
149 StaticSocketDataProvider::StaticSocketDataProvider()
150 : reads_(NULL),
151 read_index_(0),
152 read_count_(0),
153 writes_(NULL),
154 write_index_(0),
155 write_count_(0) {
158 StaticSocketDataProvider::StaticSocketDataProvider(MockRead* reads,
159 size_t reads_count,
160 MockWrite* writes,
161 size_t writes_count)
162 : reads_(reads),
163 read_index_(0),
164 read_count_(reads_count),
165 writes_(writes),
166 write_index_(0),
167 write_count_(writes_count) {
170 StaticSocketDataProvider::~StaticSocketDataProvider() {}
172 const MockRead& StaticSocketDataProvider::PeekRead() const {
173 CHECK(!at_read_eof());
174 return reads_[read_index_];
177 const MockWrite& StaticSocketDataProvider::PeekWrite() const {
178 CHECK(!at_write_eof());
179 return writes_[write_index_];
182 const MockRead& StaticSocketDataProvider::PeekRead(size_t index) const {
183 CHECK_LT(index, read_count_);
184 return reads_[index];
187 const MockWrite& StaticSocketDataProvider::PeekWrite(size_t index) const {
188 CHECK_LT(index, write_count_);
189 return writes_[index];
192 MockRead StaticSocketDataProvider::GetNextRead() {
193 CHECK(!at_read_eof());
194 reads_[read_index_].time_stamp = base::Time::Now();
195 return reads_[read_index_++];
198 MockWriteResult StaticSocketDataProvider::OnWrite(const std::string& data) {
199 if (!writes_) {
200 // Not using mock writes; succeed synchronously.
201 return MockWriteResult(SYNCHRONOUS, data.length());
203 EXPECT_FALSE(at_write_eof());
204 if (at_write_eof()) {
205 // Show what the extra write actually consists of.
206 EXPECT_EQ("<unexpected write>", data);
207 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
210 // Check that what we are writing matches the expectation.
211 // Then give the mocked return value.
212 MockWrite* w = &writes_[write_index_++];
213 w->time_stamp = base::Time::Now();
214 int result = w->result;
215 if (w->data) {
216 // Note - we can simulate a partial write here. If the expected data
217 // is a match, but shorter than the write actually written, that is legal.
218 // Example:
219 // Application writes "foobarbaz" (9 bytes)
220 // Expected write was "foo" (3 bytes)
221 // This is a success, and we return 3 to the application.
222 std::string expected_data(w->data, w->data_len);
223 EXPECT_GE(data.length(), expected_data.length());
224 std::string actual_data(data.substr(0, w->data_len));
225 EXPECT_EQ(expected_data, actual_data);
226 if (expected_data != actual_data)
227 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
228 if (result == OK)
229 result = w->data_len;
231 return MockWriteResult(w->mode, result);
234 void StaticSocketDataProvider::Reset() {
235 read_index_ = 0;
236 write_index_ = 0;
239 DynamicSocketDataProvider::DynamicSocketDataProvider()
240 : short_read_limit_(0),
241 allow_unconsumed_reads_(false) {
244 DynamicSocketDataProvider::~DynamicSocketDataProvider() {}
246 MockRead DynamicSocketDataProvider::GetNextRead() {
247 if (reads_.empty())
248 return MockRead(SYNCHRONOUS, ERR_UNEXPECTED);
249 MockRead result = reads_.front();
250 if (short_read_limit_ == 0 || result.data_len <= short_read_limit_) {
251 reads_.pop_front();
252 } else {
253 result.data_len = short_read_limit_;
254 reads_.front().data += result.data_len;
255 reads_.front().data_len -= result.data_len;
257 return result;
260 void DynamicSocketDataProvider::Reset() {
261 reads_.clear();
264 void DynamicSocketDataProvider::SimulateRead(const char* data,
265 const size_t length) {
266 if (!allow_unconsumed_reads_) {
267 EXPECT_TRUE(reads_.empty()) << "Unconsumed read: " << reads_.front().data;
269 reads_.push_back(MockRead(ASYNC, data, length));
272 SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result)
273 : connect(mode, result),
274 next_proto_status(SSLClientSocket::kNextProtoUnsupported),
275 was_npn_negotiated(false),
276 protocol_negotiated(kProtoUnknown),
277 client_cert_sent(false),
278 cert_request_info(NULL),
279 channel_id_sent(false),
280 connection_status(0) {
281 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2,
282 &connection_status);
283 // Set to TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
284 SSLConnectionStatusSetCipherSuite(0xcc14, &connection_status);
287 SSLSocketDataProvider::~SSLSocketDataProvider() {
290 void SSLSocketDataProvider::SetNextProto(NextProto proto) {
291 was_npn_negotiated = true;
292 next_proto_status = SSLClientSocket::kNextProtoNegotiated;
293 protocol_negotiated = proto;
294 next_proto = SSLClientSocket::NextProtoToString(proto);
297 DelayedSocketData::DelayedSocketData(
298 int write_delay, MockRead* reads, size_t reads_count,
299 MockWrite* writes, size_t writes_count)
300 : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
301 write_delay_(write_delay),
302 read_in_progress_(false),
303 weak_factory_(this) {
304 DCHECK_GE(write_delay_, 0);
307 DelayedSocketData::DelayedSocketData(
308 const MockConnect& connect, int write_delay, MockRead* reads,
309 size_t reads_count, MockWrite* writes, size_t writes_count)
310 : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
311 write_delay_(write_delay),
312 read_in_progress_(false),
313 weak_factory_(this) {
314 DCHECK_GE(write_delay_, 0);
315 set_connect_data(connect);
318 DelayedSocketData::~DelayedSocketData() {
321 void DelayedSocketData::ForceNextRead() {
322 DCHECK(read_in_progress_);
323 write_delay_ = 0;
324 CompleteRead();
327 MockRead DelayedSocketData::GetNextRead() {
328 MockRead out = MockRead(ASYNC, ERR_IO_PENDING);
329 if (write_delay_ <= 0)
330 out = StaticSocketDataProvider::GetNextRead();
331 read_in_progress_ = (out.result == ERR_IO_PENDING);
332 return out;
335 MockWriteResult DelayedSocketData::OnWrite(const std::string& data) {
336 MockWriteResult rv = StaticSocketDataProvider::OnWrite(data);
337 // Now that our write has completed, we can allow reads to continue.
338 if (!--write_delay_ && read_in_progress_)
339 base::MessageLoop::current()->PostDelayedTask(
340 FROM_HERE,
341 base::Bind(&DelayedSocketData::CompleteRead,
342 weak_factory_.GetWeakPtr()),
343 base::TimeDelta::FromMilliseconds(100));
344 return rv;
347 void DelayedSocketData::Reset() {
348 set_socket(NULL);
349 read_in_progress_ = false;
350 weak_factory_.InvalidateWeakPtrs();
351 StaticSocketDataProvider::Reset();
354 void DelayedSocketData::CompleteRead() {
355 if (socket() && read_in_progress_)
356 socket()->OnReadComplete(GetNextRead());
359 OrderedSocketData::OrderedSocketData(
360 MockRead* reads, size_t reads_count, MockWrite* writes, size_t writes_count)
361 : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
362 sequence_number_(0), loop_stop_stage_(0),
363 blocked_(false), weak_factory_(this) {
366 OrderedSocketData::OrderedSocketData(
367 const MockConnect& connect,
368 MockRead* reads, size_t reads_count,
369 MockWrite* writes, size_t writes_count)
370 : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
371 sequence_number_(0), loop_stop_stage_(0),
372 blocked_(false), weak_factory_(this) {
373 set_connect_data(connect);
376 void OrderedSocketData::EndLoop() {
377 // If we've already stopped the loop, don't do it again until we've advanced
378 // to the next sequence_number.
379 NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ << ": EndLoop()";
380 if (loop_stop_stage_ > 0) {
381 const MockRead& next_read = StaticSocketDataProvider::PeekRead();
382 if ((next_read.sequence_number & ~MockRead::STOPLOOP) >
383 loop_stop_stage_) {
384 NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_
385 << ": Clearing stop index";
386 loop_stop_stage_ = 0;
387 } else {
388 return;
391 // Record the sequence_number at which we stopped the loop.
392 NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_
393 << ": Posting Quit at read " << read_index();
394 loop_stop_stage_ = sequence_number_;
397 MockRead OrderedSocketData::GetNextRead() {
398 weak_factory_.InvalidateWeakPtrs();
399 blocked_ = false;
400 const MockRead& next_read = StaticSocketDataProvider::PeekRead();
401 if (next_read.sequence_number & MockRead::STOPLOOP)
402 EndLoop();
403 if ((next_read.sequence_number & ~MockRead::STOPLOOP) <=
404 sequence_number_++) {
405 NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ - 1
406 << ": Read " << read_index();
407 DumpMockReadWrite(next_read);
408 blocked_ = (next_read.result == ERR_IO_PENDING);
409 return StaticSocketDataProvider::GetNextRead();
411 NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_ - 1
412 << ": I/O Pending";
413 MockRead result = MockRead(ASYNC, ERR_IO_PENDING);
414 DumpMockReadWrite(result);
415 blocked_ = true;
416 return result;
419 MockWriteResult OrderedSocketData::OnWrite(const std::string& data) {
420 NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_
421 << ": Write " << write_index();
422 DumpMockReadWrite(PeekWrite());
423 ++sequence_number_;
424 if (blocked_) {
425 // TODO(willchan): This 100ms delay seems to work around some weirdness. We
426 // should probably fix the weirdness. One example is in SpdyStream,
427 // DoSendRequest() will return ERR_IO_PENDING, and there's a race. If the
428 // SYN_REPLY causes OnResponseReceived() to get called before
429 // SpdyStream::ReadResponseHeaders() is called, we hit a NOTREACHED().
430 base::MessageLoop::current()->PostDelayedTask(
431 FROM_HERE,
432 base::Bind(&OrderedSocketData::CompleteRead,
433 weak_factory_.GetWeakPtr()),
434 base::TimeDelta::FromMilliseconds(100));
436 return StaticSocketDataProvider::OnWrite(data);
439 void OrderedSocketData::Reset() {
440 NET_TRACE(INFO, " *** ") << "Stage "
441 << sequence_number_ << ": Reset()";
442 sequence_number_ = 0;
443 loop_stop_stage_ = 0;
444 set_socket(NULL);
445 weak_factory_.InvalidateWeakPtrs();
446 StaticSocketDataProvider::Reset();
449 void OrderedSocketData::CompleteRead() {
450 if (socket() && blocked_) {
451 NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_;
452 socket()->OnReadComplete(GetNextRead());
456 OrderedSocketData::~OrderedSocketData() {}
458 DeterministicSocketData::DeterministicSocketData(MockRead* reads,
459 size_t reads_count, MockWrite* writes, size_t writes_count)
460 : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
461 sequence_number_(0),
462 current_read_(),
463 current_write_(),
464 stopping_sequence_number_(0),
465 stopped_(false),
466 print_debug_(false),
467 is_running_(false) {
468 VerifyCorrectSequenceNumbers(reads, reads_count, writes, writes_count);
471 DeterministicSocketData::~DeterministicSocketData() {}
473 void DeterministicSocketData::Run() {
474 DCHECK(!is_running_);
475 is_running_ = true;
477 SetStopped(false);
478 int counter = 0;
479 // Continue to consume data until all data has run out, or the stopped_ flag
480 // has been set. Consuming data requires two separate operations -- running
481 // the tasks in the message loop, and explicitly invoking the read/write
482 // callbacks (simulating network I/O). We check our conditions between each,
483 // since they can change in either.
484 while ((!at_write_eof() || !at_read_eof()) && !stopped()) {
485 if (counter % 2 == 0)
486 base::RunLoop().RunUntilIdle();
487 if (counter % 2 == 1) {
488 InvokeCallbacks();
490 counter++;
492 // We're done consuming new data, but it is possible there are still some
493 // pending callbacks which we expect to complete before returning.
494 while (delegate_.get() &&
495 (delegate_->WritePending() || delegate_->ReadPending()) &&
496 !stopped()) {
497 InvokeCallbacks();
498 base::RunLoop().RunUntilIdle();
500 SetStopped(false);
501 is_running_ = false;
504 void DeterministicSocketData::RunFor(int steps) {
505 StopAfter(steps);
506 Run();
509 void DeterministicSocketData::SetStop(int seq) {
510 DCHECK_LT(sequence_number_, seq);
511 stopping_sequence_number_ = seq;
512 stopped_ = false;
515 void DeterministicSocketData::StopAfter(int seq) {
516 SetStop(sequence_number_ + seq);
519 MockRead DeterministicSocketData::GetNextRead() {
520 current_read_ = StaticSocketDataProvider::PeekRead();
522 // Synchronous read while stopped is an error
523 if (stopped() && current_read_.mode == SYNCHRONOUS) {
524 LOG(ERROR) << "Unable to perform synchronous IO while stopped";
525 return MockRead(SYNCHRONOUS, ERR_UNEXPECTED);
528 // Async read which will be called back in a future step.
529 if (sequence_number_ < current_read_.sequence_number) {
530 NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_
531 << ": I/O Pending";
532 MockRead result = MockRead(SYNCHRONOUS, ERR_IO_PENDING);
533 if (current_read_.mode == SYNCHRONOUS) {
534 LOG(ERROR) << "Unable to perform synchronous read: "
535 << current_read_.sequence_number
536 << " at stage: " << sequence_number_;
537 result = MockRead(SYNCHRONOUS, ERR_UNEXPECTED);
539 if (print_debug_)
540 DumpMockReadWrite(result);
541 return result;
544 NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_
545 << ": Read " << read_index();
546 if (print_debug_)
547 DumpMockReadWrite(current_read_);
549 // Increment the sequence number if IO is complete
550 if (current_read_.mode == SYNCHRONOUS)
551 NextStep();
553 DCHECK_NE(ERR_IO_PENDING, current_read_.result);
554 StaticSocketDataProvider::GetNextRead();
556 return current_read_;
559 MockWriteResult DeterministicSocketData::OnWrite(const std::string& data) {
560 const MockWrite& next_write = StaticSocketDataProvider::PeekWrite();
561 current_write_ = next_write;
563 // Synchronous write while stopped is an error
564 if (stopped() && next_write.mode == SYNCHRONOUS) {
565 LOG(ERROR) << "Unable to perform synchronous IO while stopped";
566 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
569 // Async write which will be called back in a future step.
570 if (sequence_number_ < next_write.sequence_number) {
571 NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_
572 << ": I/O Pending";
573 if (next_write.mode == SYNCHRONOUS) {
574 LOG(ERROR) << "Unable to perform synchronous write: "
575 << next_write.sequence_number << " at stage: " << sequence_number_;
576 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
578 } else {
579 NET_TRACE(INFO, " *** ") << "Stage " << sequence_number_
580 << ": Write " << write_index();
583 if (print_debug_)
584 DumpMockReadWrite(next_write);
586 // Move to the next step if I/O is synchronous, since the operation will
587 // complete when this method returns.
588 if (next_write.mode == SYNCHRONOUS)
589 NextStep();
591 // This is either a sync write for this step, or an async write.
592 return StaticSocketDataProvider::OnWrite(data);
595 void DeterministicSocketData::Reset() {
596 NET_TRACE(INFO, " *** ") << "Stage "
597 << sequence_number_ << ": Reset()";
598 sequence_number_ = 0;
599 StaticSocketDataProvider::Reset();
600 NOTREACHED();
603 void DeterministicSocketData::InvokeCallbacks() {
604 if (delegate_.get() && delegate_->WritePending() &&
605 (current_write().sequence_number == sequence_number())) {
606 NextStep();
607 delegate_->CompleteWrite();
608 return;
610 if (delegate_.get() && delegate_->ReadPending() &&
611 (current_read().sequence_number == sequence_number())) {
612 NextStep();
613 delegate_->CompleteRead();
614 return;
618 void DeterministicSocketData::NextStep() {
619 // Invariant: Can never move *past* the stopping step.
620 DCHECK_LT(sequence_number_, stopping_sequence_number_);
621 sequence_number_++;
622 if (sequence_number_ == stopping_sequence_number_)
623 SetStopped(true);
626 void DeterministicSocketData::VerifyCorrectSequenceNumbers(
627 MockRead* reads, size_t reads_count,
628 MockWrite* writes, size_t writes_count) {
629 size_t read = 0;
630 size_t write = 0;
631 int expected = 0;
632 while (read < reads_count || write < writes_count) {
633 // Check to see that we have a read or write at the expected
634 // state.
635 if (read < reads_count && reads[read].sequence_number == expected) {
636 ++read;
637 ++expected;
638 continue;
640 if (write < writes_count && writes[write].sequence_number == expected) {
641 ++write;
642 ++expected;
643 continue;
645 NOTREACHED() << "Missing sequence number: " << expected;
646 return;
648 DCHECK_EQ(read, reads_count);
649 DCHECK_EQ(write, writes_count);
652 MockClientSocketFactory::MockClientSocketFactory() {}
654 MockClientSocketFactory::~MockClientSocketFactory() {}
656 void MockClientSocketFactory::AddSocketDataProvider(
657 SocketDataProvider* data) {
658 mock_data_.Add(data);
661 void MockClientSocketFactory::AddSSLSocketDataProvider(
662 SSLSocketDataProvider* data) {
663 mock_ssl_data_.Add(data);
666 void MockClientSocketFactory::ResetNextMockIndexes() {
667 mock_data_.ResetNextIndex();
668 mock_ssl_data_.ResetNextIndex();
671 scoped_ptr<DatagramClientSocket>
672 MockClientSocketFactory::CreateDatagramClientSocket(
673 DatagramSocket::BindType bind_type,
674 const RandIntCallback& rand_int_cb,
675 net::NetLog* net_log,
676 const net::NetLog::Source& source) {
677 SocketDataProvider* data_provider = mock_data_.GetNext();
678 scoped_ptr<MockUDPClientSocket> socket(
679 new MockUDPClientSocket(data_provider, net_log));
680 data_provider->set_socket(socket.get());
681 if (bind_type == DatagramSocket::RANDOM_BIND)
682 socket->set_source_port(rand_int_cb.Run(1025, 65535));
683 return socket.PassAs<DatagramClientSocket>();
686 scoped_ptr<StreamSocket> MockClientSocketFactory::CreateTransportClientSocket(
687 const AddressList& addresses,
688 net::NetLog* net_log,
689 const net::NetLog::Source& source) {
690 SocketDataProvider* data_provider = mock_data_.GetNext();
691 scoped_ptr<MockTCPClientSocket> socket(
692 new MockTCPClientSocket(addresses, net_log, data_provider));
693 data_provider->set_socket(socket.get());
694 return socket.PassAs<StreamSocket>();
697 scoped_ptr<SSLClientSocket> MockClientSocketFactory::CreateSSLClientSocket(
698 scoped_ptr<ClientSocketHandle> transport_socket,
699 const HostPortPair& host_and_port,
700 const SSLConfig& ssl_config,
701 const SSLClientSocketContext& context) {
702 return scoped_ptr<SSLClientSocket>(
703 new MockSSLClientSocket(transport_socket.Pass(),
704 host_and_port, ssl_config,
705 mock_ssl_data_.GetNext()));
708 void MockClientSocketFactory::ClearSSLSessionCache() {
711 const char MockClientSocket::kTlsUnique[] = "MOCK_TLSUNIQ";
713 MockClientSocket::MockClientSocket(const BoundNetLog& net_log)
714 : connected_(false),
715 net_log_(net_log),
716 weak_factory_(this) {
717 IPAddressNumber ip;
718 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
719 peer_addr_ = IPEndPoint(ip, 0);
722 int MockClientSocket::SetReceiveBufferSize(int32 size) {
723 return OK;
726 int MockClientSocket::SetSendBufferSize(int32 size) {
727 return OK;
730 void MockClientSocket::Disconnect() {
731 connected_ = false;
734 bool MockClientSocket::IsConnected() const {
735 return connected_;
738 bool MockClientSocket::IsConnectedAndIdle() const {
739 return connected_;
742 int MockClientSocket::GetPeerAddress(IPEndPoint* address) const {
743 if (!IsConnected())
744 return ERR_SOCKET_NOT_CONNECTED;
745 *address = peer_addr_;
746 return OK;
749 int MockClientSocket::GetLocalAddress(IPEndPoint* address) const {
750 IPAddressNumber ip;
751 bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip);
752 CHECK(rv);
753 *address = IPEndPoint(ip, 123);
754 return OK;
757 const BoundNetLog& MockClientSocket::NetLog() const {
758 return net_log_;
761 void MockClientSocket::GetSSLCertRequestInfo(
762 SSLCertRequestInfo* cert_request_info) {
765 int MockClientSocket::ExportKeyingMaterial(const base::StringPiece& label,
766 bool has_context,
767 const base::StringPiece& context,
768 unsigned char* out,
769 unsigned int outlen) {
770 memset(out, 'A', outlen);
771 return OK;
774 int MockClientSocket::GetTLSUniqueChannelBinding(std::string* out) {
775 out->assign(MockClientSocket::kTlsUnique);
776 return OK;
779 ServerBoundCertService* MockClientSocket::GetServerBoundCertService() const {
780 NOTREACHED();
781 return NULL;
784 SSLClientSocket::NextProtoStatus
785 MockClientSocket::GetNextProto(std::string* proto, std::string* server_protos) {
786 proto->clear();
787 server_protos->clear();
788 return SSLClientSocket::kNextProtoUnsupported;
791 scoped_refptr<X509Certificate>
792 MockClientSocket::GetUnverifiedServerCertificateChain() const {
793 NOTREACHED();
794 return NULL;
797 MockClientSocket::~MockClientSocket() {}
799 void MockClientSocket::RunCallbackAsync(const CompletionCallback& callback,
800 int result) {
801 base::MessageLoop::current()->PostTask(
802 FROM_HERE,
803 base::Bind(&MockClientSocket::RunCallback,
804 weak_factory_.GetWeakPtr(),
805 callback,
806 result));
809 void MockClientSocket::RunCallback(const net::CompletionCallback& callback,
810 int result) {
811 if (!callback.is_null())
812 callback.Run(result);
815 MockTCPClientSocket::MockTCPClientSocket(const AddressList& addresses,
816 net::NetLog* net_log,
817 SocketDataProvider* data)
818 : MockClientSocket(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)),
819 addresses_(addresses),
820 data_(data),
821 read_offset_(0),
822 read_data_(SYNCHRONOUS, ERR_UNEXPECTED),
823 need_read_data_(true),
824 peer_closed_connection_(false),
825 pending_buf_(NULL),
826 pending_buf_len_(0),
827 was_used_to_convey_data_(false) {
828 DCHECK(data_);
829 peer_addr_ = data->connect_data().peer_addr;
830 data_->Reset();
833 MockTCPClientSocket::~MockTCPClientSocket() {}
835 int MockTCPClientSocket::Read(IOBuffer* buf, int buf_len,
836 const CompletionCallback& callback) {
837 if (!connected_)
838 return ERR_UNEXPECTED;
840 // If the buffer is already in use, a read is already in progress!
841 DCHECK(pending_buf_ == NULL);
843 // Store our async IO data.
844 pending_buf_ = buf;
845 pending_buf_len_ = buf_len;
846 pending_callback_ = callback;
848 if (need_read_data_) {
849 read_data_ = data_->GetNextRead();
850 if (read_data_.result == ERR_CONNECTION_CLOSED) {
851 // This MockRead is just a marker to instruct us to set
852 // peer_closed_connection_.
853 peer_closed_connection_ = true;
855 if (read_data_.result == ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ) {
856 // This MockRead is just a marker to instruct us to set
857 // peer_closed_connection_. Skip it and get the next one.
858 read_data_ = data_->GetNextRead();
859 peer_closed_connection_ = true;
861 // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility
862 // to complete the async IO manually later (via OnReadComplete).
863 if (read_data_.result == ERR_IO_PENDING) {
864 // We need to be using async IO in this case.
865 DCHECK(!callback.is_null());
866 return ERR_IO_PENDING;
868 need_read_data_ = false;
871 return CompleteRead();
874 int MockTCPClientSocket::Write(IOBuffer* buf, int buf_len,
875 const CompletionCallback& callback) {
876 DCHECK(buf);
877 DCHECK_GT(buf_len, 0);
879 if (!connected_)
880 return ERR_UNEXPECTED;
882 std::string data(buf->data(), buf_len);
883 MockWriteResult write_result = data_->OnWrite(data);
885 was_used_to_convey_data_ = true;
887 if (write_result.mode == ASYNC) {
888 RunCallbackAsync(callback, write_result.result);
889 return ERR_IO_PENDING;
892 return write_result.result;
895 int MockTCPClientSocket::Connect(const CompletionCallback& callback) {
896 if (connected_)
897 return OK;
898 connected_ = true;
899 peer_closed_connection_ = false;
900 if (data_->connect_data().mode == ASYNC) {
901 if (data_->connect_data().result == ERR_IO_PENDING)
902 pending_callback_ = callback;
903 else
904 RunCallbackAsync(callback, data_->connect_data().result);
905 return ERR_IO_PENDING;
907 return data_->connect_data().result;
910 void MockTCPClientSocket::Disconnect() {
911 MockClientSocket::Disconnect();
912 pending_callback_.Reset();
915 bool MockTCPClientSocket::IsConnected() const {
916 return connected_ && !peer_closed_connection_;
919 bool MockTCPClientSocket::IsConnectedAndIdle() const {
920 return IsConnected();
923 int MockTCPClientSocket::GetPeerAddress(IPEndPoint* address) const {
924 if (addresses_.empty())
925 return MockClientSocket::GetPeerAddress(address);
927 *address = addresses_[0];
928 return OK;
931 bool MockTCPClientSocket::WasEverUsed() const {
932 return was_used_to_convey_data_;
935 bool MockTCPClientSocket::UsingTCPFastOpen() const {
936 return false;
939 bool MockTCPClientSocket::WasNpnNegotiated() const {
940 return false;
943 bool MockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
944 return false;
947 void MockTCPClientSocket::OnReadComplete(const MockRead& data) {
948 // There must be a read pending.
949 DCHECK(pending_buf_);
950 // You can't complete a read with another ERR_IO_PENDING status code.
951 DCHECK_NE(ERR_IO_PENDING, data.result);
952 // Since we've been waiting for data, need_read_data_ should be true.
953 DCHECK(need_read_data_);
955 read_data_ = data;
956 need_read_data_ = false;
958 // The caller is simulating that this IO completes right now. Don't
959 // let CompleteRead() schedule a callback.
960 read_data_.mode = SYNCHRONOUS;
962 CompletionCallback callback = pending_callback_;
963 int rv = CompleteRead();
964 RunCallback(callback, rv);
967 void MockTCPClientSocket::OnConnectComplete(const MockConnect& data) {
968 CompletionCallback callback = pending_callback_;
969 RunCallback(callback, data.result);
972 int MockTCPClientSocket::CompleteRead() {
973 DCHECK(pending_buf_);
974 DCHECK(pending_buf_len_ > 0);
976 was_used_to_convey_data_ = true;
978 // Save the pending async IO data and reset our |pending_| state.
979 scoped_refptr<IOBuffer> buf = pending_buf_;
980 int buf_len = pending_buf_len_;
981 CompletionCallback callback = pending_callback_;
982 pending_buf_ = NULL;
983 pending_buf_len_ = 0;
984 pending_callback_.Reset();
986 int result = read_data_.result;
987 DCHECK(result != ERR_IO_PENDING);
989 if (read_data_.data) {
990 if (read_data_.data_len - read_offset_ > 0) {
991 result = std::min(buf_len, read_data_.data_len - read_offset_);
992 memcpy(buf->data(), read_data_.data + read_offset_, result);
993 read_offset_ += result;
994 if (read_offset_ == read_data_.data_len) {
995 need_read_data_ = true;
996 read_offset_ = 0;
998 } else {
999 result = 0; // EOF
1003 if (read_data_.mode == ASYNC) {
1004 DCHECK(!callback.is_null());
1005 RunCallbackAsync(callback, result);
1006 return ERR_IO_PENDING;
1008 return result;
1011 DeterministicSocketHelper::DeterministicSocketHelper(
1012 net::NetLog* net_log,
1013 DeterministicSocketData* data)
1014 : write_pending_(false),
1015 write_result_(0),
1016 read_data_(),
1017 read_buf_(NULL),
1018 read_buf_len_(0),
1019 read_pending_(false),
1020 data_(data),
1021 was_used_to_convey_data_(false),
1022 peer_closed_connection_(false),
1023 net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)) {
1026 DeterministicSocketHelper::~DeterministicSocketHelper() {}
1028 void DeterministicSocketHelper::CompleteWrite() {
1029 was_used_to_convey_data_ = true;
1030 write_pending_ = false;
1031 write_callback_.Run(write_result_);
1034 int DeterministicSocketHelper::CompleteRead() {
1035 DCHECK_GT(read_buf_len_, 0);
1036 DCHECK_LE(read_data_.data_len, read_buf_len_);
1037 DCHECK(read_buf_);
1039 was_used_to_convey_data_ = true;
1041 if (read_data_.result == ERR_IO_PENDING)
1042 read_data_ = data_->GetNextRead();
1043 DCHECK_NE(ERR_IO_PENDING, read_data_.result);
1044 // If read_data_.mode is ASYNC, we do not need to wait, since this is already
1045 // the callback. Therefore we don't even bother to check it.
1046 int result = read_data_.result;
1048 if (read_data_.data_len > 0) {
1049 DCHECK(read_data_.data);
1050 result = std::min(read_buf_len_, read_data_.data_len);
1051 memcpy(read_buf_->data(), read_data_.data, result);
1054 if (read_pending_) {
1055 read_pending_ = false;
1056 read_callback_.Run(result);
1059 return result;
1062 int DeterministicSocketHelper::Write(
1063 IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
1064 DCHECK(buf);
1065 DCHECK_GT(buf_len, 0);
1067 std::string data(buf->data(), buf_len);
1068 MockWriteResult write_result = data_->OnWrite(data);
1070 if (write_result.mode == ASYNC) {
1071 write_callback_ = callback;
1072 write_result_ = write_result.result;
1073 DCHECK(!write_callback_.is_null());
1074 write_pending_ = true;
1075 return ERR_IO_PENDING;
1078 was_used_to_convey_data_ = true;
1079 write_pending_ = false;
1080 return write_result.result;
1083 int DeterministicSocketHelper::Read(
1084 IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
1086 read_data_ = data_->GetNextRead();
1087 // The buffer should always be big enough to contain all the MockRead data. To
1088 // use small buffers, split the data into multiple MockReads.
1089 DCHECK_LE(read_data_.data_len, buf_len);
1091 if (read_data_.result == ERR_CONNECTION_CLOSED) {
1092 // This MockRead is just a marker to instruct us to set
1093 // peer_closed_connection_.
1094 peer_closed_connection_ = true;
1096 if (read_data_.result == ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ) {
1097 // This MockRead is just a marker to instruct us to set
1098 // peer_closed_connection_. Skip it and get the next one.
1099 read_data_ = data_->GetNextRead();
1100 peer_closed_connection_ = true;
1103 read_buf_ = buf;
1104 read_buf_len_ = buf_len;
1105 read_callback_ = callback;
1107 if (read_data_.mode == ASYNC || (read_data_.result == ERR_IO_PENDING)) {
1108 read_pending_ = true;
1109 DCHECK(!read_callback_.is_null());
1110 return ERR_IO_PENDING;
1113 was_used_to_convey_data_ = true;
1114 return CompleteRead();
1117 DeterministicMockUDPClientSocket::DeterministicMockUDPClientSocket(
1118 net::NetLog* net_log,
1119 DeterministicSocketData* data)
1120 : connected_(false),
1121 helper_(net_log, data),
1122 source_port_(123) {
1125 DeterministicMockUDPClientSocket::~DeterministicMockUDPClientSocket() {}
1127 bool DeterministicMockUDPClientSocket::WritePending() const {
1128 return helper_.write_pending();
1131 bool DeterministicMockUDPClientSocket::ReadPending() const {
1132 return helper_.read_pending();
1135 void DeterministicMockUDPClientSocket::CompleteWrite() {
1136 helper_.CompleteWrite();
1139 int DeterministicMockUDPClientSocket::CompleteRead() {
1140 return helper_.CompleteRead();
1143 int DeterministicMockUDPClientSocket::Connect(const IPEndPoint& address) {
1144 if (connected_)
1145 return OK;
1146 connected_ = true;
1147 peer_address_ = address;
1148 return helper_.data()->connect_data().result;
1151 int DeterministicMockUDPClientSocket::Write(
1152 IOBuffer* buf,
1153 int buf_len,
1154 const CompletionCallback& callback) {
1155 if (!connected_)
1156 return ERR_UNEXPECTED;
1158 return helper_.Write(buf, buf_len, callback);
1161 int DeterministicMockUDPClientSocket::Read(
1162 IOBuffer* buf,
1163 int buf_len,
1164 const CompletionCallback& callback) {
1165 if (!connected_)
1166 return ERR_UNEXPECTED;
1168 return helper_.Read(buf, buf_len, callback);
1171 int DeterministicMockUDPClientSocket::SetReceiveBufferSize(int32 size) {
1172 return OK;
1175 int DeterministicMockUDPClientSocket::SetSendBufferSize(int32 size) {
1176 return OK;
1179 void DeterministicMockUDPClientSocket::Close() {
1180 connected_ = false;
1183 int DeterministicMockUDPClientSocket::GetPeerAddress(
1184 IPEndPoint* address) const {
1185 *address = peer_address_;
1186 return OK;
1189 int DeterministicMockUDPClientSocket::GetLocalAddress(
1190 IPEndPoint* address) const {
1191 IPAddressNumber ip;
1192 bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip);
1193 CHECK(rv);
1194 *address = IPEndPoint(ip, source_port_);
1195 return OK;
1198 const BoundNetLog& DeterministicMockUDPClientSocket::NetLog() const {
1199 return helper_.net_log();
1202 void DeterministicMockUDPClientSocket::OnReadComplete(const MockRead& data) {}
1204 void DeterministicMockUDPClientSocket::OnConnectComplete(
1205 const MockConnect& data) {
1206 NOTIMPLEMENTED();
1209 DeterministicMockTCPClientSocket::DeterministicMockTCPClientSocket(
1210 net::NetLog* net_log,
1211 DeterministicSocketData* data)
1212 : MockClientSocket(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)),
1213 helper_(net_log, data) {
1214 peer_addr_ = data->connect_data().peer_addr;
1217 DeterministicMockTCPClientSocket::~DeterministicMockTCPClientSocket() {}
1219 bool DeterministicMockTCPClientSocket::WritePending() const {
1220 return helper_.write_pending();
1223 bool DeterministicMockTCPClientSocket::ReadPending() const {
1224 return helper_.read_pending();
1227 void DeterministicMockTCPClientSocket::CompleteWrite() {
1228 helper_.CompleteWrite();
1231 int DeterministicMockTCPClientSocket::CompleteRead() {
1232 return helper_.CompleteRead();
1235 int DeterministicMockTCPClientSocket::Write(
1236 IOBuffer* buf,
1237 int buf_len,
1238 const CompletionCallback& callback) {
1239 if (!connected_)
1240 return ERR_UNEXPECTED;
1242 return helper_.Write(buf, buf_len, callback);
1245 int DeterministicMockTCPClientSocket::Read(
1246 IOBuffer* buf,
1247 int buf_len,
1248 const CompletionCallback& callback) {
1249 if (!connected_)
1250 return ERR_UNEXPECTED;
1252 return helper_.Read(buf, buf_len, callback);
1255 // TODO(erikchen): Support connect sequencing.
1256 int DeterministicMockTCPClientSocket::Connect(
1257 const CompletionCallback& callback) {
1258 if (connected_)
1259 return OK;
1260 connected_ = true;
1261 if (helper_.data()->connect_data().mode == ASYNC) {
1262 RunCallbackAsync(callback, helper_.data()->connect_data().result);
1263 return ERR_IO_PENDING;
1265 return helper_.data()->connect_data().result;
1268 void DeterministicMockTCPClientSocket::Disconnect() {
1269 MockClientSocket::Disconnect();
1272 bool DeterministicMockTCPClientSocket::IsConnected() const {
1273 return connected_ && !helper_.peer_closed_connection();
1276 bool DeterministicMockTCPClientSocket::IsConnectedAndIdle() const {
1277 return IsConnected();
1280 bool DeterministicMockTCPClientSocket::WasEverUsed() const {
1281 return helper_.was_used_to_convey_data();
1284 bool DeterministicMockTCPClientSocket::UsingTCPFastOpen() const {
1285 return false;
1288 bool DeterministicMockTCPClientSocket::WasNpnNegotiated() const {
1289 return false;
1292 bool DeterministicMockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
1293 return false;
1296 void DeterministicMockTCPClientSocket::OnReadComplete(const MockRead& data) {}
1298 void DeterministicMockTCPClientSocket::OnConnectComplete(
1299 const MockConnect& data) {}
1301 // static
1302 void MockSSLClientSocket::ConnectCallback(
1303 MockSSLClientSocket* ssl_client_socket,
1304 const CompletionCallback& callback,
1305 int rv) {
1306 if (rv == OK)
1307 ssl_client_socket->connected_ = true;
1308 callback.Run(rv);
1311 MockSSLClientSocket::MockSSLClientSocket(
1312 scoped_ptr<ClientSocketHandle> transport_socket,
1313 const HostPortPair& host_port_pair,
1314 const SSLConfig& ssl_config,
1315 SSLSocketDataProvider* data)
1316 : MockClientSocket(
1317 // Have to use the right BoundNetLog for LoadTimingInfo regression
1318 // tests.
1319 transport_socket->socket()->NetLog()),
1320 transport_(transport_socket.Pass()),
1321 data_(data),
1322 is_npn_state_set_(false),
1323 new_npn_value_(false),
1324 is_protocol_negotiated_set_(false),
1325 protocol_negotiated_(kProtoUnknown) {
1326 DCHECK(data_);
1327 peer_addr_ = data->connect.peer_addr;
1330 MockSSLClientSocket::~MockSSLClientSocket() {
1331 Disconnect();
1334 int MockSSLClientSocket::Read(IOBuffer* buf, int buf_len,
1335 const CompletionCallback& callback) {
1336 return transport_->socket()->Read(buf, buf_len, callback);
1339 int MockSSLClientSocket::Write(IOBuffer* buf, int buf_len,
1340 const CompletionCallback& callback) {
1341 return transport_->socket()->Write(buf, buf_len, callback);
1344 int MockSSLClientSocket::Connect(const CompletionCallback& callback) {
1345 int rv = transport_->socket()->Connect(
1346 base::Bind(&ConnectCallback, base::Unretained(this), callback));
1347 if (rv == OK) {
1348 if (data_->connect.result == OK)
1349 connected_ = true;
1350 if (data_->connect.mode == ASYNC) {
1351 RunCallbackAsync(callback, data_->connect.result);
1352 return ERR_IO_PENDING;
1354 return data_->connect.result;
1356 return rv;
1359 void MockSSLClientSocket::Disconnect() {
1360 MockClientSocket::Disconnect();
1361 if (transport_->socket() != NULL)
1362 transport_->socket()->Disconnect();
1365 bool MockSSLClientSocket::IsConnected() const {
1366 return transport_->socket()->IsConnected();
1369 bool MockSSLClientSocket::WasEverUsed() const {
1370 return transport_->socket()->WasEverUsed();
1373 bool MockSSLClientSocket::UsingTCPFastOpen() const {
1374 return transport_->socket()->UsingTCPFastOpen();
1377 int MockSSLClientSocket::GetPeerAddress(IPEndPoint* address) const {
1378 return transport_->socket()->GetPeerAddress(address);
1381 bool MockSSLClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
1382 ssl_info->Reset();
1383 ssl_info->cert = data_->cert;
1384 ssl_info->client_cert_sent = data_->client_cert_sent;
1385 ssl_info->channel_id_sent = data_->channel_id_sent;
1386 ssl_info->connection_status = data_->connection_status;
1387 return true;
1390 void MockSSLClientSocket::GetSSLCertRequestInfo(
1391 SSLCertRequestInfo* cert_request_info) {
1392 DCHECK(cert_request_info);
1393 if (data_->cert_request_info) {
1394 cert_request_info->host_and_port =
1395 data_->cert_request_info->host_and_port;
1396 cert_request_info->client_certs = data_->cert_request_info->client_certs;
1397 } else {
1398 cert_request_info->Reset();
1402 SSLClientSocket::NextProtoStatus MockSSLClientSocket::GetNextProto(
1403 std::string* proto, std::string* server_protos) {
1404 *proto = data_->next_proto;
1405 *server_protos = data_->server_protos;
1406 return data_->next_proto_status;
1409 bool MockSSLClientSocket::set_was_npn_negotiated(bool negotiated) {
1410 is_npn_state_set_ = true;
1411 return new_npn_value_ = negotiated;
1414 bool MockSSLClientSocket::WasNpnNegotiated() const {
1415 if (is_npn_state_set_)
1416 return new_npn_value_;
1417 return data_->was_npn_negotiated;
1420 NextProto MockSSLClientSocket::GetNegotiatedProtocol() const {
1421 if (is_protocol_negotiated_set_)
1422 return protocol_negotiated_;
1423 return data_->protocol_negotiated;
1426 void MockSSLClientSocket::set_protocol_negotiated(
1427 NextProto protocol_negotiated) {
1428 is_protocol_negotiated_set_ = true;
1429 protocol_negotiated_ = protocol_negotiated;
1432 bool MockSSLClientSocket::WasChannelIDSent() const {
1433 return data_->channel_id_sent;
1436 void MockSSLClientSocket::set_channel_id_sent(bool channel_id_sent) {
1437 data_->channel_id_sent = channel_id_sent;
1440 ServerBoundCertService* MockSSLClientSocket::GetServerBoundCertService() const {
1441 return data_->server_bound_cert_service;
1444 void MockSSLClientSocket::OnReadComplete(const MockRead& data) {
1445 NOTIMPLEMENTED();
1448 void MockSSLClientSocket::OnConnectComplete(const MockConnect& data) {
1449 NOTIMPLEMENTED();
1452 MockUDPClientSocket::MockUDPClientSocket(SocketDataProvider* data,
1453 net::NetLog* net_log)
1454 : connected_(false),
1455 data_(data),
1456 read_offset_(0),
1457 read_data_(SYNCHRONOUS, ERR_UNEXPECTED),
1458 need_read_data_(true),
1459 source_port_(123),
1460 pending_buf_(NULL),
1461 pending_buf_len_(0),
1462 net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)),
1463 weak_factory_(this) {
1464 DCHECK(data_);
1465 data_->Reset();
1466 peer_addr_ = data->connect_data().peer_addr;
1469 MockUDPClientSocket::~MockUDPClientSocket() {}
1471 int MockUDPClientSocket::Read(IOBuffer* buf,
1472 int buf_len,
1473 const CompletionCallback& callback) {
1474 if (!connected_)
1475 return ERR_UNEXPECTED;
1477 // If the buffer is already in use, a read is already in progress!
1478 DCHECK(pending_buf_ == NULL);
1480 // Store our async IO data.
1481 pending_buf_ = buf;
1482 pending_buf_len_ = buf_len;
1483 pending_callback_ = callback;
1485 if (need_read_data_) {
1486 read_data_ = data_->GetNextRead();
1487 // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility
1488 // to complete the async IO manually later (via OnReadComplete).
1489 if (read_data_.result == ERR_IO_PENDING) {
1490 // We need to be using async IO in this case.
1491 DCHECK(!callback.is_null());
1492 return ERR_IO_PENDING;
1494 need_read_data_ = false;
1497 return CompleteRead();
1500 int MockUDPClientSocket::Write(IOBuffer* buf, int buf_len,
1501 const CompletionCallback& callback) {
1502 DCHECK(buf);
1503 DCHECK_GT(buf_len, 0);
1505 if (!connected_)
1506 return ERR_UNEXPECTED;
1508 std::string data(buf->data(), buf_len);
1509 MockWriteResult write_result = data_->OnWrite(data);
1511 if (write_result.mode == ASYNC) {
1512 RunCallbackAsync(callback, write_result.result);
1513 return ERR_IO_PENDING;
1515 return write_result.result;
1518 int MockUDPClientSocket::SetReceiveBufferSize(int32 size) {
1519 return OK;
1522 int MockUDPClientSocket::SetSendBufferSize(int32 size) {
1523 return OK;
1526 void MockUDPClientSocket::Close() {
1527 connected_ = false;
1530 int MockUDPClientSocket::GetPeerAddress(IPEndPoint* address) const {
1531 *address = peer_addr_;
1532 return OK;
1535 int MockUDPClientSocket::GetLocalAddress(IPEndPoint* address) const {
1536 IPAddressNumber ip;
1537 bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip);
1538 CHECK(rv);
1539 *address = IPEndPoint(ip, source_port_);
1540 return OK;
1543 const BoundNetLog& MockUDPClientSocket::NetLog() const {
1544 return net_log_;
1547 int MockUDPClientSocket::Connect(const IPEndPoint& address) {
1548 connected_ = true;
1549 peer_addr_ = address;
1550 return data_->connect_data().result;
1553 void MockUDPClientSocket::OnReadComplete(const MockRead& data) {
1554 // There must be a read pending.
1555 DCHECK(pending_buf_);
1556 // You can't complete a read with another ERR_IO_PENDING status code.
1557 DCHECK_NE(ERR_IO_PENDING, data.result);
1558 // Since we've been waiting for data, need_read_data_ should be true.
1559 DCHECK(need_read_data_);
1561 read_data_ = data;
1562 need_read_data_ = false;
1564 // The caller is simulating that this IO completes right now. Don't
1565 // let CompleteRead() schedule a callback.
1566 read_data_.mode = SYNCHRONOUS;
1568 net::CompletionCallback callback = pending_callback_;
1569 int rv = CompleteRead();
1570 RunCallback(callback, rv);
1573 void MockUDPClientSocket::OnConnectComplete(const MockConnect& data) {
1574 NOTIMPLEMENTED();
1577 int MockUDPClientSocket::CompleteRead() {
1578 DCHECK(pending_buf_);
1579 DCHECK(pending_buf_len_ > 0);
1581 // Save the pending async IO data and reset our |pending_| state.
1582 scoped_refptr<IOBuffer> buf = pending_buf_;
1583 int buf_len = pending_buf_len_;
1584 CompletionCallback callback = pending_callback_;
1585 pending_buf_ = NULL;
1586 pending_buf_len_ = 0;
1587 pending_callback_.Reset();
1589 int result = read_data_.result;
1590 DCHECK(result != ERR_IO_PENDING);
1592 if (read_data_.data) {
1593 if (read_data_.data_len - read_offset_ > 0) {
1594 result = std::min(buf_len, read_data_.data_len - read_offset_);
1595 memcpy(buf->data(), read_data_.data + read_offset_, result);
1596 read_offset_ += result;
1597 if (read_offset_ == read_data_.data_len) {
1598 need_read_data_ = true;
1599 read_offset_ = 0;
1601 } else {
1602 result = 0; // EOF
1606 if (read_data_.mode == ASYNC) {
1607 DCHECK(!callback.is_null());
1608 RunCallbackAsync(callback, result);
1609 return ERR_IO_PENDING;
1611 return result;
1614 void MockUDPClientSocket::RunCallbackAsync(const CompletionCallback& callback,
1615 int result) {
1616 base::MessageLoop::current()->PostTask(
1617 FROM_HERE,
1618 base::Bind(&MockUDPClientSocket::RunCallback,
1619 weak_factory_.GetWeakPtr(),
1620 callback,
1621 result));
1624 void MockUDPClientSocket::RunCallback(const CompletionCallback& callback,
1625 int result) {
1626 if (!callback.is_null())
1627 callback.Run(result);
1630 TestSocketRequest::TestSocketRequest(
1631 std::vector<TestSocketRequest*>* request_order, size_t* completion_count)
1632 : request_order_(request_order),
1633 completion_count_(completion_count),
1634 callback_(base::Bind(&TestSocketRequest::OnComplete,
1635 base::Unretained(this))) {
1636 DCHECK(request_order);
1637 DCHECK(completion_count);
1640 TestSocketRequest::~TestSocketRequest() {
1643 void TestSocketRequest::OnComplete(int result) {
1644 SetResult(result);
1645 (*completion_count_)++;
1646 request_order_->push_back(this);
1649 // static
1650 const int ClientSocketPoolTest::kIndexOutOfBounds = -1;
1652 // static
1653 const int ClientSocketPoolTest::kRequestNotFound = -2;
1655 ClientSocketPoolTest::ClientSocketPoolTest() : completion_count_(0) {}
1656 ClientSocketPoolTest::~ClientSocketPoolTest() {}
1658 int ClientSocketPoolTest::GetOrderOfRequest(size_t index) const {
1659 index--;
1660 if (index >= requests_.size())
1661 return kIndexOutOfBounds;
1663 for (size_t i = 0; i < request_order_.size(); i++)
1664 if (requests_[index] == request_order_[i])
1665 return i + 1;
1667 return kRequestNotFound;
1670 bool ClientSocketPoolTest::ReleaseOneConnection(KeepAlive keep_alive) {
1671 ScopedVector<TestSocketRequest>::iterator i;
1672 for (i = requests_.begin(); i != requests_.end(); ++i) {
1673 if ((*i)->handle()->is_initialized()) {
1674 if (keep_alive == NO_KEEP_ALIVE)
1675 (*i)->handle()->socket()->Disconnect();
1676 (*i)->handle()->Reset();
1677 base::RunLoop().RunUntilIdle();
1678 return true;
1681 return false;
1684 void ClientSocketPoolTest::ReleaseAllConnections(KeepAlive keep_alive) {
1685 bool released_one;
1686 do {
1687 released_one = ReleaseOneConnection(keep_alive);
1688 } while (released_one);
1691 MockTransportClientSocketPool::MockConnectJob::MockConnectJob(
1692 scoped_ptr<StreamSocket> socket,
1693 ClientSocketHandle* handle,
1694 const CompletionCallback& callback)
1695 : socket_(socket.Pass()),
1696 handle_(handle),
1697 user_callback_(callback) {
1700 MockTransportClientSocketPool::MockConnectJob::~MockConnectJob() {}
1702 int MockTransportClientSocketPool::MockConnectJob::Connect() {
1703 int rv = socket_->Connect(base::Bind(&MockConnectJob::OnConnect,
1704 base::Unretained(this)));
1705 if (rv == OK) {
1706 user_callback_.Reset();
1707 OnConnect(OK);
1709 return rv;
1712 bool MockTransportClientSocketPool::MockConnectJob::CancelHandle(
1713 const ClientSocketHandle* handle) {
1714 if (handle != handle_)
1715 return false;
1716 socket_.reset();
1717 handle_ = NULL;
1718 user_callback_.Reset();
1719 return true;
1722 void MockTransportClientSocketPool::MockConnectJob::OnConnect(int rv) {
1723 if (!socket_.get())
1724 return;
1725 if (rv == OK) {
1726 handle_->SetSocket(socket_.Pass());
1728 // Needed for socket pool tests that layer other sockets on top of mock
1729 // sockets.
1730 LoadTimingInfo::ConnectTiming connect_timing;
1731 base::TimeTicks now = base::TimeTicks::Now();
1732 connect_timing.dns_start = now;
1733 connect_timing.dns_end = now;
1734 connect_timing.connect_start = now;
1735 connect_timing.connect_end = now;
1736 handle_->set_connect_timing(connect_timing);
1737 } else {
1738 socket_.reset();
1741 handle_ = NULL;
1743 if (!user_callback_.is_null()) {
1744 CompletionCallback callback = user_callback_;
1745 user_callback_.Reset();
1746 callback.Run(rv);
1750 MockTransportClientSocketPool::MockTransportClientSocketPool(
1751 int max_sockets,
1752 int max_sockets_per_group,
1753 ClientSocketPoolHistograms* histograms,
1754 ClientSocketFactory* socket_factory)
1755 : TransportClientSocketPool(max_sockets, max_sockets_per_group, histograms,
1756 NULL, NULL, NULL),
1757 client_socket_factory_(socket_factory),
1758 last_request_priority_(DEFAULT_PRIORITY),
1759 release_count_(0),
1760 cancel_count_(0) {
1763 MockTransportClientSocketPool::~MockTransportClientSocketPool() {}
1765 int MockTransportClientSocketPool::RequestSocket(
1766 const std::string& group_name, const void* socket_params,
1767 RequestPriority priority, ClientSocketHandle* handle,
1768 const CompletionCallback& callback, const BoundNetLog& net_log) {
1769 last_request_priority_ = priority;
1770 scoped_ptr<StreamSocket> socket =
1771 client_socket_factory_->CreateTransportClientSocket(
1772 AddressList(), net_log.net_log(), net::NetLog::Source());
1773 MockConnectJob* job = new MockConnectJob(socket.Pass(), handle, callback);
1774 job_list_.push_back(job);
1775 handle->set_pool_id(1);
1776 return job->Connect();
1779 void MockTransportClientSocketPool::CancelRequest(const std::string& group_name,
1780 ClientSocketHandle* handle) {
1781 std::vector<MockConnectJob*>::iterator i;
1782 for (i = job_list_.begin(); i != job_list_.end(); ++i) {
1783 if ((*i)->CancelHandle(handle)) {
1784 cancel_count_++;
1785 break;
1790 void MockTransportClientSocketPool::ReleaseSocket(
1791 const std::string& group_name,
1792 scoped_ptr<StreamSocket> socket,
1793 int id) {
1794 EXPECT_EQ(1, id);
1795 release_count_++;
1798 DeterministicMockClientSocketFactory::DeterministicMockClientSocketFactory() {}
1800 DeterministicMockClientSocketFactory::~DeterministicMockClientSocketFactory() {}
1802 void DeterministicMockClientSocketFactory::AddSocketDataProvider(
1803 DeterministicSocketData* data) {
1804 mock_data_.Add(data);
1807 void DeterministicMockClientSocketFactory::AddSSLSocketDataProvider(
1808 SSLSocketDataProvider* data) {
1809 mock_ssl_data_.Add(data);
1812 void DeterministicMockClientSocketFactory::ResetNextMockIndexes() {
1813 mock_data_.ResetNextIndex();
1814 mock_ssl_data_.ResetNextIndex();
1817 MockSSLClientSocket* DeterministicMockClientSocketFactory::
1818 GetMockSSLClientSocket(size_t index) const {
1819 DCHECK_LT(index, ssl_client_sockets_.size());
1820 return ssl_client_sockets_[index];
1823 scoped_ptr<DatagramClientSocket>
1824 DeterministicMockClientSocketFactory::CreateDatagramClientSocket(
1825 DatagramSocket::BindType bind_type,
1826 const RandIntCallback& rand_int_cb,
1827 net::NetLog* net_log,
1828 const NetLog::Source& source) {
1829 DeterministicSocketData* data_provider = mock_data().GetNext();
1830 scoped_ptr<DeterministicMockUDPClientSocket> socket(
1831 new DeterministicMockUDPClientSocket(net_log, data_provider));
1832 data_provider->set_delegate(socket->AsWeakPtr());
1833 udp_client_sockets().push_back(socket.get());
1834 if (bind_type == DatagramSocket::RANDOM_BIND)
1835 socket->set_source_port(rand_int_cb.Run(1025, 65535));
1836 return socket.PassAs<DatagramClientSocket>();
1839 scoped_ptr<StreamSocket>
1840 DeterministicMockClientSocketFactory::CreateTransportClientSocket(
1841 const AddressList& addresses,
1842 net::NetLog* net_log,
1843 const net::NetLog::Source& source) {
1844 DeterministicSocketData* data_provider = mock_data().GetNext();
1845 scoped_ptr<DeterministicMockTCPClientSocket> socket(
1846 new DeterministicMockTCPClientSocket(net_log, data_provider));
1847 data_provider->set_delegate(socket->AsWeakPtr());
1848 tcp_client_sockets().push_back(socket.get());
1849 return socket.PassAs<StreamSocket>();
1852 scoped_ptr<SSLClientSocket>
1853 DeterministicMockClientSocketFactory::CreateSSLClientSocket(
1854 scoped_ptr<ClientSocketHandle> transport_socket,
1855 const HostPortPair& host_and_port,
1856 const SSLConfig& ssl_config,
1857 const SSLClientSocketContext& context) {
1858 scoped_ptr<MockSSLClientSocket> socket(
1859 new MockSSLClientSocket(transport_socket.Pass(),
1860 host_and_port, ssl_config,
1861 mock_ssl_data_.GetNext()));
1862 ssl_client_sockets_.push_back(socket.get());
1863 return socket.PassAs<SSLClientSocket>();
1866 void DeterministicMockClientSocketFactory::ClearSSLSessionCache() {
1869 MockSOCKSClientSocketPool::MockSOCKSClientSocketPool(
1870 int max_sockets,
1871 int max_sockets_per_group,
1872 ClientSocketPoolHistograms* histograms,
1873 TransportClientSocketPool* transport_pool)
1874 : SOCKSClientSocketPool(max_sockets, max_sockets_per_group, histograms,
1875 NULL, transport_pool, NULL),
1876 transport_pool_(transport_pool) {
1879 MockSOCKSClientSocketPool::~MockSOCKSClientSocketPool() {}
1881 int MockSOCKSClientSocketPool::RequestSocket(
1882 const std::string& group_name, const void* socket_params,
1883 RequestPriority priority, ClientSocketHandle* handle,
1884 const CompletionCallback& callback, const BoundNetLog& net_log) {
1885 return transport_pool_->RequestSocket(
1886 group_name, socket_params, priority, handle, callback, net_log);
1889 void MockSOCKSClientSocketPool::CancelRequest(
1890 const std::string& group_name,
1891 ClientSocketHandle* handle) {
1892 return transport_pool_->CancelRequest(group_name, handle);
1895 void MockSOCKSClientSocketPool::ReleaseSocket(const std::string& group_name,
1896 scoped_ptr<StreamSocket> socket,
1897 int id) {
1898 return transport_pool_->ReleaseSocket(group_name, socket.Pass(), id);
1901 const char kSOCKS5GreetRequest[] = { 0x05, 0x01, 0x00 };
1902 const int kSOCKS5GreetRequestLength = arraysize(kSOCKS5GreetRequest);
1904 const char kSOCKS5GreetResponse[] = { 0x05, 0x00 };
1905 const int kSOCKS5GreetResponseLength = arraysize(kSOCKS5GreetResponse);
1907 const char kSOCKS5OkRequest[] =
1908 { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 };
1909 const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest);
1911 const char kSOCKS5OkResponse[] =
1912 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 };
1913 const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse);
1915 } // namespace net