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