Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Side by Side Diff: net/socket/socket_test_util.cc

Issue 353713005: Implements new, more robust design for communicating between SSLConnectJobs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Prevent certain tests from running when USE_OPENSSL is not defined. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/socket/socket_test_util.h" 5 #include "net/socket/socket_test_util.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/bind_helpers.h" 12 #include "base/bind_helpers.h"
13 #include "base/callback_helpers.h"
13 #include "base/compiler_specific.h" 14 #include "base/compiler_specific.h"
14 #include "base/message_loop/message_loop.h" 15 #include "base/message_loop/message_loop.h"
15 #include "base/run_loop.h" 16 #include "base/run_loop.h"
16 #include "base/time/time.h" 17 #include "base/time/time.h"
17 #include "net/base/address_family.h" 18 #include "net/base/address_family.h"
18 #include "net/base/address_list.h" 19 #include "net/base/address_list.h"
19 #include "net/base/auth.h" 20 #include "net/base/auth.h"
20 #include "net/base/load_timing_info.h" 21 #include "net/base/load_timing_info.h"
21 #include "net/http/http_network_session.h" 22 #include "net/http/http_network_session.h"
22 #include "net/http/http_request_headers.h" 23 #include "net/http/http_request_headers.h"
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 } 271 }
271 272
272 SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result) 273 SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result)
273 : connect(mode, result), 274 : connect(mode, result),
274 next_proto_status(SSLClientSocket::kNextProtoUnsupported), 275 next_proto_status(SSLClientSocket::kNextProtoUnsupported),
275 was_npn_negotiated(false), 276 was_npn_negotiated(false),
276 protocol_negotiated(kProtoUnknown), 277 protocol_negotiated(kProtoUnknown),
277 client_cert_sent(false), 278 client_cert_sent(false),
278 cert_request_info(NULL), 279 cert_request_info(NULL),
279 channel_id_sent(false), 280 channel_id_sent(false),
280 connection_status(0) { 281 connection_status(0),
282 should_block_on_connect(false),
283 is_in_session_cache(false) {
281 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2, 284 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2,
282 &connection_status); 285 &connection_status);
283 // Set to TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 286 // Set to TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
284 SSLConnectionStatusSetCipherSuite(0xcc14, &connection_status); 287 SSLConnectionStatusSetCipherSuite(0xcc14, &connection_status);
285 } 288 }
286 289
287 SSLSocketDataProvider::~SSLSocketDataProvider() { 290 SSLSocketDataProvider::~SSLSocketDataProvider() {
288 } 291 }
289 292
290 void SSLSocketDataProvider::SetNextProto(NextProto proto) { 293 void SSLSocketDataProvider::SetNextProto(NextProto proto) {
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 new MockTCPClientSocket(addresses, net_log, data_provider)); 695 new MockTCPClientSocket(addresses, net_log, data_provider));
693 data_provider->set_socket(socket.get()); 696 data_provider->set_socket(socket.get());
694 return socket.PassAs<StreamSocket>(); 697 return socket.PassAs<StreamSocket>();
695 } 698 }
696 699
697 scoped_ptr<SSLClientSocket> MockClientSocketFactory::CreateSSLClientSocket( 700 scoped_ptr<SSLClientSocket> MockClientSocketFactory::CreateSSLClientSocket(
698 scoped_ptr<ClientSocketHandle> transport_socket, 701 scoped_ptr<ClientSocketHandle> transport_socket,
699 const HostPortPair& host_and_port, 702 const HostPortPair& host_and_port,
700 const SSLConfig& ssl_config, 703 const SSLConfig& ssl_config,
701 const SSLClientSocketContext& context) { 704 const SSLClientSocketContext& context) {
702 return scoped_ptr<SSLClientSocket>( 705 scoped_ptr<MockSSLClientSocket> socket(
703 new MockSSLClientSocket(transport_socket.Pass(), 706 new MockSSLClientSocket(transport_socket.Pass(),
704 host_and_port, ssl_config, 707 host_and_port,
708 ssl_config,
705 mock_ssl_data_.GetNext())); 709 mock_ssl_data_.GetNext()));
710 ssl_client_sockets_.push_back(socket.get());
711 return socket.PassAs<SSLClientSocket>();
706 } 712 }
707 713
708 void MockClientSocketFactory::ClearSSLSessionCache() { 714 void MockClientSocketFactory::ClearSSLSessionCache() {
709 } 715 }
710 716
711 const char MockClientSocket::kTlsUnique[] = "MOCK_TLSUNIQ"; 717 const char MockClientSocket::kTlsUnique[] = "MOCK_TLSUNIQ";
712 718
713 MockClientSocket::MockClientSocket(const BoundNetLog& net_log) 719 MockClientSocket::MockClientSocket(const BoundNetLog& net_log)
714 : connected_(false), 720 : connected_(false),
715 net_log_(net_log), 721 net_log_(net_log),
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip); 757 bool rv = ParseIPLiteralToNumber("192.0.2.33", &ip);
752 CHECK(rv); 758 CHECK(rv);
753 *address = IPEndPoint(ip, 123); 759 *address = IPEndPoint(ip, 123);
754 return OK; 760 return OK;
755 } 761 }
756 762
757 const BoundNetLog& MockClientSocket::NetLog() const { 763 const BoundNetLog& MockClientSocket::NetLog() const {
758 return net_log_; 764 return net_log_;
759 } 765 }
760 766
767 bool MockClientSocket::InSessionCache() const {
768 NOTIMPLEMENTED();
769 return false;
770 }
771
772 void MockClientSocket::SetHandshakeCompletionCallback(const base::Closure& cb) {
773 NOTIMPLEMENTED();
774 }
775
761 void MockClientSocket::GetSSLCertRequestInfo( 776 void MockClientSocket::GetSSLCertRequestInfo(
762 SSLCertRequestInfo* cert_request_info) { 777 SSLCertRequestInfo* cert_request_info) {
763 } 778 }
764 779
765 int MockClientSocket::ExportKeyingMaterial(const base::StringPiece& label, 780 int MockClientSocket::ExportKeyingMaterial(const base::StringPiece& label,
766 bool has_context, 781 bool has_context,
767 const base::StringPiece& context, 782 const base::StringPiece& context,
768 unsigned char* out, 783 unsigned char* out,
769 unsigned int outlen) { 784 unsigned int outlen) {
770 memset(out, 'A', outlen); 785 memset(out, 'A', outlen);
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 1306
1292 bool DeterministicMockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) { 1307 bool DeterministicMockTCPClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
1293 return false; 1308 return false;
1294 } 1309 }
1295 1310
1296 void DeterministicMockTCPClientSocket::OnReadComplete(const MockRead& data) {} 1311 void DeterministicMockTCPClientSocket::OnReadComplete(const MockRead& data) {}
1297 1312
1298 void DeterministicMockTCPClientSocket::OnConnectComplete( 1313 void DeterministicMockTCPClientSocket::OnConnectComplete(
1299 const MockConnect& data) {} 1314 const MockConnect& data) {}
1300 1315
1301 // static
1302 void MockSSLClientSocket::ConnectCallback(
1303 MockSSLClientSocket* ssl_client_socket,
1304 const CompletionCallback& callback,
1305 int rv) {
1306 if (rv == OK)
1307 ssl_client_socket->connected_ = true;
1308 callback.Run(rv);
1309 }
1310
1311 MockSSLClientSocket::MockSSLClientSocket( 1316 MockSSLClientSocket::MockSSLClientSocket(
1312 scoped_ptr<ClientSocketHandle> transport_socket, 1317 scoped_ptr<ClientSocketHandle> transport_socket,
1313 const HostPortPair& host_port_pair, 1318 const HostPortPair& host_port_pair,
1314 const SSLConfig& ssl_config, 1319 const SSLConfig& ssl_config,
1315 SSLSocketDataProvider* data) 1320 SSLSocketDataProvider* data)
1316 : MockClientSocket( 1321 : MockClientSocket(
1317 // Have to use the right BoundNetLog for LoadTimingInfo regression 1322 // Have to use the right BoundNetLog for LoadTimingInfo regression
1318 // tests. 1323 // tests.
1319 transport_socket->socket()->NetLog()), 1324 transport_socket->socket()->NetLog()),
1320 transport_(transport_socket.Pass()), 1325 transport_(transport_socket.Pass()),
1321 data_(data), 1326 data_(data),
1322 is_npn_state_set_(false), 1327 is_npn_state_set_(false),
1323 new_npn_value_(false), 1328 new_npn_value_(false),
1324 is_protocol_negotiated_set_(false), 1329 is_protocol_negotiated_set_(false),
1325 protocol_negotiated_(kProtoUnknown) { 1330 protocol_negotiated_(kProtoUnknown),
1331 next_connect_state_(STATE_NONE),
1332 weak_factory_(this) {
1326 DCHECK(data_); 1333 DCHECK(data_);
1327 peer_addr_ = data->connect.peer_addr; 1334 peer_addr_ = data->connect.peer_addr;
1328 } 1335 }
1329 1336
1330 MockSSLClientSocket::~MockSSLClientSocket() { 1337 MockSSLClientSocket::~MockSSLClientSocket() {
1331 Disconnect(); 1338 Disconnect();
1332 } 1339 }
1333 1340
1334 int MockSSLClientSocket::Read(IOBuffer* buf, int buf_len, 1341 int MockSSLClientSocket::Read(IOBuffer* buf, int buf_len,
1335 const CompletionCallback& callback) { 1342 const CompletionCallback& callback) {
1336 return transport_->socket()->Read(buf, buf_len, callback); 1343 return transport_->socket()->Read(buf, buf_len, callback);
1337 } 1344 }
1338 1345
1339 int MockSSLClientSocket::Write(IOBuffer* buf, int buf_len, 1346 int MockSSLClientSocket::Write(IOBuffer* buf, int buf_len,
1340 const CompletionCallback& callback) { 1347 const CompletionCallback& callback) {
1341 return transport_->socket()->Write(buf, buf_len, callback); 1348 return transport_->socket()->Write(buf, buf_len, callback);
1342 } 1349 }
1343 1350
1344 int MockSSLClientSocket::Connect(const CompletionCallback& callback) { 1351 int MockSSLClientSocket::Connect(const CompletionCallback& callback) {
1345 int rv = transport_->socket()->Connect( 1352 next_connect_state_ = STATE_TRANSPORT_CONNECT;
1346 base::Bind(&ConnectCallback, base::Unretained(this), callback)); 1353 int rv = DoConnectLoop(OK);
1347 if (rv == OK) { 1354 if (rv == ERR_IO_PENDING)
1348 if (data_->connect.result == OK) 1355 connect_callback_ = callback;
1349 connected_ = true;
1350 if (data_->connect.mode == ASYNC) {
1351 RunCallbackAsync(callback, data_->connect.result);
1352 return ERR_IO_PENDING;
1353 }
1354 return data_->connect.result;
1355 }
1356 return rv; 1356 return rv;
1357 } 1357 }
1358 1358
1359 void MockSSLClientSocket::Disconnect() { 1359 void MockSSLClientSocket::Disconnect() {
1360 weak_factory_.InvalidateWeakPtrs();
1360 MockClientSocket::Disconnect(); 1361 MockClientSocket::Disconnect();
1361 if (transport_->socket() != NULL) 1362 if (transport_->socket() != NULL)
1362 transport_->socket()->Disconnect(); 1363 transport_->socket()->Disconnect();
1363 } 1364 }
1364 1365
1365 bool MockSSLClientSocket::IsConnected() const { 1366 bool MockSSLClientSocket::IsConnected() const {
1366 return transport_->socket()->IsConnected(); 1367 return transport_->socket()->IsConnected() && connected_;
Ryan Sleevi 2014/07/29 23:19:21 This seems to violate the SSLClientSocket behaviou
1367 } 1368 }
1368 1369
1369 bool MockSSLClientSocket::WasEverUsed() const { 1370 bool MockSSLClientSocket::WasEverUsed() const {
1370 return transport_->socket()->WasEverUsed(); 1371 return transport_->socket()->WasEverUsed();
1371 } 1372 }
1372 1373
1373 bool MockSSLClientSocket::UsingTCPFastOpen() const { 1374 bool MockSSLClientSocket::UsingTCPFastOpen() const {
1374 return transport_->socket()->UsingTCPFastOpen(); 1375 return transport_->socket()->UsingTCPFastOpen();
1375 } 1376 }
1376 1377
1377 int MockSSLClientSocket::GetPeerAddress(IPEndPoint* address) const { 1378 int MockSSLClientSocket::GetPeerAddress(IPEndPoint* address) const {
1378 return transport_->socket()->GetPeerAddress(address); 1379 return transport_->socket()->GetPeerAddress(address);
1379 } 1380 }
1380 1381
1381 bool MockSSLClientSocket::GetSSLInfo(SSLInfo* ssl_info) { 1382 bool MockSSLClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
1382 ssl_info->Reset(); 1383 ssl_info->Reset();
1383 ssl_info->cert = data_->cert; 1384 ssl_info->cert = data_->cert;
1384 ssl_info->client_cert_sent = data_->client_cert_sent; 1385 ssl_info->client_cert_sent = data_->client_cert_sent;
1385 ssl_info->channel_id_sent = data_->channel_id_sent; 1386 ssl_info->channel_id_sent = data_->channel_id_sent;
1386 ssl_info->connection_status = data_->connection_status; 1387 ssl_info->connection_status = data_->connection_status;
1387 return true; 1388 return true;
1388 } 1389 }
1389 1390
1391 bool MockSSLClientSocket::InSessionCache() const {
1392 return data_->is_in_session_cache;
1393 }
1394
1395 void MockSSLClientSocket::SetHandshakeCompletionCallback(
1396 const base::Closure& cb) {
1397 handshake_completion_callback_ = cb;
1398 }
1399
1390 void MockSSLClientSocket::GetSSLCertRequestInfo( 1400 void MockSSLClientSocket::GetSSLCertRequestInfo(
1391 SSLCertRequestInfo* cert_request_info) { 1401 SSLCertRequestInfo* cert_request_info) {
1392 DCHECK(cert_request_info); 1402 DCHECK(cert_request_info);
1393 if (data_->cert_request_info) { 1403 if (data_->cert_request_info) {
1394 cert_request_info->host_and_port = 1404 cert_request_info->host_and_port =
1395 data_->cert_request_info->host_and_port; 1405 data_->cert_request_info->host_and_port;
1396 cert_request_info->client_certs = data_->cert_request_info->client_certs; 1406 cert_request_info->client_certs = data_->cert_request_info->client_certs;
1397 } else { 1407 } else {
1398 cert_request_info->Reset(); 1408 cert_request_info->Reset();
1399 } 1409 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1442 } 1452 }
1443 1453
1444 void MockSSLClientSocket::OnReadComplete(const MockRead& data) { 1454 void MockSSLClientSocket::OnReadComplete(const MockRead& data) {
1445 NOTIMPLEMENTED(); 1455 NOTIMPLEMENTED();
1446 } 1456 }
1447 1457
1448 void MockSSLClientSocket::OnConnectComplete(const MockConnect& data) { 1458 void MockSSLClientSocket::OnConnectComplete(const MockConnect& data) {
1449 NOTIMPLEMENTED(); 1459 NOTIMPLEMENTED();
1450 } 1460 }
1451 1461
1462 void MockSSLClientSocket::RestartPausedConnect() {
1463 DCHECK(data_->should_block_on_connect);
1464 DCHECK_EQ(next_connect_state_, STATE_SSL_CONNECT_COMPLETE);
1465 OnIOComplete(data_->connect.result);
1466 }
1467
1468 void MockSSLClientSocket::OnIOComplete(int result) {
1469 int rv = DoConnectLoop(result);
1470 if (rv != ERR_IO_PENDING) {
1471 DCHECK(!connect_callback_.is_null());
Ryan Sleevi 2014/07/29 23:19:22 You can remove this DCHECK. It's implied by line 1
mshelley 2014/07/30 18:33:54 Done.
wtc 2014/07/30 21:56:57 Why is this DCHECK implied by line 1472?
1472 base::ResetAndReturn(&connect_callback_).Run(rv);
1473 }
1474 }
1475
1476 int MockSSLClientSocket::DoConnectLoop(int result) {
1477 DCHECK_NE(next_connect_state_, STATE_NONE);
1478
1479 int rv = result;
1480 do {
1481 ConnectState state = next_connect_state_;
1482 next_connect_state_ = STATE_NONE;
1483 switch (state) {
1484 case STATE_TRANSPORT_CONNECT:
1485 DCHECK_EQ(OK, rv);
Ryan Sleevi 2014/07/29 23:19:22 DCHECKs in test code are (generally) not desirable
mshelley 2014/07/30 18:33:54 Done.
1486 rv = DoTransportConnect();
1487 break;
1488 case STATE_TRANSPORT_CONNECT_COMPLETE:
1489 rv = DoTransportConnectComplete(rv);
1490 case STATE_SSL_CONNECT:
1491 DCHECK_EQ(OK, rv);
1492 rv = DoSSLConnect();
1493 break;
1494 case STATE_SSL_CONNECT_COMPLETE:
1495 rv = DoSSLConnectComplete(rv);
1496 break;
1497 default:
1498 NOTREACHED() << "bad state";
1499 rv = ERR_UNEXPECTED;
1500 break;
1501 }
1502 } while (rv != ERR_IO_PENDING && next_connect_state_ != STATE_NONE);
1503
1504 return rv;
1505 }
1506
1507 int MockSSLClientSocket::DoTransportConnect() {
1508 next_connect_state_ = STATE_TRANSPORT_CONNECT_COMPLETE;
1509 return transport_->socket()->Connect(
1510 base::Bind(&MockSSLClientSocket::OnIOComplete, base::Unretained(this)));
1511 }
1512
1513 int MockSSLClientSocket::DoTransportConnectComplete(int result) {
1514 if (result == OK)
1515 next_connect_state_ = STATE_SSL_CONNECT;
1516 return result;
1517 }
1518
1519 int MockSSLClientSocket::DoSSLConnect() {
1520 next_connect_state_ = STATE_SSL_CONNECT_COMPLETE;
1521
1522 // TODO(mshelley) Move this to DoSSLConnectComplete and add a seperate member
1523 // var to check that the connection has started during testing.
1524 if (data_->connect.result == OK)
1525 connected_ = true;
Ryan Sleevi 2014/07/29 23:19:22 Doesn't this belong after lines 1527-1528? Your "
mshelley 2014/07/30 18:33:54 Right now its set up this way so that I can use co
1526
1527 if (data_->should_block_on_connect)
1528 return ERR_IO_PENDING;
1529
1530 if (data_->connect.mode == ASYNC) {
1531 base::MessageLoop::current()->PostTask(
1532 FROM_HERE,
1533 base::Bind(&MockSSLClientSocket::OnIOComplete,
1534 weak_factory_.GetWeakPtr(),
1535 data_->connect.result));
1536 return ERR_IO_PENDING;
1537 }
1538
1539 return data_->connect.result;
1540 }
1541
1542 int MockSSLClientSocket::DoSSLConnectComplete(int result) {
1543 if (!handshake_completion_callback_.is_null())
1544 base::ResetAndReturn(&handshake_completion_callback_).Run();
1545 return result;
1546 }
1547
1452 MockUDPClientSocket::MockUDPClientSocket(SocketDataProvider* data, 1548 MockUDPClientSocket::MockUDPClientSocket(SocketDataProvider* data,
1453 net::NetLog* net_log) 1549 net::NetLog* net_log)
1454 : connected_(false), 1550 : connected_(false),
1455 data_(data), 1551 data_(data),
1456 read_offset_(0), 1552 read_offset_(0),
1457 read_data_(SYNCHRONOUS, ERR_UNEXPECTED), 1553 read_data_(SYNCHRONOUS, ERR_UNEXPECTED),
1458 need_read_data_(true), 1554 need_read_data_(true),
1459 source_port_(123), 1555 source_port_(123),
1460 pending_buf_(NULL), 1556 pending_buf_(NULL),
1461 pending_buf_len_(0), 1557 pending_buf_len_(0),
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
1906 2002
1907 const char kSOCKS5OkRequest[] = 2003 const char kSOCKS5OkRequest[] =
1908 { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 }; 2004 { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 };
1909 const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest); 2005 const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest);
1910 2006
1911 const char kSOCKS5OkResponse[] = 2007 const char kSOCKS5OkResponse[] =
1912 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; 2008 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 };
1913 const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse); 2009 const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse);
1914 2010
1915 } // namespace net 2011 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698