Home | History | Annotate | Download | only in socket
      1 // Copyright (c) 2011 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.
      4 
      5 #include "net/socket/socket_test_util.h"
      6 
      7 #include <algorithm>
      8 #include <vector>
      9 
     10 
     11 #include "base/basictypes.h"
     12 #include "base/compiler_specific.h"
     13 #include "base/message_loop.h"
     14 #include "base/time.h"
     15 #include "net/base/address_family.h"
     16 #include "net/base/auth.h"
     17 #include "net/base/host_resolver_proc.h"
     18 #include "net/base/ssl_cert_request_info.h"
     19 #include "net/base/ssl_info.h"
     20 #include "net/http/http_network_session.h"
     21 #include "net/http/http_request_headers.h"
     22 #include "net/http/http_response_headers.h"
     23 #include "net/socket/client_socket_pool_histograms.h"
     24 #include "net/socket/socket.h"
     25 #include "net/socket/ssl_host_info.h"
     26 #include "testing/gtest/include/gtest/gtest.h"
     27 
     28 #define NET_TRACE(level, s)   DLOG(level) << s << __FUNCTION__ << "() "
     29 
     30 namespace net {
     31 
     32 namespace {
     33 
     34 inline char AsciifyHigh(char x) {
     35   char nybble = static_cast<char>((x >> 4) & 0x0F);
     36   return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10);
     37 }
     38 
     39 inline char AsciifyLow(char x) {
     40   char nybble = static_cast<char>((x >> 0) & 0x0F);
     41   return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10);
     42 }
     43 
     44 inline char Asciify(char x) {
     45   if ((x < 0) || !isprint(x))
     46     return '.';
     47   return x;
     48 }
     49 
     50 void DumpData(const char* data, int data_len) {
     51   if (logging::LOG_INFO < logging::GetMinLogLevel())
     52     return;
     53   DVLOG(1) << "Length:  " << data_len;
     54   const char* pfx = "Data:    ";
     55   if (!data || (data_len <= 0)) {
     56     DVLOG(1) << pfx << "<None>";
     57   } else {
     58     int i;
     59     for (i = 0; i <= (data_len - 4); i += 4) {
     60       DVLOG(1) << pfx
     61                << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
     62                << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
     63                << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2])
     64                << AsciifyHigh(data[i + 3]) << AsciifyLow(data[i + 3])
     65                << "  '"
     66                << Asciify(data[i + 0])
     67                << Asciify(data[i + 1])
     68                << Asciify(data[i + 2])
     69                << Asciify(data[i + 3])
     70                << "'";
     71       pfx = "         ";
     72     }
     73     // Take care of any 'trailing' bytes, if data_len was not a multiple of 4.
     74     switch (data_len - i) {
     75       case 3:
     76         DVLOG(1) << pfx
     77                  << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
     78                  << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
     79                  << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2])
     80                  << "    '"
     81                  << Asciify(data[i + 0])
     82                  << Asciify(data[i + 1])
     83                  << Asciify(data[i + 2])
     84                  << " '";
     85         break;
     86       case 2:
     87         DVLOG(1) << pfx
     88                  << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
     89                  << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
     90                  << "      '"
     91                  << Asciify(data[i + 0])
     92                  << Asciify(data[i + 1])
     93                  << "  '";
     94         break;
     95       case 1:
     96         DVLOG(1) << pfx
     97                  << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
     98                  << "        '"
     99                  << Asciify(data[i + 0])
    100                  << "   '";
    101         break;
    102     }
    103   }
    104 }
    105 
    106 void DumpMockRead(const MockRead& r) {
    107   if (logging::LOG_INFO < logging::GetMinLogLevel())
    108     return;
    109   DVLOG(1) << "Async:   " << r.async
    110            << "\nResult:  " << r.result;
    111   DumpData(r.data, r.data_len);
    112   const char* stop = (r.sequence_number & MockRead::STOPLOOP) ? " (STOP)" : "";
    113   DVLOG(1) << "Stage:   " << (r.sequence_number & ~MockRead::STOPLOOP) << stop
    114            << "\nTime:    " << r.time_stamp.ToInternalValue();
    115 }
    116 
    117 }  // namespace
    118 
    119 StaticSocketDataProvider::StaticSocketDataProvider()
    120     : reads_(NULL),
    121       read_index_(0),
    122       read_count_(0),
    123       writes_(NULL),
    124       write_index_(0),
    125       write_count_(0) {
    126 }
    127 
    128 StaticSocketDataProvider::StaticSocketDataProvider(MockRead* reads,
    129                                                    size_t reads_count,
    130                                                    MockWrite* writes,
    131                                                    size_t writes_count)
    132     : reads_(reads),
    133       read_index_(0),
    134       read_count_(reads_count),
    135       writes_(writes),
    136       write_index_(0),
    137       write_count_(writes_count) {
    138 }
    139 
    140 StaticSocketDataProvider::~StaticSocketDataProvider() {}
    141 
    142 const MockRead& StaticSocketDataProvider::PeekRead() const {
    143   DCHECK(!at_read_eof());
    144   return reads_[read_index_];
    145 }
    146 
    147 const MockWrite& StaticSocketDataProvider::PeekWrite() const {
    148   DCHECK(!at_write_eof());
    149   return writes_[write_index_];
    150 }
    151 
    152 const MockRead& StaticSocketDataProvider::PeekRead(size_t index) const {
    153   DCHECK_LT(index, read_count_);
    154   return reads_[index];
    155 }
    156 
    157 const MockWrite& StaticSocketDataProvider::PeekWrite(size_t index) const {
    158   DCHECK_LT(index, write_count_);
    159   return writes_[index];
    160 }
    161 
    162 MockRead StaticSocketDataProvider::GetNextRead() {
    163   DCHECK(!at_read_eof());
    164   reads_[read_index_].time_stamp = base::Time::Now();
    165   return reads_[read_index_++];
    166 }
    167 
    168 MockWriteResult StaticSocketDataProvider::OnWrite(const std::string& data) {
    169   if (!writes_) {
    170     // Not using mock writes; succeed synchronously.
    171     return MockWriteResult(false, data.length());
    172   }
    173 
    174   DCHECK(!at_write_eof());
    175 
    176   // Check that what we are writing matches the expectation.
    177   // Then give the mocked return value.
    178   net::MockWrite* w = &writes_[write_index_++];
    179   w->time_stamp = base::Time::Now();
    180   int result = w->result;
    181   if (w->data) {
    182     // Note - we can simulate a partial write here.  If the expected data
    183     // is a match, but shorter than the write actually written, that is legal.
    184     // Example:
    185     //   Application writes "foobarbaz" (9 bytes)
    186     //   Expected write was "foo" (3 bytes)
    187     //   This is a success, and we return 3 to the application.
    188     std::string expected_data(w->data, w->data_len);
    189     EXPECT_GE(data.length(), expected_data.length());
    190     std::string actual_data(data.substr(0, w->data_len));
    191     EXPECT_EQ(expected_data, actual_data);
    192     if (expected_data != actual_data)
    193       return MockWriteResult(false, net::ERR_UNEXPECTED);
    194     if (result == net::OK)
    195       result = w->data_len;
    196   }
    197   return MockWriteResult(w->async, result);
    198 }
    199 
    200 void StaticSocketDataProvider::Reset() {
    201   read_index_ = 0;
    202   write_index_ = 0;
    203 }
    204 
    205 DynamicSocketDataProvider::DynamicSocketDataProvider()
    206     : short_read_limit_(0),
    207       allow_unconsumed_reads_(false) {
    208 }
    209 
    210 DynamicSocketDataProvider::~DynamicSocketDataProvider() {}
    211 
    212 MockRead DynamicSocketDataProvider::GetNextRead() {
    213   if (reads_.empty())
    214     return MockRead(false, ERR_UNEXPECTED);
    215   MockRead result = reads_.front();
    216   if (short_read_limit_ == 0 || result.data_len <= short_read_limit_) {
    217     reads_.pop_front();
    218   } else {
    219     result.data_len = short_read_limit_;
    220     reads_.front().data += result.data_len;
    221     reads_.front().data_len -= result.data_len;
    222   }
    223   return result;
    224 }
    225 
    226 void DynamicSocketDataProvider::Reset() {
    227   reads_.clear();
    228 }
    229 
    230 void DynamicSocketDataProvider::SimulateRead(const char* data,
    231                                              const size_t length) {
    232   if (!allow_unconsumed_reads_) {
    233     EXPECT_TRUE(reads_.empty()) << "Unconsumed read: " << reads_.front().data;
    234   }
    235   reads_.push_back(MockRead(true, data, length));
    236 }
    237 
    238 SSLSocketDataProvider::SSLSocketDataProvider(bool async, int result)
    239     : connect(async, result),
    240       next_proto_status(SSLClientSocket::kNextProtoUnsupported),
    241       was_npn_negotiated(false),
    242       cert_request_info(NULL) {
    243 }
    244 
    245 SSLSocketDataProvider::~SSLSocketDataProvider() {
    246 }
    247 
    248 DelayedSocketData::DelayedSocketData(
    249     int write_delay, MockRead* reads, size_t reads_count,
    250     MockWrite* writes, size_t writes_count)
    251     : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
    252       write_delay_(write_delay),
    253       ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)) {
    254   DCHECK_GE(write_delay_, 0);
    255 }
    256 
    257 DelayedSocketData::DelayedSocketData(
    258     const MockConnect& connect, int write_delay, MockRead* reads,
    259     size_t reads_count, MockWrite* writes, size_t writes_count)
    260     : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
    261       write_delay_(write_delay),
    262       ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)) {
    263   DCHECK_GE(write_delay_, 0);
    264   set_connect_data(connect);
    265 }
    266 
    267 DelayedSocketData::~DelayedSocketData() {
    268 }
    269 
    270 void DelayedSocketData::ForceNextRead() {
    271   write_delay_ = 0;
    272   CompleteRead();
    273 }
    274 
    275 MockRead DelayedSocketData::GetNextRead() {
    276   if (write_delay_ > 0)
    277     return MockRead(true, ERR_IO_PENDING);
    278   return StaticSocketDataProvider::GetNextRead();
    279 }
    280 
    281 MockWriteResult DelayedSocketData::OnWrite(const std::string& data) {
    282   MockWriteResult rv = StaticSocketDataProvider::OnWrite(data);
    283   // Now that our write has completed, we can allow reads to continue.
    284   if (!--write_delay_)
    285     MessageLoop::current()->PostDelayedTask(FROM_HERE,
    286       factory_.NewRunnableMethod(&DelayedSocketData::CompleteRead), 100);
    287   return rv;
    288 }
    289 
    290 void DelayedSocketData::Reset() {
    291   set_socket(NULL);
    292   factory_.RevokeAll();
    293   StaticSocketDataProvider::Reset();
    294 }
    295 
    296 void DelayedSocketData::CompleteRead() {
    297   if (socket())
    298     socket()->OnReadComplete(GetNextRead());
    299 }
    300 
    301 OrderedSocketData::OrderedSocketData(
    302     MockRead* reads, size_t reads_count, MockWrite* writes, size_t writes_count)
    303     : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
    304       sequence_number_(0), loop_stop_stage_(0), callback_(NULL),
    305       blocked_(false), ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)) {
    306 }
    307 
    308 OrderedSocketData::OrderedSocketData(
    309     const MockConnect& connect,
    310     MockRead* reads, size_t reads_count,
    311     MockWrite* writes, size_t writes_count)
    312     : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
    313       sequence_number_(0), loop_stop_stage_(0), callback_(NULL),
    314       blocked_(false), ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)) {
    315   set_connect_data(connect);
    316 }
    317 
    318 void OrderedSocketData::EndLoop() {
    319   // If we've already stopped the loop, don't do it again until we've advanced
    320   // to the next sequence_number.
    321   NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_ << ": EndLoop()";
    322   if (loop_stop_stage_ > 0) {
    323     const MockRead& next_read = StaticSocketDataProvider::PeekRead();
    324     if ((next_read.sequence_number & ~MockRead::STOPLOOP) >
    325         loop_stop_stage_) {
    326       NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
    327                                 << ": Clearing stop index";
    328       loop_stop_stage_ = 0;
    329     } else {
    330       return;
    331     }
    332   }
    333   // Record the sequence_number at which we stopped the loop.
    334   NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
    335                             << ": Posting Quit at read " << read_index();
    336   loop_stop_stage_ = sequence_number_;
    337   if (callback_)
    338     callback_->RunWithParams(Tuple1<int>(ERR_IO_PENDING));
    339 }
    340 
    341 MockRead OrderedSocketData::GetNextRead() {
    342   factory_.RevokeAll();
    343   blocked_ = false;
    344   const MockRead& next_read = StaticSocketDataProvider::PeekRead();
    345   if (next_read.sequence_number & MockRead::STOPLOOP)
    346     EndLoop();
    347   if ((next_read.sequence_number & ~MockRead::STOPLOOP) <=
    348       sequence_number_++) {
    349     NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_ - 1
    350                               << ": Read " << read_index();
    351     DumpMockRead(next_read);
    352     return StaticSocketDataProvider::GetNextRead();
    353   }
    354   NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_ - 1
    355                             << ": I/O Pending";
    356   MockRead result = MockRead(true, ERR_IO_PENDING);
    357   DumpMockRead(result);
    358   blocked_ = true;
    359   return result;
    360 }
    361 
    362 MockWriteResult OrderedSocketData::OnWrite(const std::string& data) {
    363   NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
    364                             << ": Write " << write_index();
    365   DumpMockRead(PeekWrite());
    366   ++sequence_number_;
    367   if (blocked_) {
    368     // TODO(willchan): This 100ms delay seems to work around some weirdness.  We
    369     // should probably fix the weirdness.  One example is in SpdyStream,
    370     // DoSendRequest() will return ERR_IO_PENDING, and there's a race.  If the
    371     // SYN_REPLY causes OnResponseReceived() to get called before
    372     // SpdyStream::ReadResponseHeaders() is called, we hit a NOTREACHED().
    373     MessageLoop::current()->PostDelayedTask(
    374         FROM_HERE,
    375         factory_.NewRunnableMethod(&OrderedSocketData::CompleteRead), 100);
    376   }
    377   return StaticSocketDataProvider::OnWrite(data);
    378 }
    379 
    380 void OrderedSocketData::Reset() {
    381   NET_TRACE(INFO, "  *** ") << "Stage "
    382                             << sequence_number_ << ": Reset()";
    383   sequence_number_ = 0;
    384   loop_stop_stage_ = 0;
    385   set_socket(NULL);
    386   factory_.RevokeAll();
    387   StaticSocketDataProvider::Reset();
    388 }
    389 
    390 void OrderedSocketData::CompleteRead() {
    391   if (socket()) {
    392     NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_;
    393     socket()->OnReadComplete(GetNextRead());
    394   }
    395 }
    396 
    397 OrderedSocketData::~OrderedSocketData() {}
    398 
    399 DeterministicSocketData::DeterministicSocketData(MockRead* reads,
    400     size_t reads_count, MockWrite* writes, size_t writes_count)
    401     : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
    402       sequence_number_(0),
    403       current_read_(),
    404       current_write_(),
    405       stopping_sequence_number_(0),
    406       stopped_(false),
    407       print_debug_(false) {}
    408 
    409 DeterministicSocketData::~DeterministicSocketData() {}
    410 
    411 void DeterministicSocketData::Run() {
    412   SetStopped(false);
    413   int counter = 0;
    414   // Continue to consume data until all data has run out, or the stopped_ flag
    415   // has been set. Consuming data requires two separate operations -- running
    416   // the tasks in the message loop, and explicitly invoking the read/write
    417   // callbacks (simulating network I/O). We check our conditions between each,
    418   // since they can change in either.
    419   while ((!at_write_eof() || !at_read_eof()) && !stopped()) {
    420     if (counter % 2 == 0)
    421       MessageLoop::current()->RunAllPending();
    422     if (counter % 2 == 1) {
    423       InvokeCallbacks();
    424     }
    425     counter++;
    426   }
    427   // We're done consuming new data, but it is possible there are still some
    428   // pending callbacks which we expect to complete before returning.
    429   while (socket_ && (socket_->write_pending() || socket_->read_pending()) &&
    430          !stopped()) {
    431     InvokeCallbacks();
    432     MessageLoop::current()->RunAllPending();
    433   }
    434   SetStopped(false);
    435 }
    436 
    437 void DeterministicSocketData::RunFor(int steps) {
    438   StopAfter(steps);
    439   Run();
    440 }
    441 
    442 void DeterministicSocketData::SetStop(int seq) {
    443   DCHECK_LT(sequence_number_, seq);
    444   stopping_sequence_number_ = seq;
    445   stopped_ = false;
    446 }
    447 
    448 void DeterministicSocketData::StopAfter(int seq) {
    449   SetStop(sequence_number_ + seq);
    450 }
    451 
    452 MockRead DeterministicSocketData::GetNextRead() {
    453   current_read_ = StaticSocketDataProvider::PeekRead();
    454   EXPECT_LE(sequence_number_, current_read_.sequence_number);
    455 
    456   // Synchronous read while stopped is an error
    457   if (stopped() && !current_read_.async) {
    458     LOG(ERROR) << "Unable to perform synchronous IO while stopped";
    459     return MockRead(false, ERR_UNEXPECTED);
    460   }
    461 
    462   // Async read which will be called back in a future step.
    463   if (sequence_number_ < current_read_.sequence_number) {
    464     NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
    465                               << ": I/O Pending";
    466     MockRead result = MockRead(false, ERR_IO_PENDING);
    467     if (!current_read_.async) {
    468       LOG(ERROR) << "Unable to perform synchronous read: "
    469           << current_read_.sequence_number
    470           << " at stage: " << sequence_number_;
    471       result = MockRead(false, ERR_UNEXPECTED);
    472     }
    473     if (print_debug_)
    474       DumpMockRead(result);
    475     return result;
    476   }
    477 
    478   NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
    479                             << ": Read " << read_index();
    480   if (print_debug_)
    481     DumpMockRead(current_read_);
    482 
    483   // Increment the sequence number if IO is complete
    484   if (!current_read_.async)
    485     NextStep();
    486 
    487   DCHECK_NE(ERR_IO_PENDING, current_read_.result);
    488   StaticSocketDataProvider::GetNextRead();
    489 
    490   return current_read_;
    491 }
    492 
    493 MockWriteResult DeterministicSocketData::OnWrite(const std::string& data) {
    494   const MockWrite& next_write = StaticSocketDataProvider::PeekWrite();
    495   current_write_ = next_write;
    496 
    497   // Synchronous write while stopped is an error
    498   if (stopped() && !next_write.async) {
    499     LOG(ERROR) << "Unable to perform synchronous IO while stopped";
    500     return MockWriteResult(false, ERR_UNEXPECTED);
    501   }
    502 
    503   // Async write which will be called back in a future step.
    504   if (sequence_number_ < next_write.sequence_number) {
    505     NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
    506                               << ": I/O Pending";
    507     if (!next_write.async) {
    508       LOG(ERROR) << "Unable to perform synchronous write: "
    509           << next_write.sequence_number << " at stage: " << sequence_number_;
    510       return MockWriteResult(false, ERR_UNEXPECTED);
    511     }
    512   } else {
    513     NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
    514                               << ": Write " << write_index();
    515   }
    516 
    517   if (print_debug_)
    518     DumpMockRead(next_write);
    519 
    520   // Move to the next step if I/O is synchronous, since the operation will
    521   // complete when this method returns.
    522   if (!next_write.async)
    523     NextStep();
    524 
    525   // This is either a sync write for this step, or an async write.
    526   return StaticSocketDataProvider::OnWrite(data);
    527 }
    528 
    529 void DeterministicSocketData::Reset() {
    530   NET_TRACE(INFO, "  *** ") << "Stage "
    531                             << sequence_number_ << ": Reset()";
    532   sequence_number_ = 0;
    533   StaticSocketDataProvider::Reset();
    534   NOTREACHED();
    535 }
    536 
    537 void DeterministicSocketData::InvokeCallbacks() {
    538   if (socket_ && socket_->write_pending() &&
    539       (current_write().sequence_number == sequence_number())) {
    540     socket_->CompleteWrite();
    541     NextStep();
    542     return;
    543   }
    544   if (socket_ && socket_->read_pending() &&
    545       (current_read().sequence_number == sequence_number())) {
    546     socket_->CompleteRead();
    547     NextStep();
    548     return;
    549   }
    550 }
    551 
    552 void DeterministicSocketData::NextStep() {
    553   // Invariant: Can never move *past* the stopping step.
    554   DCHECK_LT(sequence_number_, stopping_sequence_number_);
    555   sequence_number_++;
    556   if (sequence_number_ == stopping_sequence_number_)
    557     SetStopped(true);
    558 }
    559 
    560 MockClientSocketFactory::MockClientSocketFactory() {}
    561 
    562 MockClientSocketFactory::~MockClientSocketFactory() {}
    563 
    564 void MockClientSocketFactory::AddSocketDataProvider(
    565     SocketDataProvider* data) {
    566   mock_data_.Add(data);
    567 }
    568 
    569 void MockClientSocketFactory::AddSSLSocketDataProvider(
    570     SSLSocketDataProvider* data) {
    571   mock_ssl_data_.Add(data);
    572 }
    573 
    574 void MockClientSocketFactory::ResetNextMockIndexes() {
    575   mock_data_.ResetNextIndex();
    576   mock_ssl_data_.ResetNextIndex();
    577 }
    578 
    579 MockTCPClientSocket* MockClientSocketFactory::GetMockTCPClientSocket(
    580     size_t index) const {
    581   DCHECK_LT(index, tcp_client_sockets_.size());
    582   return tcp_client_sockets_[index];
    583 }
    584 
    585 MockSSLClientSocket* MockClientSocketFactory::GetMockSSLClientSocket(
    586     size_t index) const {
    587   DCHECK_LT(index, ssl_client_sockets_.size());
    588   return ssl_client_sockets_[index];
    589 }
    590 
    591 ClientSocket* MockClientSocketFactory::CreateTransportClientSocket(
    592     const AddressList& addresses,
    593     net::NetLog* net_log,
    594     const NetLog::Source& source) {
    595   SocketDataProvider* data_provider = mock_data_.GetNext();
    596   MockTCPClientSocket* socket =
    597       new MockTCPClientSocket(addresses, net_log, data_provider);
    598   data_provider->set_socket(socket);
    599   tcp_client_sockets_.push_back(socket);
    600   return socket;
    601 }
    602 
    603 SSLClientSocket* MockClientSocketFactory::CreateSSLClientSocket(
    604     ClientSocketHandle* transport_socket,
    605     const HostPortPair& host_and_port,
    606     const SSLConfig& ssl_config,
    607     SSLHostInfo* ssl_host_info,
    608     CertVerifier* cert_verifier,
    609     DnsCertProvenanceChecker* dns_cert_checker) {
    610   MockSSLClientSocket* socket =
    611       new MockSSLClientSocket(transport_socket, host_and_port, ssl_config,
    612                               ssl_host_info, mock_ssl_data_.GetNext());
    613   ssl_client_sockets_.push_back(socket);
    614   return socket;
    615 }
    616 
    617 void MockClientSocketFactory::ClearSSLSessionCache() {
    618 }
    619 
    620 MockClientSocket::MockClientSocket(net::NetLog* net_log)
    621     : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
    622       connected_(false),
    623       net_log_(NetLog::Source(), net_log) {
    624 }
    625 
    626 bool MockClientSocket::SetReceiveBufferSize(int32 size) {
    627   return true;
    628 }
    629 
    630 bool MockClientSocket::SetSendBufferSize(int32 size) {
    631   return true;
    632 }
    633 
    634 void MockClientSocket::Disconnect() {
    635   connected_ = false;
    636 }
    637 
    638 bool MockClientSocket::IsConnected() const {
    639   return connected_;
    640 }
    641 
    642 bool MockClientSocket::IsConnectedAndIdle() const {
    643   return connected_;
    644 }
    645 
    646 int MockClientSocket::GetPeerAddress(AddressList* address) const {
    647   return net::SystemHostResolverProc("192.0.2.33", ADDRESS_FAMILY_UNSPECIFIED,
    648                                      0, address, NULL);
    649 }
    650 
    651 int MockClientSocket::GetLocalAddress(IPEndPoint* address) const {
    652   IPAddressNumber ip;
    653   if (!ParseIPLiteralToNumber("192.0.2.33", &ip))
    654     return ERR_FAILED;
    655   *address = IPEndPoint(ip, 123);
    656       return OK;
    657 }
    658 
    659 const BoundNetLog& MockClientSocket::NetLog() const {
    660   return net_log_;
    661 }
    662 
    663 void MockClientSocket::GetSSLInfo(net::SSLInfo* ssl_info) {
    664   NOTREACHED();
    665 }
    666 
    667 void MockClientSocket::GetSSLCertRequestInfo(
    668     net::SSLCertRequestInfo* cert_request_info) {
    669 }
    670 
    671 SSLClientSocket::NextProtoStatus
    672 MockClientSocket::GetNextProto(std::string* proto) {
    673   proto->clear();
    674   return SSLClientSocket::kNextProtoUnsupported;
    675 }
    676 
    677 MockClientSocket::~MockClientSocket() {}
    678 
    679 void MockClientSocket::RunCallbackAsync(net::CompletionCallback* callback,
    680                                         int result) {
    681   MessageLoop::current()->PostTask(FROM_HERE,
    682       method_factory_.NewRunnableMethod(
    683           &MockClientSocket::RunCallback, callback, result));
    684 }
    685 
    686 void MockClientSocket::RunCallback(net::CompletionCallback* callback,
    687                                    int result) {
    688   if (callback)
    689     callback->Run(result);
    690 }
    691 
    692 MockTCPClientSocket::MockTCPClientSocket(const net::AddressList& addresses,
    693                                          net::NetLog* net_log,
    694                                          net::SocketDataProvider* data)
    695     : MockClientSocket(net_log),
    696       addresses_(addresses),
    697       data_(data),
    698       read_offset_(0),
    699       read_data_(false, net::ERR_UNEXPECTED),
    700       need_read_data_(true),
    701       peer_closed_connection_(false),
    702       pending_buf_(NULL),
    703       pending_buf_len_(0),
    704       pending_callback_(NULL),
    705       was_used_to_convey_data_(false) {
    706   DCHECK(data_);
    707   data_->Reset();
    708 }
    709 
    710 int MockTCPClientSocket::Read(net::IOBuffer* buf, int buf_len,
    711                               net::CompletionCallback* callback) {
    712   if (!connected_)
    713     return net::ERR_UNEXPECTED;
    714 
    715   // If the buffer is already in use, a read is already in progress!
    716   DCHECK(pending_buf_ == NULL);
    717 
    718   // Store our async IO data.
    719   pending_buf_ = buf;
    720   pending_buf_len_ = buf_len;
    721   pending_callback_ = callback;
    722 
    723   if (need_read_data_) {
    724     read_data_ = data_->GetNextRead();
    725     if (read_data_.result == ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ) {
    726       // This MockRead is just a marker to instruct us to set
    727       // peer_closed_connection_.  Skip it and get the next one.
    728       read_data_ = data_->GetNextRead();
    729       peer_closed_connection_ = true;
    730     }
    731     // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility
    732     // to complete the async IO manually later (via OnReadComplete).
    733     if (read_data_.result == ERR_IO_PENDING) {
    734       DCHECK(callback);  // We need to be using async IO in this case.
    735       return ERR_IO_PENDING;
    736     }
    737     need_read_data_ = false;
    738   }
    739 
    740   return CompleteRead();
    741 }
    742 
    743 int MockTCPClientSocket::Write(net::IOBuffer* buf, int buf_len,
    744                                net::CompletionCallback* callback) {
    745   DCHECK(buf);
    746   DCHECK_GT(buf_len, 0);
    747 
    748   if (!connected_)
    749     return net::ERR_UNEXPECTED;
    750 
    751   std::string data(buf->data(), buf_len);
    752   net::MockWriteResult write_result = data_->OnWrite(data);
    753 
    754   was_used_to_convey_data_ = true;
    755 
    756   if (write_result.async) {
    757     RunCallbackAsync(callback, write_result.result);
    758     return net::ERR_IO_PENDING;
    759   }
    760 
    761   return write_result.result;
    762 }
    763 
    764 int MockTCPClientSocket::Connect(net::CompletionCallback* callback) {
    765   if (connected_)
    766     return net::OK;
    767   connected_ = true;
    768   peer_closed_connection_ = false;
    769   if (data_->connect_data().async) {
    770     RunCallbackAsync(callback, data_->connect_data().result);
    771     return net::ERR_IO_PENDING;
    772   }
    773   return data_->connect_data().result;
    774 }
    775 
    776 void MockTCPClientSocket::Disconnect() {
    777   MockClientSocket::Disconnect();
    778   pending_callback_ = NULL;
    779 }
    780 
    781 bool MockTCPClientSocket::IsConnected() const {
    782   return connected_ && !peer_closed_connection_;
    783 }
    784 
    785 bool MockTCPClientSocket::IsConnectedAndIdle() const {
    786   return IsConnected();
    787 }
    788 
    789 int MockTCPClientSocket::GetPeerAddress(AddressList* address) const {
    790   if (!IsConnected())
    791     return ERR_SOCKET_NOT_CONNECTED;
    792   return MockClientSocket::GetPeerAddress(address);
    793 }
    794 
    795 bool MockTCPClientSocket::WasEverUsed() const {
    796   return was_used_to_convey_data_;
    797 }
    798 
    799 bool MockTCPClientSocket::UsingTCPFastOpen() const {
    800   return false;
    801 }
    802 
    803 void MockTCPClientSocket::OnReadComplete(const MockRead& data) {
    804   // There must be a read pending.
    805   DCHECK(pending_buf_);
    806   // You can't complete a read with another ERR_IO_PENDING status code.
    807   DCHECK_NE(ERR_IO_PENDING, data.result);
    808   // Since we've been waiting for data, need_read_data_ should be true.
    809   DCHECK(need_read_data_);
    810 
    811   read_data_ = data;
    812   need_read_data_ = false;
    813 
    814   // The caller is simulating that this IO completes right now.  Don't
    815   // let CompleteRead() schedule a callback.
    816   read_data_.async = false;
    817 
    818   net::CompletionCallback* callback = pending_callback_;
    819   int rv = CompleteRead();
    820   RunCallback(callback, rv);
    821 }
    822 
    823 int MockTCPClientSocket::CompleteRead() {
    824   DCHECK(pending_buf_);
    825   DCHECK(pending_buf_len_ > 0);
    826 
    827   was_used_to_convey_data_ = true;
    828 
    829   // Save the pending async IO data and reset our |pending_| state.
    830   net::IOBuffer* buf = pending_buf_;
    831   int buf_len = pending_buf_len_;
    832   net::CompletionCallback* callback = pending_callback_;
    833   pending_buf_ = NULL;
    834   pending_buf_len_ = 0;
    835   pending_callback_ = NULL;
    836 
    837   int result = read_data_.result;
    838   DCHECK(result != ERR_IO_PENDING);
    839 
    840   if (read_data_.data) {
    841     if (read_data_.data_len - read_offset_ > 0) {
    842       result = std::min(buf_len, read_data_.data_len - read_offset_);
    843       memcpy(buf->data(), read_data_.data + read_offset_, result);
    844       read_offset_ += result;
    845       if (read_offset_ == read_data_.data_len) {
    846         need_read_data_ = true;
    847         read_offset_ = 0;
    848       }
    849     } else {
    850       result = 0;  // EOF
    851     }
    852   }
    853 
    854   if (read_data_.async) {
    855     DCHECK(callback);
    856     RunCallbackAsync(callback, result);
    857     return net::ERR_IO_PENDING;
    858   }
    859   return result;
    860 }
    861 
    862 DeterministicMockTCPClientSocket::DeterministicMockTCPClientSocket(
    863     net::NetLog* net_log, net::DeterministicSocketData* data)
    864     : MockClientSocket(net_log),
    865       write_pending_(false),
    866       write_callback_(NULL),
    867       write_result_(0),
    868       read_data_(),
    869       read_buf_(NULL),
    870       read_buf_len_(0),
    871       read_pending_(false),
    872       read_callback_(NULL),
    873       data_(data),
    874       was_used_to_convey_data_(false) {}
    875 
    876 DeterministicMockTCPClientSocket::~DeterministicMockTCPClientSocket() {}
    877 
    878 void DeterministicMockTCPClientSocket::CompleteWrite() {
    879   was_used_to_convey_data_ = true;
    880   write_pending_ = false;
    881   write_callback_->Run(write_result_);
    882 }
    883 
    884 int DeterministicMockTCPClientSocket::CompleteRead() {
    885   DCHECK_GT(read_buf_len_, 0);
    886   DCHECK_LE(read_data_.data_len, read_buf_len_);
    887   DCHECK(read_buf_);
    888 
    889   was_used_to_convey_data_ = true;
    890 
    891   if (read_data_.result == ERR_IO_PENDING)
    892     read_data_ = data_->GetNextRead();
    893   DCHECK_NE(ERR_IO_PENDING, read_data_.result);
    894   // If read_data_.async is true, we do not need to wait, since this is already
    895   // the callback. Therefore we don't even bother to check it.
    896   int result = read_data_.result;
    897 
    898   if (read_data_.data_len > 0) {
    899     DCHECK(read_data_.data);
    900     result = std::min(read_buf_len_, read_data_.data_len);
    901     memcpy(read_buf_->data(), read_data_.data, result);
    902   }
    903 
    904   if (read_pending_) {
    905     read_pending_ = false;
    906     read_callback_->Run(result);
    907   }
    908 
    909   return result;
    910 }
    911 
    912 int DeterministicMockTCPClientSocket::Write(
    913     net::IOBuffer* buf, int buf_len, net::CompletionCallback* callback) {
    914   DCHECK(buf);
    915   DCHECK_GT(buf_len, 0);
    916 
    917   if (!connected_)
    918     return net::ERR_UNEXPECTED;
    919 
    920   std::string data(buf->data(), buf_len);
    921   net::MockWriteResult write_result = data_->OnWrite(data);
    922 
    923   if (write_result.async) {
    924     write_callback_ = callback;
    925     write_result_ = write_result.result;
    926     DCHECK(write_callback_ != NULL);
    927     write_pending_ = true;
    928     return net::ERR_IO_PENDING;
    929   }
    930 
    931   was_used_to_convey_data_ = true;
    932   write_pending_ = false;
    933   return write_result.result;
    934 }
    935 
    936 int DeterministicMockTCPClientSocket::Read(
    937     net::IOBuffer* buf, int buf_len, net::CompletionCallback* callback) {
    938   if (!connected_)
    939     return net::ERR_UNEXPECTED;
    940 
    941   read_data_ = data_->GetNextRead();
    942   // The buffer should always be big enough to contain all the MockRead data. To
    943   // use small buffers, split the data into multiple MockReads.
    944   DCHECK_LE(read_data_.data_len, buf_len);
    945 
    946   read_buf_ = buf;
    947   read_buf_len_ = buf_len;
    948   read_callback_ = callback;
    949 
    950   if (read_data_.async || (read_data_.result == ERR_IO_PENDING)) {
    951     read_pending_ = true;
    952     DCHECK(read_callback_);
    953     return ERR_IO_PENDING;
    954   }
    955 
    956   was_used_to_convey_data_ = true;
    957   return CompleteRead();
    958 }
    959 
    960 // TODO(erikchen): Support connect sequencing.
    961 int DeterministicMockTCPClientSocket::Connect(
    962     net::CompletionCallback* callback) {
    963   if (connected_)
    964     return net::OK;
    965   connected_ = true;
    966   if (data_->connect_data().async) {
    967     RunCallbackAsync(callback, data_->connect_data().result);
    968     return net::ERR_IO_PENDING;
    969   }
    970   return data_->connect_data().result;
    971 }
    972 
    973 void DeterministicMockTCPClientSocket::Disconnect() {
    974   MockClientSocket::Disconnect();
    975 }
    976 
    977 bool DeterministicMockTCPClientSocket::IsConnected() const {
    978   return connected_;
    979 }
    980 
    981 bool DeterministicMockTCPClientSocket::IsConnectedAndIdle() const {
    982   return IsConnected();
    983 }
    984 
    985 bool DeterministicMockTCPClientSocket::WasEverUsed() const {
    986   return was_used_to_convey_data_;
    987 }
    988 
    989 bool DeterministicMockTCPClientSocket::UsingTCPFastOpen() const {
    990   return false;
    991 }
    992 
    993 void DeterministicMockTCPClientSocket::OnReadComplete(const MockRead& data) {}
    994 
    995 class MockSSLClientSocket::ConnectCallback
    996     : public net::CompletionCallbackImpl<MockSSLClientSocket::ConnectCallback> {
    997  public:
    998   ConnectCallback(MockSSLClientSocket *ssl_client_socket,
    999                   net::CompletionCallback* user_callback,
   1000                   int rv)
   1001       : ALLOW_THIS_IN_INITIALIZER_LIST(
   1002           net::CompletionCallbackImpl<MockSSLClientSocket::ConnectCallback>(
   1003                 this, &ConnectCallback::Wrapper)),
   1004         ssl_client_socket_(ssl_client_socket),
   1005         user_callback_(user_callback),
   1006         rv_(rv) {
   1007   }
   1008 
   1009  private:
   1010   void Wrapper(int rv) {
   1011     if (rv_ == net::OK)
   1012       ssl_client_socket_->connected_ = true;
   1013     user_callback_->Run(rv_);
   1014     delete this;
   1015   }
   1016 
   1017   MockSSLClientSocket* ssl_client_socket_;
   1018   net::CompletionCallback* user_callback_;
   1019   int rv_;
   1020 };
   1021 
   1022 MockSSLClientSocket::MockSSLClientSocket(
   1023     net::ClientSocketHandle* transport_socket,
   1024     const HostPortPair& host_port_pair,
   1025     const net::SSLConfig& ssl_config,
   1026     SSLHostInfo* ssl_host_info,
   1027     net::SSLSocketDataProvider* data)
   1028     : MockClientSocket(transport_socket->socket()->NetLog().net_log()),
   1029       transport_(transport_socket),
   1030       data_(data),
   1031       is_npn_state_set_(false),
   1032       new_npn_value_(false) {
   1033   DCHECK(data_);
   1034   delete ssl_host_info;  // we take ownership but don't use it.
   1035 }
   1036 
   1037 MockSSLClientSocket::~MockSSLClientSocket() {
   1038   Disconnect();
   1039 }
   1040 
   1041 int MockSSLClientSocket::Read(net::IOBuffer* buf, int buf_len,
   1042                               net::CompletionCallback* callback) {
   1043   return transport_->socket()->Read(buf, buf_len, callback);
   1044 }
   1045 
   1046 int MockSSLClientSocket::Write(net::IOBuffer* buf, int buf_len,
   1047                                net::CompletionCallback* callback) {
   1048   return transport_->socket()->Write(buf, buf_len, callback);
   1049 }
   1050 
   1051 int MockSSLClientSocket::Connect(net::CompletionCallback* callback) {
   1052   ConnectCallback* connect_callback = new ConnectCallback(
   1053       this, callback, data_->connect.result);
   1054   int rv = transport_->socket()->Connect(connect_callback);
   1055   if (rv == net::OK) {
   1056     delete connect_callback;
   1057     if (data_->connect.result == net::OK)
   1058       connected_ = true;
   1059     if (data_->connect.async) {
   1060       RunCallbackAsync(callback, data_->connect.result);
   1061       return net::ERR_IO_PENDING;
   1062     }
   1063     return data_->connect.result;
   1064   }
   1065   return rv;
   1066 }
   1067 
   1068 void MockSSLClientSocket::Disconnect() {
   1069   MockClientSocket::Disconnect();
   1070   if (transport_->socket() != NULL)
   1071     transport_->socket()->Disconnect();
   1072 }
   1073 
   1074 bool MockSSLClientSocket::IsConnected() const {
   1075   return transport_->socket()->IsConnected();
   1076 }
   1077 
   1078 bool MockSSLClientSocket::WasEverUsed() const {
   1079   return transport_->socket()->WasEverUsed();
   1080 }
   1081 
   1082 bool MockSSLClientSocket::UsingTCPFastOpen() const {
   1083   return transport_->socket()->UsingTCPFastOpen();
   1084 }
   1085 
   1086 void MockSSLClientSocket::GetSSLInfo(net::SSLInfo* ssl_info) {
   1087   ssl_info->Reset();
   1088   ssl_info->cert = data_->cert_;
   1089 }
   1090 
   1091 void MockSSLClientSocket::GetSSLCertRequestInfo(
   1092     net::SSLCertRequestInfo* cert_request_info) {
   1093   DCHECK(cert_request_info);
   1094   if (data_->cert_request_info) {
   1095     cert_request_info->host_and_port =
   1096         data_->cert_request_info->host_and_port;
   1097     cert_request_info->client_certs = data_->cert_request_info->client_certs;
   1098   } else {
   1099     cert_request_info->Reset();
   1100   }
   1101 }
   1102 
   1103 SSLClientSocket::NextProtoStatus MockSSLClientSocket::GetNextProto(
   1104     std::string* proto) {
   1105   *proto = data_->next_proto;
   1106   return data_->next_proto_status;
   1107 }
   1108 
   1109 bool MockSSLClientSocket::was_npn_negotiated() const {
   1110   if (is_npn_state_set_)
   1111     return new_npn_value_;
   1112   return data_->was_npn_negotiated;
   1113 }
   1114 
   1115 bool MockSSLClientSocket::set_was_npn_negotiated(bool negotiated) {
   1116   is_npn_state_set_ = true;
   1117   return new_npn_value_ = negotiated;
   1118 }
   1119 
   1120 void MockSSLClientSocket::OnReadComplete(const MockRead& data) {
   1121   NOTIMPLEMENTED();
   1122 }
   1123 
   1124 TestSocketRequest::TestSocketRequest(
   1125     std::vector<TestSocketRequest*>* request_order,
   1126     size_t* completion_count)
   1127     : request_order_(request_order),
   1128       completion_count_(completion_count) {
   1129   DCHECK(request_order);
   1130   DCHECK(completion_count);
   1131 }
   1132 
   1133 TestSocketRequest::~TestSocketRequest() {
   1134 }
   1135 
   1136 int TestSocketRequest::WaitForResult() {
   1137   return callback_.WaitForResult();
   1138 }
   1139 
   1140 void TestSocketRequest::RunWithParams(const Tuple1<int>& params) {
   1141   callback_.RunWithParams(params);
   1142   (*completion_count_)++;
   1143   request_order_->push_back(this);
   1144 }
   1145 
   1146 // static
   1147 const int ClientSocketPoolTest::kIndexOutOfBounds = -1;
   1148 
   1149 // static
   1150 const int ClientSocketPoolTest::kRequestNotFound = -2;
   1151 
   1152 ClientSocketPoolTest::ClientSocketPoolTest() : completion_count_(0) {}
   1153 ClientSocketPoolTest::~ClientSocketPoolTest() {}
   1154 
   1155 int ClientSocketPoolTest::GetOrderOfRequest(size_t index) const {
   1156   index--;
   1157   if (index >= requests_.size())
   1158     return kIndexOutOfBounds;
   1159 
   1160   for (size_t i = 0; i < request_order_.size(); i++)
   1161     if (requests_[index] == request_order_[i])
   1162       return i + 1;
   1163 
   1164   return kRequestNotFound;
   1165 }
   1166 
   1167 bool ClientSocketPoolTest::ReleaseOneConnection(KeepAlive keep_alive) {
   1168   ScopedVector<TestSocketRequest>::iterator i;
   1169   for (i = requests_.begin(); i != requests_.end(); ++i) {
   1170     if ((*i)->handle()->is_initialized()) {
   1171       if (keep_alive == NO_KEEP_ALIVE)
   1172         (*i)->handle()->socket()->Disconnect();
   1173       (*i)->handle()->Reset();
   1174       MessageLoop::current()->RunAllPending();
   1175       return true;
   1176     }
   1177   }
   1178   return false;
   1179 }
   1180 
   1181 void ClientSocketPoolTest::ReleaseAllConnections(KeepAlive keep_alive) {
   1182   bool released_one;
   1183   do {
   1184     released_one = ReleaseOneConnection(keep_alive);
   1185   } while (released_one);
   1186 }
   1187 
   1188 MockTransportClientSocketPool::MockConnectJob::MockConnectJob(
   1189     ClientSocket* socket,
   1190     ClientSocketHandle* handle,
   1191     CompletionCallback* callback)
   1192     : socket_(socket),
   1193       handle_(handle),
   1194       user_callback_(callback),
   1195       ALLOW_THIS_IN_INITIALIZER_LIST(
   1196           connect_callback_(this, &MockConnectJob::OnConnect)) {
   1197 }
   1198 
   1199 MockTransportClientSocketPool::MockConnectJob::~MockConnectJob() {}
   1200 
   1201 int MockTransportClientSocketPool::MockConnectJob::Connect() {
   1202   int rv = socket_->Connect(&connect_callback_);
   1203   if (rv == OK) {
   1204     user_callback_ = NULL;
   1205     OnConnect(OK);
   1206   }
   1207   return rv;
   1208 }
   1209 
   1210 bool MockTransportClientSocketPool::MockConnectJob::CancelHandle(
   1211     const ClientSocketHandle* handle) {
   1212   if (handle != handle_)
   1213     return false;
   1214   socket_.reset();
   1215   handle_ = NULL;
   1216   user_callback_ = NULL;
   1217   return true;
   1218 }
   1219 
   1220 void MockTransportClientSocketPool::MockConnectJob::OnConnect(int rv) {
   1221   if (!socket_.get())
   1222     return;
   1223   if (rv == OK) {
   1224     handle_->set_socket(socket_.release());
   1225   } else {
   1226     socket_.reset();
   1227   }
   1228 
   1229   handle_ = NULL;
   1230 
   1231   if (user_callback_) {
   1232     CompletionCallback* callback = user_callback_;
   1233     user_callback_ = NULL;
   1234     callback->Run(rv);
   1235   }
   1236 }
   1237 
   1238 MockTransportClientSocketPool::MockTransportClientSocketPool(
   1239     int max_sockets,
   1240     int max_sockets_per_group,
   1241     ClientSocketPoolHistograms* histograms,
   1242     ClientSocketFactory* socket_factory)
   1243     : TransportClientSocketPool(max_sockets, max_sockets_per_group, histograms,
   1244                                 NULL, NULL, NULL),
   1245       client_socket_factory_(socket_factory),
   1246       release_count_(0),
   1247       cancel_count_(0) {
   1248 }
   1249 
   1250 MockTransportClientSocketPool::~MockTransportClientSocketPool() {}
   1251 
   1252 int MockTransportClientSocketPool::RequestSocket(const std::string& group_name,
   1253                                            const void* socket_params,
   1254                                            RequestPriority priority,
   1255                                            ClientSocketHandle* handle,
   1256                                            CompletionCallback* callback,
   1257                                            const BoundNetLog& net_log) {
   1258   ClientSocket* socket = client_socket_factory_->CreateTransportClientSocket(
   1259       AddressList(), net_log.net_log(), net::NetLog::Source());
   1260   MockConnectJob* job = new MockConnectJob(socket, handle, callback);
   1261   job_list_.push_back(job);
   1262   handle->set_pool_id(1);
   1263   return job->Connect();
   1264 }
   1265 
   1266 void MockTransportClientSocketPool::CancelRequest(const std::string& group_name,
   1267                                             ClientSocketHandle* handle) {
   1268   std::vector<MockConnectJob*>::iterator i;
   1269   for (i = job_list_.begin(); i != job_list_.end(); ++i) {
   1270     if ((*i)->CancelHandle(handle)) {
   1271       cancel_count_++;
   1272       break;
   1273     }
   1274   }
   1275 }
   1276 
   1277 void MockTransportClientSocketPool::ReleaseSocket(const std::string& group_name,
   1278                                             ClientSocket* socket, int id) {
   1279   EXPECT_EQ(1, id);
   1280   release_count_++;
   1281   delete socket;
   1282 }
   1283 
   1284 DeterministicMockClientSocketFactory::DeterministicMockClientSocketFactory() {}
   1285 
   1286 DeterministicMockClientSocketFactory::~DeterministicMockClientSocketFactory() {}
   1287 
   1288 void DeterministicMockClientSocketFactory::AddSocketDataProvider(
   1289     DeterministicSocketData* data) {
   1290   mock_data_.Add(data);
   1291 }
   1292 
   1293 void DeterministicMockClientSocketFactory::AddSSLSocketDataProvider(
   1294     SSLSocketDataProvider* data) {
   1295   mock_ssl_data_.Add(data);
   1296 }
   1297 
   1298 void DeterministicMockClientSocketFactory::ResetNextMockIndexes() {
   1299   mock_data_.ResetNextIndex();
   1300   mock_ssl_data_.ResetNextIndex();
   1301 }
   1302 
   1303 MockSSLClientSocket* DeterministicMockClientSocketFactory::
   1304     GetMockSSLClientSocket(size_t index) const {
   1305   DCHECK_LT(index, ssl_client_sockets_.size());
   1306   return ssl_client_sockets_[index];
   1307 }
   1308 
   1309 ClientSocket* DeterministicMockClientSocketFactory::CreateTransportClientSocket(
   1310     const AddressList& addresses,
   1311     net::NetLog* net_log,
   1312     const net::NetLog::Source& source) {
   1313   DeterministicSocketData* data_provider = mock_data().GetNext();
   1314   DeterministicMockTCPClientSocket* socket =
   1315       new DeterministicMockTCPClientSocket(net_log, data_provider);
   1316   data_provider->set_socket(socket->AsWeakPtr());
   1317   tcp_client_sockets().push_back(socket);
   1318   return socket;
   1319 }
   1320 
   1321 SSLClientSocket* DeterministicMockClientSocketFactory::CreateSSLClientSocket(
   1322     ClientSocketHandle* transport_socket,
   1323     const HostPortPair& host_and_port,
   1324     const SSLConfig& ssl_config,
   1325     SSLHostInfo* ssl_host_info,
   1326     CertVerifier* cert_verifier,
   1327     DnsCertProvenanceChecker* dns_cert_checker) {
   1328   MockSSLClientSocket* socket =
   1329       new MockSSLClientSocket(transport_socket, host_and_port, ssl_config,
   1330                               ssl_host_info, mock_ssl_data_.GetNext());
   1331   ssl_client_sockets_.push_back(socket);
   1332   return socket;
   1333 }
   1334 
   1335 void DeterministicMockClientSocketFactory::ClearSSLSessionCache() {
   1336 }
   1337 
   1338 MockSOCKSClientSocketPool::MockSOCKSClientSocketPool(
   1339     int max_sockets,
   1340     int max_sockets_per_group,
   1341     ClientSocketPoolHistograms* histograms,
   1342     TransportClientSocketPool* transport_pool)
   1343     : SOCKSClientSocketPool(max_sockets, max_sockets_per_group, histograms,
   1344                             NULL, transport_pool, NULL),
   1345       transport_pool_(transport_pool) {
   1346 }
   1347 
   1348 MockSOCKSClientSocketPool::~MockSOCKSClientSocketPool() {}
   1349 
   1350 int MockSOCKSClientSocketPool::RequestSocket(const std::string& group_name,
   1351                                              const void* socket_params,
   1352                                              RequestPriority priority,
   1353                                              ClientSocketHandle* handle,
   1354                                              CompletionCallback* callback,
   1355                                              const BoundNetLog& net_log) {
   1356   return transport_pool_->RequestSocket(group_name,
   1357                                         socket_params,
   1358                                         priority,
   1359                                         handle,
   1360                                         callback,
   1361                                         net_log);
   1362 }
   1363 
   1364 void MockSOCKSClientSocketPool::CancelRequest(
   1365     const std::string& group_name,
   1366     ClientSocketHandle* handle) {
   1367   return transport_pool_->CancelRequest(group_name, handle);
   1368 }
   1369 
   1370 void MockSOCKSClientSocketPool::ReleaseSocket(const std::string& group_name,
   1371                                               ClientSocket* socket, int id) {
   1372   return transport_pool_->ReleaseSocket(group_name, socket, id);
   1373 }
   1374 
   1375 const char kSOCKS5GreetRequest[] = { 0x05, 0x01, 0x00 };
   1376 const int kSOCKS5GreetRequestLength = arraysize(kSOCKS5GreetRequest);
   1377 
   1378 const char kSOCKS5GreetResponse[] = { 0x05, 0x00 };
   1379 const int kSOCKS5GreetResponseLength = arraysize(kSOCKS5GreetResponse);
   1380 
   1381 const char kSOCKS5OkRequest[] =
   1382     { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 };
   1383 const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest);
   1384 
   1385 const char kSOCKS5OkResponse[] =
   1386     { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 };
   1387 const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse);
   1388 
   1389 }  // namespace net
   1390