15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket_test_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/callback_helpers.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/address_family.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/address_list.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/auth.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_histograms.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_cert_request_info.h"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/ssl/ssl_connection_status_flags.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_info.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Socket events are easier to debug if you log individual reads and writes.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enable these if locally debugging, but they are too noisy for the waterfall.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_TRACE(level, s) DLOG(level) << s << __FUNCTION__ << "() "
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_TRACE(level, s) EAT_STREAM_PARAMETERS
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline char AsciifyHigh(char x) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char nybble = static_cast<char>((x >> 4) & 0x0F);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline char AsciifyLow(char x) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char nybble = static_cast<char>((x >> 0) & 0x0F);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return nybble + ((nybble < 0x0A) ? '0' : 'A' - 10);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline char Asciify(char x) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((x < 0) || !isprint(x))
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return '.';
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return x;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DumpData(const char* data, int data_len) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (logging::LOG_INFO < logging::GetMinLogLevel())
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Length:  " << data_len;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* pfx = "Data:    ";
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!data || (data_len <= 0)) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << pfx << "<None>";
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0; i <= (data_len - 4); i += 4) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(1) << pfx
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2])
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << AsciifyHigh(data[i + 3]) << AsciifyLow(data[i + 3])
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "  '"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << Asciify(data[i + 0])
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << Asciify(data[i + 1])
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << Asciify(data[i + 2])
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << Asciify(data[i + 3])
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << "'";
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pfx = "         ";
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Take care of any 'trailing' bytes, if data_len was not a multiple of 4.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (data_len - i) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case 3:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DVLOG(1) << pfx
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << AsciifyHigh(data[i + 2]) << AsciifyLow(data[i + 2])
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "    '"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << Asciify(data[i + 0])
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << Asciify(data[i + 1])
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << Asciify(data[i + 2])
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << " '";
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case 2:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DVLOG(1) << pfx
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << AsciifyHigh(data[i + 1]) << AsciifyLow(data[i + 1])
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "      '"
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << Asciify(data[i + 0])
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << Asciify(data[i + 1])
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "  '";
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case 1:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DVLOG(1) << pfx
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << AsciifyHigh(data[i + 0]) << AsciifyLow(data[i + 0])
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "        '"
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << Asciify(data[i + 0])
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "   '";
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <MockReadWriteType type>
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DumpMockReadWrite(const MockReadWrite<type>& r) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (logging::LOG_INFO < logging::GetMinLogLevel())
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Async:   " << (r.mode == ASYNC)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << "\nResult:  " << r.result;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DumpData(r.data, r.data_len);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* stop = (r.sequence_number & MockRead::STOPLOOP) ? " (STOP)" : "";
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Stage:   " << (r.sequence_number & ~MockRead::STOPLOOP) << stop
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << "\nTime:    " << r.time_stamp.ToInternalValue();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockConnect::MockConnect() : mode(ASYNC), result(OK) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber ip;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  peer_addr = IPEndPoint(ip, 0);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockConnect::MockConnect(IoMode io_mode, int r) : mode(io_mode), result(r) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber ip;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  peer_addr = IPEndPoint(ip, 0);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockConnect::MockConnect(IoMode io_mode, int r, IPEndPoint addr) :
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mode(io_mode),
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result(r),
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    peer_addr(addr) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockConnect::~MockConnect() {}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StaticSocketDataProvider::StaticSocketDataProvider()
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : reads_(NULL),
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_index_(0),
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_count_(0),
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      writes_(NULL),
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      write_index_(0),
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      write_count_(0) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StaticSocketDataProvider::StaticSocketDataProvider(MockRead* reads,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   size_t reads_count,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   MockWrite* writes,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   size_t writes_count)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : reads_(reads),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_index_(0),
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_count_(reads_count),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      writes_(writes),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      write_index_(0),
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      write_count_(writes_count) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StaticSocketDataProvider::~StaticSocketDataProvider() {}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MockRead& StaticSocketDataProvider::PeekRead() const {
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CHECK(!at_read_eof());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reads_[read_index_];
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MockWrite& StaticSocketDataProvider::PeekWrite() const {
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CHECK(!at_write_eof());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return writes_[write_index_];
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MockRead& StaticSocketDataProvider::PeekRead(size_t index) const {
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CHECK_LT(index, read_count_);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reads_[index];
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MockWrite& StaticSocketDataProvider::PeekWrite(size_t index) const {
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CHECK_LT(index, write_count_);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return writes_[index];
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockRead StaticSocketDataProvider::GetNextRead() {
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CHECK(!at_read_eof());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reads_[read_index_].time_stamp = base::Time::Now();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reads_[read_index_++];
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockWriteResult StaticSocketDataProvider::OnWrite(const std::string& data) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!writes_) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Not using mock writes; succeed synchronously.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MockWriteResult(SYNCHRONOUS, data.length());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(at_write_eof());
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (at_write_eof()) {
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Show what the extra write actually consists of.
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ("<unexpected write>", data);
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that what we are writing matches the expectation.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then give the mocked return value.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWrite* w = &writes_[write_index_++];
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w->time_stamp = base::Time::Now();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = w->result;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (w->data) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note - we can simulate a partial write here.  If the expected data
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // is a match, but shorter than the write actually written, that is legal.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Example:
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   Application writes "foobarbaz" (9 bytes)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   Expected write was "foo" (3 bytes)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   This is a success, and we return 3 to the application.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string expected_data(w->data, w->data_len);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GE(data.length(), expected_data.length());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string actual_data(data.substr(0, w->data_len));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_data, actual_data);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expected_data != actual_data)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (result == OK)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = w->data_len;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MockWriteResult(w->mode, result);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StaticSocketDataProvider::Reset() {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_index_ = 0;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  write_index_ = 0;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DynamicSocketDataProvider::DynamicSocketDataProvider()
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : short_read_limit_(0),
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allow_unconsumed_reads_(false) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DynamicSocketDataProvider::~DynamicSocketDataProvider() {}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockRead DynamicSocketDataProvider::GetNextRead() {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reads_.empty())
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MockRead(SYNCHRONOUS, ERR_UNEXPECTED);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRead result = reads_.front();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (short_read_limit_ == 0 || result.data_len <= short_read_limit_) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reads_.pop_front();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.data_len = short_read_limit_;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reads_.front().data += result.data_len;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reads_.front().data_len -= result.data_len;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DynamicSocketDataProvider::Reset() {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reads_.clear();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DynamicSocketDataProvider::SimulateRead(const char* data,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const size_t length) {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!allow_unconsumed_reads_) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reads_.empty()) << "Unconsumed read: " << reads_.front().data;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reads_.push_back(MockRead(ASYNC, data, length));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : connect(mode, result),
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_proto_status(SSLClientSocket::kNextProtoUnsupported),
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      was_npn_negotiated(false),
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      protocol_negotiated(kProtoUnknown),
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_cert_sent(false),
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cert_request_info(NULL),
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      channel_id_sent(false),
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      connection_status(0),
2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      should_pause_on_connect(false),
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      is_in_session_cache(false) {
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2,
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                &connection_status);
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set to TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SSLConnectionStatusSetCipherSuite(0xcc14, &connection_status);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLSocketDataProvider::~SSLSocketDataProvider() {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SSLSocketDataProvider::SetNextProto(NextProto proto) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  was_npn_negotiated = true;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_proto_status = SSLClientSocket::kNextProtoNegotiated;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protocol_negotiated = proto;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_proto = SSLClientSocket::NextProtoToString(proto);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DelayedSocketData::DelayedSocketData(
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int write_delay, MockRead* reads, size_t reads_count,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockWrite* writes, size_t writes_count)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      write_delay_(write_delay),
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_in_progress_(false),
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GE(write_delay_, 0);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DelayedSocketData::DelayedSocketData(
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MockConnect& connect, int write_delay, MockRead* reads,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t reads_count, MockWrite* writes, size_t writes_count)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      write_delay_(write_delay),
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_in_progress_(false),
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GE(write_delay_, 0);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_connect_data(connect);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DelayedSocketData::~DelayedSocketData() {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DelayedSocketData::ForceNextRead() {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(read_in_progress_);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  write_delay_ = 0;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompleteRead();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockRead DelayedSocketData::GetNextRead() {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRead out = MockRead(ASYNC, ERR_IO_PENDING);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (write_delay_ <= 0)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out = StaticSocketDataProvider::GetNextRead();
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_in_progress_ = (out.result == ERR_IO_PENDING);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return out;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockWriteResult DelayedSocketData::OnWrite(const std::string& data) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWriteResult rv = StaticSocketDataProvider::OnWrite(data);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now that our write has completed, we can allow reads to continue.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!--write_delay_ && read_in_progress_)
34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&DelayedSocketData::CompleteRead,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()),
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(100));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rv;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DelayedSocketData::Reset() {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_socket(NULL);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_in_progress_ = false;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  weak_factory_.InvalidateWeakPtrs();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider::Reset();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DelayedSocketData::CompleteRead() {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (socket() && read_in_progress_)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket()->OnReadComplete(GetNextRead());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OrderedSocketData::OrderedSocketData(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead* reads, size_t reads_count, MockWrite* writes, size_t writes_count)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sequence_number_(0), loop_stop_stage_(0),
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      blocked_(false), weak_factory_(this) {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OrderedSocketData::OrderedSocketData(
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MockConnect& connect,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead* reads, size_t reads_count,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockWrite* writes, size_t writes_count)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sequence_number_(0), loop_stop_stage_(0),
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      blocked_(false), weak_factory_(this) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_connect_data(connect);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OrderedSocketData::EndLoop() {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we've already stopped the loop, don't do it again until we've advanced
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the next sequence_number.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_ << ": EndLoop()";
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (loop_stop_stage_ > 0) {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MockRead& next_read = StaticSocketDataProvider::PeekRead();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((next_read.sequence_number & ~MockRead::STOPLOOP) >
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loop_stop_stage_) {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                << ": Clearing stop index";
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loop_stop_stage_ = 0;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the sequence_number at which we stopped the loop.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            << ": Posting Quit at read " << read_index();
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop_stop_stage_ = sequence_number_;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockRead OrderedSocketData::GetNextRead() {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  weak_factory_.InvalidateWeakPtrs();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_ = false;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MockRead& next_read = StaticSocketDataProvider::PeekRead();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (next_read.sequence_number & MockRead::STOPLOOP)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EndLoop();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((next_read.sequence_number & ~MockRead::STOPLOOP) <=
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sequence_number_++) {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_ - 1
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              << ": Read " << read_index();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DumpMockReadWrite(next_read);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blocked_ = (next_read.result == ERR_IO_PENDING);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return StaticSocketDataProvider::GetNextRead();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_ - 1
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            << ": I/O Pending";
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRead result = MockRead(ASYNC, ERR_IO_PENDING);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DumpMockReadWrite(result);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_ = true;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockWriteResult OrderedSocketData::OnWrite(const std::string& data) {
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            << ": Write " << write_index();
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DumpMockReadWrite(PeekWrite());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++sequence_number_;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (blocked_) {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(willchan): This 100ms delay seems to work around some weirdness.  We
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // should probably fix the weirdness.  One example is in SpdyStream,
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // DoSendRequest() will return ERR_IO_PENDING, and there's a race.  If the
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // SYN_REPLY causes OnResponseReceived() to get called before
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // SpdyStream::ReadResponseHeaders() is called, we hit a NOTREACHED().
43390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&OrderedSocketData::CompleteRead,
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_factory_.GetWeakPtr()),
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(100));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return StaticSocketDataProvider::OnWrite(data);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OrderedSocketData::Reset() {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NET_TRACE(INFO, "  *** ") << "Stage "
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            << sequence_number_ << ": Reset()";
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sequence_number_ = 0;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loop_stop_stage_ = 0;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_socket(NULL);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  weak_factory_.InvalidateWeakPtrs();
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider::Reset();
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OrderedSocketData::CompleteRead() {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (socket() && blocked_) {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket()->OnReadComplete(GetNextRead());
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OrderedSocketData::~OrderedSocketData() {}
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeterministicSocketData::DeterministicSocketData(MockRead* reads,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t reads_count, MockWrite* writes, size_t writes_count)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : StaticSocketDataProvider(reads, reads_count, writes, writes_count),
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sequence_number_(0),
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_read_(),
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_write_(),
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stopping_sequence_number_(0),
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stopped_(false),
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      print_debug_(false),
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_running_(false) {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyCorrectSequenceNumbers(reads, reads_count, writes, writes_count);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeterministicSocketData::~DeterministicSocketData() {}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicSocketData::Run() {
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!is_running_);
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_running_ = true;
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStopped(false);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int counter = 0;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Continue to consume data until all data has run out, or the stopped_ flag
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has been set. Consuming data requires two separate operations -- running
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the tasks in the message loop, and explicitly invoking the read/write
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callbacks (simulating network I/O). We check our conditions between each,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since they can change in either.
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while ((!at_write_eof() || !at_read_eof()) && !stopped()) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (counter % 2 == 0)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::RunLoop().RunUntilIdle();
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (counter % 2 == 1) {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InvokeCallbacks();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    counter++;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We're done consuming new data, but it is possible there are still some
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pending callbacks which we expect to complete before returning.
497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  while (delegate_.get() &&
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)         (delegate_->WritePending() || delegate_->ReadPending()) &&
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         !stopped()) {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InvokeCallbacks();
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStopped(false);
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_running_ = false;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicSocketData::RunFor(int steps) {
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopAfter(steps);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Run();
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicSocketData::SetStop(int seq) {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LT(sequence_number_, seq);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stopping_sequence_number_ = seq;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stopped_ = false;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicSocketData::StopAfter(int seq) {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStop(sequence_number_ + seq);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockRead DeterministicSocketData::GetNextRead() {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_read_ = StaticSocketDataProvider::PeekRead();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Synchronous read while stopped is an error
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stopped() && current_read_.mode == SYNCHRONOUS) {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to perform synchronous IO while stopped";
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MockRead(SYNCHRONOUS, ERR_UNEXPECTED);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Async read which will be called back in a future step.
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sequence_number_ < current_read_.sequence_number) {
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              << ": I/O Pending";
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead result = MockRead(SYNCHRONOUS, ERR_IO_PENDING);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (current_read_.mode == SYNCHRONOUS) {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Unable to perform synchronous read: "
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << current_read_.sequence_number
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << " at stage: " << sequence_number_;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = MockRead(SYNCHRONOUS, ERR_UNEXPECTED);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (print_debug_)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DumpMockReadWrite(result);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            << ": Read " << read_index();
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (print_debug_)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DumpMockReadWrite(current_read_);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increment the sequence number if IO is complete
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_read_.mode == SYNCHRONOUS)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NextStep();
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(ERR_IO_PENDING, current_read_.result);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider::GetNextRead();
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return current_read_;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockWriteResult DeterministicSocketData::OnWrite(const std::string& data) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MockWrite& next_write = StaticSocketDataProvider::PeekWrite();
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_write_ = next_write;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Synchronous write while stopped is an error
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stopped() && next_write.mode == SYNCHRONOUS) {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to perform synchronous IO while stopped";
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Async write which will be called back in a future step.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sequence_number_ < next_write.sequence_number) {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              << ": I/O Pending";
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (next_write.mode == SYNCHRONOUS) {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Unable to perform synchronous write: "
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << next_write.sequence_number << " at stage: " << sequence_number_;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NET_TRACE(INFO, "  *** ") << "Stage " << sequence_number_
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              << ": Write " << write_index();
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (print_debug_)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DumpMockReadWrite(next_write);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Move to the next step if I/O is synchronous, since the operation will
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // complete when this method returns.
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (next_write.mode == SYNCHRONOUS)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NextStep();
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is either a sync write for this step, or an async write.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return StaticSocketDataProvider::OnWrite(data);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicSocketData::Reset() {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NET_TRACE(INFO, "  *** ") << "Stage "
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            << sequence_number_ << ": Reset()";
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sequence_number_ = 0;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StaticSocketDataProvider::Reset();
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicSocketData::InvokeCallbacks() {
607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (delegate_.get() && delegate_->WritePending() &&
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (current_write().sequence_number == sequence_number())) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NextStep();
610b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    delegate_->CompleteWrite();
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (delegate_.get() && delegate_->ReadPending() &&
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (current_read().sequence_number == sequence_number())) {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NextStep();
616b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    delegate_->CompleteRead();
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicSocketData::NextStep() {
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invariant: Can never move *past* the stopping step.
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LT(sequence_number_, stopping_sequence_number_);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sequence_number_++;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sequence_number_ == stopping_sequence_number_)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetStopped(true);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicSocketData::VerifyCorrectSequenceNumbers(
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockRead* reads, size_t reads_count,
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockWrite* writes, size_t writes_count) {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t read = 0;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t write = 0;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected = 0;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (read < reads_count || write < writes_count) {
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check to see that we have a read or write at the expected
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // state.
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (read < reads_count  && reads[read].sequence_number == expected) {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++read;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++expected;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (write < writes_count && writes[write].sequence_number == expected) {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++write;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++expected;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Missing sequence number: " << expected;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(read, reads_count);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(write, writes_count);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockClientSocketFactory::MockClientSocketFactory() {}
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockClientSocketFactory::~MockClientSocketFactory() {}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockClientSocketFactory::AddSocketDataProvider(
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SocketDataProvider* data) {
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_data_.Add(data);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockClientSocketFactory::AddSSLSocketDataProvider(
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SSLSocketDataProvider* data) {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_ssl_data_.Add(data);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockClientSocketFactory::ResetNextMockIndexes() {
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_data_.ResetNextIndex();
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_ssl_data_.ResetNextIndex();
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_ptr<DatagramClientSocket>
6753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)MockClientSocketFactory::CreateDatagramClientSocket(
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DatagramSocket::BindType bind_type,
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const RandIntCallback& rand_int_cb,
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::NetLog* net_log,
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::NetLog::Source& source) {
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketDataProvider* data_provider = mock_data_.GetNext();
6813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<MockUDPClientSocket> socket(
6823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new MockUDPClientSocket(data_provider, net_log));
6833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  data_provider->set_socket(socket.get());
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (bind_type == DatagramSocket::RANDOM_BIND)
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    socket->set_source_port(rand_int_cb.Run(1025, 65535));
6863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return socket.PassAs<DatagramClientSocket>();
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_ptr<StreamSocket> MockClientSocketFactory::CreateTransportClientSocket(
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AddressList& addresses,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::NetLog* net_log,
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::NetLog::Source& source) {
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SocketDataProvider* data_provider = mock_data_.GetNext();
6943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<MockTCPClientSocket> socket(
6953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new MockTCPClientSocket(addresses, net_log, data_provider));
6963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  data_provider->set_socket(socket.get());
6973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return socket.PassAs<StreamSocket>();
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_ptr<SSLClientSocket> MockClientSocketFactory::CreateSSLClientSocket(
7013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<ClientSocketHandle> transport_socket,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostPortPair& host_and_port,
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SSLConfig& ssl_config,
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SSLClientSocketContext& context) {
7055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<MockSSLClientSocket> socket(
7063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new MockSSLClientSocket(transport_socket.Pass(),
7075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              host_and_port,
7085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              ssl_config,
7093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              mock_ssl_data_.GetNext()));
7105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ssl_client_sockets_.push_back(socket.get());
7115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return socket.PassAs<SSLClientSocket>();
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockClientSocketFactory::ClearSSLSessionCache() {
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char MockClientSocket::kTlsUnique[] = "MOCK_TLSUNIQ";
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockClientSocket::MockClientSocket(const BoundNetLog& net_log)
720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : connected_(false),
721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      net_log_(net_log),
722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      weak_factory_(this) {
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber ip;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  peer_addr_ = IPEndPoint(ip, 0);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
728c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint MockClientSocket::SetReceiveBufferSize(int32 size) {
729c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return OK;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint MockClientSocket::SetSendBufferSize(int32 size) {
733c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return OK;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockClientSocket::Disconnect() {
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connected_ = false;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockClientSocket::IsConnected() const {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return connected_;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockClientSocket::IsConnectedAndIdle() const {
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return connected_;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockClientSocket::GetPeerAddress(IPEndPoint* address) const {
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsConnected())
750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return ERR_SOCKET_NOT_CONNECTED;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *address = peer_addr_;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockClientSocket::GetLocalAddress(IPEndPoint* address) const {
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber ip;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip);
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(rv);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *address = IPEndPoint(ip, 123);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const BoundNetLog& MockClientSocket::NetLog() const {
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net_log_;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)std::string MockClientSocket::GetSessionCacheKey() const {
76803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  NOTIMPLEMENTED();
76903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return std::string();
77003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
77103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool MockClientSocket::InSessionCache() const {
7735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTIMPLEMENTED();
7745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return false;
7755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
7765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void MockClientSocket::SetHandshakeCompletionCallback(const base::Closure& cb) {
7785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTIMPLEMENTED();
7795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
7805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockClientSocket::GetSSLCertRequestInfo(
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLCertRequestInfo* cert_request_info) {
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockClientSocket::ExportKeyingMaterial(const base::StringPiece& label,
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           bool has_context,
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const base::StringPiece& context,
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           unsigned char* out,
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           unsigned int outlen) {
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(out, 'A', outlen);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockClientSocket::GetTLSUniqueChannelBinding(std::string* out) {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  out->assign(MockClientSocket::kTlsUnique);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ChannelIDService* MockClientSocket::GetChannelIDService() const {
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocket::NextProtoStatus
8055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)MockClientSocket::GetNextProto(std::string* proto) {
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto->clear();
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SSLClientSocket::kNextProtoUnsupported;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)scoped_refptr<X509Certificate>
811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MockClientSocket::GetUnverifiedServerCertificateChain() const {
812a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTREACHED();
813a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return NULL;
814a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockClientSocket::~MockClientSocket() {}
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockClientSocket::RunCallbackAsync(const CompletionCallback& callback,
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        int result) {
82090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
82190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FROM_HERE,
82290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&MockClientSocket::RunCallback,
82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
82490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 callback,
82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 result));
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockClientSocket::RunCallback(const net::CompletionCallback& callback,
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int result) {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!callback.is_null())
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(result);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockTCPClientSocket::MockTCPClientSocket(const AddressList& addresses,
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         net::NetLog* net_log,
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         SocketDataProvider* data)
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : MockClientSocket(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)),
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      addresses_(addresses),
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_(data),
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_offset_(0),
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_data_(SYNCHRONOUS, ERR_UNEXPECTED),
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      need_read_data_(true),
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      peer_closed_connection_(false),
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_buf_(NULL),
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_buf_len_(0),
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      was_used_to_convey_data_(false) {
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(data_);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  peer_addr_ = data->connect_data().peer_addr;
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data_->Reset();
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockTCPClientSocket::~MockTCPClientSocket() {}
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockTCPClientSocket::Read(IOBuffer* buf, int buf_len,
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const CompletionCallback& callback) {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!connected_)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_UNEXPECTED;
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the buffer is already in use, a read is already in progress!
8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(pending_buf_.get() == NULL);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Store our async IO data.
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_buf_ = buf;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_buf_len_ = buf_len;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_callback_ = callback;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (need_read_data_) {
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_data_ = data_->GetNextRead();
869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (read_data_.result == ERR_CONNECTION_CLOSED) {
870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // This MockRead is just a marker to instruct us to set
871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // peer_closed_connection_.
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      peer_closed_connection_ = true;
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (read_data_.result == ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ) {
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // This MockRead is just a marker to instruct us to set
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // peer_closed_connection_.  Skip it and get the next one.
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_data_ = data_->GetNextRead();
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      peer_closed_connection_ = true;
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to complete the async IO manually later (via OnReadComplete).
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (read_data_.result == ERR_IO_PENDING) {
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We need to be using async IO in this case.
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(!callback.is_null());
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ERR_IO_PENDING;
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    need_read_data_ = false;
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CompleteRead();
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockTCPClientSocket::Write(IOBuffer* buf, int buf_len,
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const CompletionCallback& callback) {
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(buf);
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(buf_len, 0);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!connected_)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_UNEXPECTED;
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data(buf->data(), buf_len);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWriteResult write_result = data_->OnWrite(data);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  was_used_to_convey_data_ = true;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (write_result.mode == ASYNC) {
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunCallbackAsync(callback, write_result.result);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_IO_PENDING;
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return write_result.result;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockTCPClientSocket::Connect(const CompletionCallback& callback) {
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (connected_)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connected_ = true;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  peer_closed_connection_ = false;
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_->connect_data().mode == ASYNC) {
920eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (data_->connect_data().result == ERR_IO_PENDING)
921eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      pending_callback_ = callback;
922eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    else
923eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      RunCallbackAsync(callback, data_->connect_data().result);
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_IO_PENDING;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_->connect_data().result;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockTCPClientSocket::Disconnect() {
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockClientSocket::Disconnect();
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_callback_.Reset();
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockTCPClientSocket::IsConnected() const {
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return connected_ && !peer_closed_connection_;
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockTCPClientSocket::IsConnectedAndIdle() const {
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IsConnected();
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockTCPClientSocket::GetPeerAddress(IPEndPoint* address) const {
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (addresses_.empty())
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return MockClientSocket::GetPeerAddress(address);
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *address = addresses_[0];
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return OK;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockTCPClientSocket::WasEverUsed() const {
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return was_used_to_convey_data_;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockTCPClientSocket::UsingTCPFastOpen() const {
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockTCPClientSocket::WasNpnNegotiated() const {
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockTCPClientSocket::OnReadComplete(const MockRead& data) {
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There must be a read pending.
9681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(pending_buf_.get());
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // You can't complete a read with another ERR_IO_PENDING status code.
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(ERR_IO_PENDING, data.result);
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since we've been waiting for data, need_read_data_ should be true.
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(need_read_data_);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_data_ = data;
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  need_read_data_ = false;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The caller is simulating that this IO completes right now.  Don't
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // let CompleteRead() schedule a callback.
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_data_.mode = SYNCHRONOUS;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompletionCallback callback = pending_callback_;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = CompleteRead();
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunCallback(callback, rv);
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid MockTCPClientSocket::OnConnectComplete(const MockConnect& data) {
987eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CompletionCallback callback = pending_callback_;
988eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RunCallback(callback, data.result);
989eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
990eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockTCPClientSocket::CompleteRead() {
9921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(pending_buf_.get());
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(pending_buf_len_ > 0);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  was_used_to_convey_data_ = true;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the pending async IO data and reset our |pending_| state.
9988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_refptr<IOBuffer> buf = pending_buf_;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int buf_len = pending_buf_len_;
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompletionCallback callback = pending_callback_;
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_buf_ = NULL;
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_buf_len_ = 0;
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_callback_.Reset();
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = read_data_.result;
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(result != ERR_IO_PENDING);
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (read_data_.data) {
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (read_data_.data_len - read_offset_ > 0) {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = std::min(buf_len, read_data_.data_len - read_offset_);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(buf->data(), read_data_.data + read_offset_, result);
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_offset_ += result;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (read_offset_ == read_data_.data_len) {
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        need_read_data_ = true;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        read_offset_ = 0;
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = 0;  // EOF
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (read_data_.mode == ASYNC) {
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!callback.is_null());
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunCallbackAsync(callback, result);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_IO_PENDING;
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1030b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)DeterministicSocketHelper::DeterministicSocketHelper(
1031b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    net::NetLog* net_log,
1032b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DeterministicSocketData* data)
1033b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    : write_pending_(false),
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      write_result_(0),
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_data_(),
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_buf_(NULL),
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_buf_len_(0),
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_pending_(false),
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_(data),
1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      was_used_to_convey_data_(false),
1041b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      peer_closed_connection_(false),
1042b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)) {
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)DeterministicSocketHelper::~DeterministicSocketHelper() {}
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1047b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void DeterministicSocketHelper::CompleteWrite() {
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  was_used_to_convey_data_ = true;
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  write_pending_ = false;
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  write_callback_.Run(write_result_);
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1053b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicSocketHelper::CompleteRead() {
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(read_buf_len_, 0);
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LE(read_data_.data_len, read_buf_len_);
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(read_buf_);
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  was_used_to_convey_data_ = true;
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (read_data_.result == ERR_IO_PENDING)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_data_ = data_->GetNextRead();
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(ERR_IO_PENDING, read_data_.result);
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If read_data_.mode is ASYNC, we do not need to wait, since this is already
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the callback. Therefore we don't even bother to check it.
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = read_data_.result;
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (read_data_.data_len > 0) {
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(read_data_.data);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = std::min(read_buf_len_, read_data_.data_len);
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(read_buf_->data(), read_data_.data, result);
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (read_pending_) {
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_pending_ = false;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_callback_.Run(result);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1081b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicSocketHelper::Write(
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(buf);
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(buf_len, 0);
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data(buf->data(), buf_len);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWriteResult write_result = data_->OnWrite(data);
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (write_result.mode == ASYNC) {
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    write_callback_ = callback;
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    write_result_ = write_result.result;
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!write_callback_.is_null());
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    write_pending_ = true;
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_IO_PENDING;
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  was_used_to_convey_data_ = true;
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  write_pending_ = false;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return write_result.result;
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicSocketHelper::Read(
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_data_ = data_->GetNextRead();
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The buffer should always be big enough to contain all the MockRead data. To
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use small buffers, split the data into multiple MockReads.
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LE(read_data_.data_len, buf_len);
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (read_data_.result == ERR_CONNECTION_CLOSED) {
1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This MockRead is just a marker to instruct us to set
1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // peer_closed_connection_.
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    peer_closed_connection_ = true;
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (read_data_.result == ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ) {
1116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This MockRead is just a marker to instruct us to set
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // peer_closed_connection_.  Skip it and get the next one.
1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    read_data_ = data_->GetNextRead();
1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    peer_closed_connection_ = true;
1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_buf_ = buf;
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_buf_len_ = buf_len;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_callback_ = callback;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (read_data_.mode == ASYNC || (read_data_.result == ERR_IO_PENDING)) {
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_pending_ = true;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!read_callback_.is_null());
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_IO_PENDING;
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  was_used_to_convey_data_ = true;
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CompleteRead();
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)DeterministicMockUDPClientSocket::DeterministicMockUDPClientSocket(
1137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    net::NetLog* net_log,
1138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DeterministicSocketData* data)
1139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    : connected_(false),
11405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      helper_(net_log, data),
11415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_port_(123) {
1142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)DeterministicMockUDPClientSocket::~DeterministicMockUDPClientSocket() {}
1145b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool DeterministicMockUDPClientSocket::WritePending() const {
1147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.write_pending();
1148b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1150b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool DeterministicMockUDPClientSocket::ReadPending() const {
1151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.read_pending();
1152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void DeterministicMockUDPClientSocket::CompleteWrite() {
1155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  helper_.CompleteWrite();
1156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicMockUDPClientSocket::CompleteRead() {
1159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.CompleteRead();
1160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicMockUDPClientSocket::Connect(const IPEndPoint& address) {
1163b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (connected_)
1164b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return OK;
1165b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  connected_ = true;
1166b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  peer_address_ = address;
1167b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.data()->connect_data().result;
1168b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
1169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicMockUDPClientSocket::Write(
1171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    IOBuffer* buf,
1172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    int buf_len,
1173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const CompletionCallback& callback) {
1174b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!connected_)
1175b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return ERR_UNEXPECTED;
1176b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1177b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.Write(buf, buf_len, callback);
1178b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1179b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1180b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicMockUDPClientSocket::Read(
1181b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    IOBuffer* buf,
1182b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    int buf_len,
1183b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const CompletionCallback& callback) {
1184b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!connected_)
1185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return ERR_UNEXPECTED;
1186b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.Read(buf, buf_len, callback);
1188b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint DeterministicMockUDPClientSocket::SetReceiveBufferSize(int32 size) {
1191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return OK;
1192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint DeterministicMockUDPClientSocket::SetSendBufferSize(int32 size) {
1195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return OK;
1196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void DeterministicMockUDPClientSocket::Close() {
1199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  connected_ = false;
1200b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1201b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1202b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicMockUDPClientSocket::GetPeerAddress(
1203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    IPEndPoint* address) const {
1204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  *address = peer_address_;
1205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return OK;
1206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1208b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicMockUDPClientSocket::GetLocalAddress(
1209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    IPEndPoint* address) const {
1210b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  IPAddressNumber ip;
1211b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip);
1212b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK(rv);
12135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *address = IPEndPoint(ip, source_port_);
1214b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return OK;
1215b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const BoundNetLog& DeterministicMockUDPClientSocket::NetLog() const {
1218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.net_log();
1219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void DeterministicMockUDPClientSocket::OnReadComplete(const MockRead& data) {}
1222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DeterministicMockUDPClientSocket::OnConnectComplete(
1224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const MockConnect& data) {
1225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  NOTIMPLEMENTED();
1226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)DeterministicMockTCPClientSocket::DeterministicMockTCPClientSocket(
1229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    net::NetLog* net_log,
1230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DeterministicSocketData* data)
1231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    : MockClientSocket(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)),
1232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      helper_(net_log, data) {
1233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  peer_addr_ = data->connect_data().peer_addr;
1234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)DeterministicMockTCPClientSocket::~DeterministicMockTCPClientSocket() {}
1237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool DeterministicMockTCPClientSocket::WritePending() const {
1239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.write_pending();
1240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1242b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool DeterministicMockTCPClientSocket::ReadPending() const {
1243b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.read_pending();
1244b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1246b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void DeterministicMockTCPClientSocket::CompleteWrite() {
1247b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  helper_.CompleteWrite();
1248b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1249b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1250b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicMockTCPClientSocket::CompleteRead() {
1251b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.CompleteRead();
1252b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1253b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1254b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicMockTCPClientSocket::Write(
1255b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    IOBuffer* buf,
1256b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    int buf_len,
1257b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const CompletionCallback& callback) {
1258b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!connected_)
1259b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return ERR_UNEXPECTED;
1260b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1261b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.Write(buf, buf_len, callback);
1262b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1263b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1264b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)int DeterministicMockTCPClientSocket::Read(
1265b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    IOBuffer* buf,
1266b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    int buf_len,
1267b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const CompletionCallback& callback) {
1268b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!connected_)
1269b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return ERR_UNEXPECTED;
1270b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1271b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.Read(buf, buf_len, callback);
1272b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1273b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(erikchen): Support connect sequencing.
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DeterministicMockTCPClientSocket::Connect(
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback) {
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (connected_)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connected_ = true;
1280b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (helper_.data()->connect_data().mode == ASYNC) {
1281b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    RunCallbackAsync(callback, helper_.data()->connect_data().result);
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_IO_PENDING;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1284b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.data()->connect_data().result;
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicMockTCPClientSocket::Disconnect() {
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockClientSocket::Disconnect();
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeterministicMockTCPClientSocket::IsConnected() const {
1292b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return connected_ && !helper_.peer_closed_connection();
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeterministicMockTCPClientSocket::IsConnectedAndIdle() const {
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IsConnected();
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeterministicMockTCPClientSocket::WasEverUsed() const {
1300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return helper_.was_used_to_convey_data();
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeterministicMockTCPClientSocket::UsingTCPFastOpen() const {
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeterministicMockTCPClientSocket::WasNpnNegotiated() const {
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeterministicMockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicMockTCPClientSocket::OnReadComplete(const MockRead& data) {}
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DeterministicMockTCPClientSocket::OnConnectComplete(
1318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const MockConnect& data) {}
1319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockSSLClientSocket::MockSSLClientSocket(
13213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<ClientSocketHandle> transport_socket,
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostPortPair& host_port_pair,
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SSLConfig& ssl_config,
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SSLSocketDataProvider* data)
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : MockClientSocket(
13265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          // Have to use the right BoundNetLog for LoadTimingInfo regression
13275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          // tests.
13285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          transport_socket->socket()->NetLog()),
13293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      transport_(transport_socket.Pass()),
133003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      host_port_pair_(host_port_pair),
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_(data),
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_npn_state_set_(false),
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_npn_value_(false),
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_protocol_negotiated_set_(false),
13355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      protocol_negotiated_(kProtoUnknown),
13365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      next_connect_state_(STATE_NONE),
13375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      reached_connect_(false),
13385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      weak_factory_(this) {
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(data_);
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  peer_addr_ = data->connect.peer_addr;
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockSSLClientSocket::~MockSSLClientSocket() {
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Disconnect();
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockSSLClientSocket::Read(IOBuffer* buf, int buf_len,
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const CompletionCallback& callback) {
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transport_->socket()->Read(buf, buf_len, callback);
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockSSLClientSocket::Write(IOBuffer* buf, int buf_len,
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const CompletionCallback& callback) {
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transport_->socket()->Write(buf, buf_len, callback);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockSSLClientSocket::Connect(const CompletionCallback& callback) {
13586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  next_connect_state_ = STATE_SSL_CONNECT;
13595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  reached_connect_ = true;
13605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int rv = DoConnectLoop(OK);
13615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (rv == ERR_IO_PENDING)
13625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    connect_callback_ = callback;
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rv;
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockSSLClientSocket::Disconnect() {
13675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  weak_factory_.InvalidateWeakPtrs();
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockClientSocket::Disconnect();
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (transport_->socket() != NULL)
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    transport_->socket()->Disconnect();
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockSSLClientSocket::IsConnected() const {
13745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return transport_->socket()->IsConnected() && connected_;
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockSSLClientSocket::WasEverUsed() const {
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transport_->socket()->WasEverUsed();
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockSSLClientSocket::UsingTCPFastOpen() const {
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transport_->socket()->UsingTCPFastOpen();
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockSSLClientSocket::GetPeerAddress(IPEndPoint* address) const {
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transport_->socket()->GetPeerAddress(address);
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockSSLClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_info->Reset();
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_info->cert = data_->cert;
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_info->client_cert_sent = data_->client_cert_sent;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_info->channel_id_sent = data_->channel_id_sent;
1394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ssl_info->connection_status = data_->connection_status;
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)std::string MockSSLClientSocket::GetSessionCacheKey() const {
139903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // For the purposes of these tests, |host_and_port| will serve as the
140003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // cache key.
140103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return host_port_pair_.ToString();
140203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
140303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool MockSSLClientSocket::InSessionCache() const {
14055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return data_->is_in_session_cache;
14065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
14075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
14085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void MockSSLClientSocket::SetHandshakeCompletionCallback(
14095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::Closure& cb) {
14105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  handshake_completion_callback_ = cb;
14115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
14125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockSSLClientSocket::GetSSLCertRequestInfo(
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SSLCertRequestInfo* cert_request_info) {
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(cert_request_info);
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_->cert_request_info) {
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cert_request_info->host_and_port =
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_->cert_request_info->host_and_port;
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cert_request_info->client_certs = data_->cert_request_info->client_certs;
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cert_request_info->Reset();
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocket::NextProtoStatus MockSSLClientSocket::GetNextProto(
14265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::string* proto) {
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *proto = data_->next_proto;
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_->next_proto_status;
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockSSLClientSocket::set_was_npn_negotiated(bool negotiated) {
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_npn_state_set_ = true;
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new_npn_value_ = negotiated;
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockSSLClientSocket::WasNpnNegotiated() const {
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_npn_state_set_)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new_npn_value_;
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_->was_npn_negotiated;
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NextProto MockSSLClientSocket::GetNegotiatedProtocol() const {
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_protocol_negotiated_set_)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return protocol_negotiated_;
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_->protocol_negotiated;
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockSSLClientSocket::set_protocol_negotiated(
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NextProto protocol_negotiated) {
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_protocol_negotiated_set_ = true;
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protocol_negotiated_ = protocol_negotiated;
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockSSLClientSocket::WasChannelIDSent() const {
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_->channel_id_sent;
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockSSLClientSocket::set_channel_id_sent(bool channel_id_sent) {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data_->channel_id_sent = channel_id_sent;
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ChannelIDService* MockSSLClientSocket::GetChannelIDService() const {
14635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return data_->channel_id_service;
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockSSLClientSocket::OnReadComplete(const MockRead& data) {
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid MockSSLClientSocket::OnConnectComplete(const MockConnect& data) {
1471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  NOTIMPLEMENTED();
1472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
14745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void MockSSLClientSocket::RestartPausedConnect() {
14756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(data_->should_pause_on_connect);
14765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK_EQ(next_connect_state_, STATE_SSL_CONNECT_COMPLETE);
14775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  OnIOComplete(data_->connect.result);
14785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
14795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
14805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void MockSSLClientSocket::OnIOComplete(int result) {
14815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int rv = DoConnectLoop(result);
14825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (rv != ERR_IO_PENDING)
14835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::ResetAndReturn(&connect_callback_).Run(rv);
14845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
14855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
14865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int MockSSLClientSocket::DoConnectLoop(int result) {
14875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK_NE(next_connect_state_, STATE_NONE);
14885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
14895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int rv = result;
14905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  do {
14915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ConnectState state = next_connect_state_;
14925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    next_connect_state_ = STATE_NONE;
14935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    switch (state) {
14945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      case STATE_SSL_CONNECT:
14955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        rv = DoSSLConnect();
14965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        break;
14975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      case STATE_SSL_CONNECT_COMPLETE:
14985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        rv = DoSSLConnectComplete(rv);
14995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        break;
15005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      default:
15015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        NOTREACHED() << "bad state";
15025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        rv = ERR_UNEXPECTED;
15035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        break;
15045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
15055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } while (rv != ERR_IO_PENDING && next_connect_state_ != STATE_NONE);
15065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return rv;
15085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
15095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int MockSSLClientSocket::DoSSLConnect() {
15115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  next_connect_state_ = STATE_SSL_CONNECT_COMPLETE;
15125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (data_->should_pause_on_connect)
15145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return ERR_IO_PENDING;
15155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (data_->connect.mode == ASYNC) {
15175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
15185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        FROM_HERE,
15195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::Bind(&MockSSLClientSocket::OnIOComplete,
15205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   weak_factory_.GetWeakPtr(),
15215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   data_->connect.result));
15225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return ERR_IO_PENDING;
15235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
15245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return data_->connect.result;
15265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
15275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int MockSSLClientSocket::DoSSLConnectComplete(int result) {
15295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (result == OK)
15305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    connected_ = true;
15315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!handshake_completion_callback_.is_null())
15335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::ResetAndReturn(&handshake_completion_callback_).Run();
15345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return result;
15355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
15365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockUDPClientSocket::MockUDPClientSocket(SocketDataProvider* data,
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         net::NetLog* net_log)
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : connected_(false),
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_(data),
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_offset_(0),
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_data_(SYNCHRONOUS, ERR_UNEXPECTED),
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      need_read_data_(true),
15445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_port_(123),
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_buf_(NULL),
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_buf_len_(0),
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_NONE)),
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(data_);
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data_->Reset();
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  peer_addr_ = data->connect_data().peer_addr;
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockUDPClientSocket::~MockUDPClientSocket() {}
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int MockUDPClientSocket::Read(IOBuffer* buf,
15575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              int buf_len,
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const CompletionCallback& callback) {
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!connected_)
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_UNEXPECTED;
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the buffer is already in use, a read is already in progress!
15631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(pending_buf_.get() == NULL);
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Store our async IO data.
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_buf_ = buf;
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_buf_len_ = buf_len;
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_callback_ = callback;
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (need_read_data_) {
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_data_ = data_->GetNextRead();
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to complete the async IO manually later (via OnReadComplete).
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (read_data_.result == ERR_IO_PENDING) {
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We need to be using async IO in this case.
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(!callback.is_null());
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ERR_IO_PENDING;
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    need_read_data_ = false;
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CompleteRead();
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockUDPClientSocket::Write(IOBuffer* buf, int buf_len,
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const CompletionCallback& callback) {
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(buf);
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(buf_len, 0);
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!connected_)
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_UNEXPECTED;
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data(buf->data(), buf_len);
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWriteResult write_result = data_->OnWrite(data);
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (write_result.mode == ASYNC) {
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunCallbackAsync(callback, write_result.result);
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_IO_PENDING;
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return write_result.result;
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1603c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint MockUDPClientSocket::SetReceiveBufferSize(int32 size) {
1604c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return OK;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1607c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint MockUDPClientSocket::SetSendBufferSize(int32 size) {
1608c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return OK;
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockUDPClientSocket::Close() {
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connected_ = false;
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockUDPClientSocket::GetPeerAddress(IPEndPoint* address) const {
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *address = peer_addr_;
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockUDPClientSocket::GetLocalAddress(IPEndPoint* address) const {
1621b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  IPAddressNumber ip;
1622b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip);
1623b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CHECK(rv);
16245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *address = IPEndPoint(ip, source_port_);
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const BoundNetLog& MockUDPClientSocket::NetLog() const {
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net_log_;
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockUDPClientSocket::Connect(const IPEndPoint& address) {
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connected_ = true;
163490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  peer_addr_ = address;
1635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return data_->connect_data().result;
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockUDPClientSocket::OnReadComplete(const MockRead& data) {
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There must be a read pending.
16401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(pending_buf_.get());
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // You can't complete a read with another ERR_IO_PENDING status code.
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(ERR_IO_PENDING, data.result);
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since we've been waiting for data, need_read_data_ should be true.
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(need_read_data_);
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_data_ = data;
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  need_read_data_ = false;
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The caller is simulating that this IO completes right now.  Don't
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // let CompleteRead() schedule a callback.
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  read_data_.mode = SYNCHRONOUS;
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CompletionCallback callback = pending_callback_;
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = CompleteRead();
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunCallback(callback, rv);
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid MockUDPClientSocket::OnConnectComplete(const MockConnect& data) {
1659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  NOTIMPLEMENTED();
1660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockUDPClientSocket::CompleteRead() {
16631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(pending_buf_.get());
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(pending_buf_len_ > 0);
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the pending async IO data and reset our |pending_| state.
16678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_refptr<IOBuffer> buf = pending_buf_;
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int buf_len = pending_buf_len_;
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompletionCallback callback = pending_callback_;
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_buf_ = NULL;
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_buf_len_ = 0;
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_callback_.Reset();
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = read_data_.result;
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(result != ERR_IO_PENDING);
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (read_data_.data) {
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (read_data_.data_len - read_offset_ > 0) {
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = std::min(buf_len, read_data_.data_len - read_offset_);
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(buf->data(), read_data_.data + read_offset_, result);
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read_offset_ += result;
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (read_offset_ == read_data_.data_len) {
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        need_read_data_ = true;
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        read_offset_ = 0;
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = 0;  // EOF
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (read_data_.mode == ASYNC) {
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!callback.is_null());
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunCallbackAsync(callback, result);
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ERR_IO_PENDING;
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockUDPClientSocket::RunCallbackAsync(const CompletionCallback& callback,
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int result) {
170190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
170390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&MockUDPClientSocket::RunCallback,
170490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
170590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 callback,
170690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 result));
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockUDPClientSocket::RunCallback(const CompletionCallback& callback,
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int result) {
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!callback.is_null())
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(result);
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestSocketRequest::TestSocketRequest(
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<TestSocketRequest*>* request_order, size_t* completion_count)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : request_order_(request_order),
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      completion_count_(completion_count),
1719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      callback_(base::Bind(&TestSocketRequest::OnComplete,
1720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           base::Unretained(this))) {
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(request_order);
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(completion_count);
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestSocketRequest::~TestSocketRequest() {
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSocketRequest::OnComplete(int result) {
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetResult(result);
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*completion_count_)++;
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_order_->push_back(this);
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int ClientSocketPoolTest::kIndexOutOfBounds = -1;
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int ClientSocketPoolTest::kRequestNotFound = -2;
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClientSocketPoolTest::ClientSocketPoolTest() : completion_count_(0) {}
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClientSocketPoolTest::~ClientSocketPoolTest() {}
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ClientSocketPoolTest::GetOrderOfRequest(size_t index) const {
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  index--;
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index >= requests_.size())
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kIndexOutOfBounds;
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < request_order_.size(); i++)
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (requests_[index] == request_order_[i])
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return i + 1;
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kRequestNotFound;
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ClientSocketPoolTest::ReleaseOneConnection(KeepAlive keep_alive) {
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<TestSocketRequest>::iterator i;
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = requests_.begin(); i != requests_.end(); ++i) {
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*i)->handle()->is_initialized()) {
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (keep_alive == NO_KEEP_ALIVE)
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (*i)->handle()->socket()->Disconnect();
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*i)->handle()->Reset();
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::RunLoop().RunUntilIdle();
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClientSocketPoolTest::ReleaseAllConnections(KeepAlive keep_alive) {
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool released_one;
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    released_one = ReleaseOneConnection(keep_alive);
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (released_one);
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockTransportClientSocketPool::MockConnectJob::MockConnectJob(
17773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<StreamSocket> socket,
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClientSocketHandle* handle,
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback)
17803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : socket_(socket.Pass()),
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      handle_(handle),
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_callback_(callback) {
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockTransportClientSocketPool::MockConnectJob::~MockConnectJob() {}
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockTransportClientSocketPool::MockConnectJob::Connect() {
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = socket_->Connect(base::Bind(&MockConnectJob::OnConnect,
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       base::Unretained(this)));
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv == OK) {
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_callback_.Reset();
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnConnect(OK);
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rv;
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockTransportClientSocketPool::MockConnectJob::CancelHandle(
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ClientSocketHandle* handle) {
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle != handle_)
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  socket_.reset();
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handle_ = NULL;
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_callback_.Reset();
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockTransportClientSocketPool::MockConnectJob::OnConnect(int rv) {
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!socket_.get())
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv == OK) {
18113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    handle_->SetSocket(socket_.Pass());
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Needed for socket pool tests that layer other sockets on top of mock
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // sockets.
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo::ConnectTiming connect_timing;
18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeTicks now = base::TimeTicks::Now();
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connect_timing.dns_start = now;
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connect_timing.dns_end = now;
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connect_timing.connect_start = now;
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connect_timing.connect_end = now;
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    handle_->set_connect_timing(connect_timing);
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_.reset();
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handle_ = NULL;
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!user_callback_.is_null()) {
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CompletionCallback callback = user_callback_;
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_callback_.Reset();
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(rv);
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockTransportClientSocketPool::MockTransportClientSocketPool(
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int max_sockets,
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int max_sockets_per_group,
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClientSocketPoolHistograms* histograms,
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClientSocketFactory* socket_factory)
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : TransportClientSocketPool(max_sockets, max_sockets_per_group, histograms,
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                NULL, NULL, NULL),
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_socket_factory_(socket_factory),
18433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      last_request_priority_(DEFAULT_PRIORITY),
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      release_count_(0),
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cancel_count_(0) {
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockTransportClientSocketPool::~MockTransportClientSocketPool() {}
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockTransportClientSocketPool::RequestSocket(
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name, const void* socket_params,
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RequestPriority priority, ClientSocketHandle* handle,
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback, const BoundNetLog& net_log) {
18543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  last_request_priority_ = priority;
18553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<StreamSocket> socket =
18563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      client_socket_factory_->CreateTransportClientSocket(
18573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          AddressList(), net_log.net_log(), net::NetLog::Source());
18583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  MockConnectJob* job = new MockConnectJob(socket.Pass(), handle, callback);
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job_list_.push_back(job);
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handle->set_pool_id(1);
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return job->Connect();
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockTransportClientSocketPool::CancelRequest(const std::string& group_name,
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  ClientSocketHandle* handle) {
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MockConnectJob*>::iterator i;
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = job_list_.begin(); i != job_list_.end(); ++i) {
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*i)->CancelHandle(handle)) {
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cancel_count_++;
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void MockTransportClientSocketPool::ReleaseSocket(
18763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const std::string& group_name,
18773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<StreamSocket> socket,
18783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    int id) {
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, id);
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  release_count_++;
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeterministicMockClientSocketFactory::DeterministicMockClientSocketFactory() {}
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeterministicMockClientSocketFactory::~DeterministicMockClientSocketFactory() {}
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicMockClientSocketFactory::AddSocketDataProvider(
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeterministicSocketData* data) {
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_data_.Add(data);
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicMockClientSocketFactory::AddSSLSocketDataProvider(
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SSLSocketDataProvider* data) {
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_ssl_data_.Add(data);
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicMockClientSocketFactory::ResetNextMockIndexes() {
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_data_.ResetNextIndex();
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_ssl_data_.ResetNextIndex();
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockSSLClientSocket* DeterministicMockClientSocketFactory::
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetMockSSLClientSocket(size_t index) const {
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LT(index, ssl_client_sockets_.size());
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ssl_client_sockets_[index];
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_ptr<DatagramClientSocket>
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeterministicMockClientSocketFactory::CreateDatagramClientSocket(
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DatagramSocket::BindType bind_type,
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const RandIntCallback& rand_int_cb,
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::NetLog* net_log,
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NetLog::Source& source) {
1914b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DeterministicSocketData* data_provider = mock_data().GetNext();
19153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<DeterministicMockUDPClientSocket> socket(
19163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new DeterministicMockUDPClientSocket(net_log, data_provider));
1917b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  data_provider->set_delegate(socket->AsWeakPtr());
19183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  udp_client_sockets().push_back(socket.get());
19195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (bind_type == DatagramSocket::RANDOM_BIND)
19205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    socket->set_source_port(rand_int_cb.Run(1025, 65535));
19213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return socket.PassAs<DatagramClientSocket>();
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_ptr<StreamSocket>
19253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)DeterministicMockClientSocketFactory::CreateTransportClientSocket(
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AddressList& addresses,
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::NetLog* net_log,
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::NetLog::Source& source) {
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeterministicSocketData* data_provider = mock_data().GetNext();
19303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<DeterministicMockTCPClientSocket> socket(
19313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new DeterministicMockTCPClientSocket(net_log, data_provider));
1932b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  data_provider->set_delegate(socket->AsWeakPtr());
19333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  tcp_client_sockets().push_back(socket.get());
19343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return socket.PassAs<StreamSocket>();
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_ptr<SSLClientSocket>
19383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)DeterministicMockClientSocketFactory::CreateSSLClientSocket(
19393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<ClientSocketHandle> transport_socket,
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostPortPair& host_and_port,
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SSLConfig& ssl_config,
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SSLClientSocketContext& context) {
19433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<MockSSLClientSocket> socket(
19443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new MockSSLClientSocket(transport_socket.Pass(),
19453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              host_and_port, ssl_config,
19463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              mock_ssl_data_.GetNext()));
19473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ssl_client_sockets_.push_back(socket.get());
19483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return socket.PassAs<SSLClientSocket>();
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeterministicMockClientSocketFactory::ClearSSLSessionCache() {
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockSOCKSClientSocketPool::MockSOCKSClientSocketPool(
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int max_sockets,
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int max_sockets_per_group,
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClientSocketPoolHistograms* histograms,
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransportClientSocketPool* transport_pool)
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : SOCKSClientSocketPool(max_sockets, max_sockets_per_group, histograms,
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            NULL, transport_pool, NULL),
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      transport_pool_(transport_pool) {
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockSOCKSClientSocketPool::~MockSOCKSClientSocketPool() {}
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockSOCKSClientSocketPool::RequestSocket(
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name, const void* socket_params,
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RequestPriority priority, ClientSocketHandle* handle,
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback, const BoundNetLog& net_log) {
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transport_pool_->RequestSocket(
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_name, socket_params, priority, handle, callback, net_log);
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockSOCKSClientSocketPool::CancelRequest(
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& group_name,
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClientSocketHandle* handle) {
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transport_pool_->CancelRequest(group_name, handle);
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockSOCKSClientSocketPool::ReleaseSocket(const std::string& group_name,
19813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                              scoped_ptr<StreamSocket> socket,
19823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                              int id) {
19833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return transport_pool_->ReleaseSocket(group_name, socket.Pass(), id);
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSOCKS5GreetRequest[] = { 0x05, 0x01, 0x00 };
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSOCKS5GreetRequestLength = arraysize(kSOCKS5GreetRequest);
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSOCKS5GreetResponse[] = { 0x05, 0x00 };
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSOCKS5GreetResponseLength = arraysize(kSOCKS5GreetResponse);
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSOCKS5OkRequest[] =
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 };
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest);
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSOCKS5OkResponse[] =
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 };
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse);
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
2001