ssl_server_socket_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)// This test suite uses SSLClientSocket to test the implementation of 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SSLServerSocket. In order to establish connections between the sockets 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we need two additional classes: 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1. FakeSocket 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Connects SSL socket to FakeDataChannel. This class is just a stub. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2. FakeDataChannel 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implements the actual exchange of data between two FakeSockets. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementations of these two classes are included in this file. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_server_socket.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_path.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypto/nss_util.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypto/rsa_private_key.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/address_list.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/cert_status_flags.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/cert_test_util.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/ip_endpoint.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mock_cert_verifier.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/ssl_config_service.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/ssl_info.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_data_directory.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/x509_certificate.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_factory.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket_test_util.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_client_socket.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/stream_socket.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDataChannel { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel() 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : read_buf_len_(0), 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_(false), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_called_after_close_(false) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (closed_) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data_.empty()) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_callback_ = callback; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf_ = buf; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf_len_ = buf_len; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::ERR_IO_PENDING; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PropogateData(buf, buf_len); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (closed_) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (write_called_after_close_) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::ERR_CONNECTION_RESET; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_called_after_close_ = true; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_callback_ = callback; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->PostTask( 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&FakeDataChannel::DoWriteCallback, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr())); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::ERR_IO_PENDING; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_.push(new net::DrainableIOBuffer(buf, buf_len)); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->PostTask( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr())); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buf_len; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Closes the FakeDataChannel. After Close() is called, Read() returns 0, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicating EOF, and Write() fails with ERR_CONNECTION_RESET. Note that 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after the FakeDataChannel is closed, the first Write() call completes 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously, which is necessary to reproduce bug 127822. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Close() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_ = true; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoReadCallback() { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (read_callback_.is_null() || data_.empty()) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int copied = PropogateData(read_buf_, read_buf_len_); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback callback = read_callback_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_callback_.Reset(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf_ = NULL; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf_len_ = 0; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(copied); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoWriteCallback() { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (write_callback_.is_null()) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback callback = write_callback_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_callback_.Reset(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(net::ERR_CONNECTION_RESET); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int PropogateData(scoped_refptr<net::IOBuffer> read_buf, int read_buf_len) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::DrainableIOBuffer> buf = data_.front(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int copied = std::min(buf->BytesRemaining(), read_buf_len); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(read_buf->data(), buf->data(), copied); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->DidConsume(copied); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!buf->BytesRemaining()) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_.pop(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copied; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback read_callback_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> read_buf_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int read_buf_len_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback write_callback_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::queue<scoped_refptr<net::DrainableIOBuffer> > data_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<FakeDataChannel> weak_factory_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if Close() has been called. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool closed_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Controls the completion of Write() after the FakeDataChannel is closed. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After the FakeDataChannel is closed, the first Write() call completes 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool write_called_after_close_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeDataChannel); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeSocket : public StreamSocket { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSocket(FakeDataChannel* incoming_channel, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel* outgoing_channel) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : incoming_(incoming_channel), 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outgoing_(outgoing_channel) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeSocket() { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int Read(IOBuffer* buf, int buf_len, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read random number of bytes. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf_len = rand() % buf_len + 1; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return incoming_->Read(buf, buf_len, callback); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int Write(IOBuffer* buf, int buf_len, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write random number of bytes. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf_len = rand() % buf_len + 1; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return outgoing_->Write(buf, buf_len, callback); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetReceiveBufferSize(int32 size) OVERRIDE { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetSendBufferSize(int32 size) OVERRIDE { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int Connect(const CompletionCallback& callback) OVERRIDE { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::OK; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Disconnect() OVERRIDE { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incoming_->Close(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outgoing_->Close(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsConnected() const OVERRIDE { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsConnectedAndIdle() const OVERRIDE { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IPAddressNumber ip_address(net::kIPv4AddressSize); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *address = net::IPEndPoint(ip_address, 0 /*port*/); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::OK; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IPAddressNumber ip_address(4); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *address = net::IPEndPoint(ip_address, 0); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::OK; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const BoundNetLog& NetLog() const OVERRIDE { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net_log_; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetSubresourceSpeculation() OVERRIDE {} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetOmniboxSpeculation() OVERRIDE {} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool WasEverUsed() const OVERRIDE { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool UsingTCPFastOpen() const OVERRIDE { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int64 NumBytesRead() const OVERRIDE { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::TimeDelta GetConnectTimeMicros() const OVERRIDE { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta::FromMicroseconds(-1); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool WasNpnNegotiated() const { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NextProto GetNegotiatedProtocol() const { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kProtoUnknown; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetSSLInfo(SSLInfo* ssl_info) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::BoundNetLog net_log_; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel* incoming_; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel* outgoing_; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeSocket); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify the correctness of the test helper classes first. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FakeSocketTest, DataTransfer) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Establish channels between two sockets. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel channel_1; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel channel_2; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSocket client(&channel_1, &channel_2); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSocket server(&channel_2, &channel_1); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kTestData[] = "testing123"; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kTestDataSize = strlen(kTestData); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kReadBufSize = 1024; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> write_buf = new net::StringIOBuffer(kTestData); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> read_buf = new net::IOBuffer(kReadBufSize); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write then read. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int written = server.Write(write_buf, kTestDataSize, CompletionCallback()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(written, 0); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(written, kTestDataSize); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int read = client.Read(read_buf, kReadBufSize, CompletionCallback()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(read, 0); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(read, written); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read)); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read then write. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::ERR_IO_PENDING, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server.Read(read_buf, kReadBufSize, callback.callback())); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) written = client.Write(write_buf, kTestDataSize, CompletionCallback()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(written, 0); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(written, kTestDataSize); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read = callback.WaitForResult(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(read, 0); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(read, written); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read)); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLServerSocketTest : public PlatformTest { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLServerSocketTest() 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : socket_factory_(net::ClientSocketFactory::GetDefaultFactory()), 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_verifier_(new MockCertVerifier()) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_verifier_->set_default_result(net::CERT_STATUS_AUTHORITY_INVALID); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Initialize() { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSocket* fake_client_socket = new FakeSocket(&channel_1_, &channel_2_); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSocket* fake_server_socket = new FakeSocket(&channel_2_, &channel_1_); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath certs_dir(GetTestCertsDirectory()); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath cert_path = certs_dir.AppendASCII("unittest.selfsigned.der"); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string cert_der; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_util::ReadFileToString(cert_path, &cert_der)); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::X509Certificate> cert = 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath key_path = certs_dir.AppendASCII("unittest.key.bin"); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key_string; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_util::ReadFileToString(key_path, &key_string)); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> key_vector( 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const uint8*>(key_string.data()), 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const uint8*>(key_string.data() + 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_string.length())); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<crypto::RSAPrivateKey> private_key( 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector)); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SSLConfig ssl_config; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config.cached_info_enabled = false; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config.false_start_enabled = false; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config.channel_id_enabled = false; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config.version_min = SSL_PROTOCOL_VERSION_SSL3; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config.version_max = SSL_PROTOCOL_VERSION_TLS1_1; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Certificate provided by the host doesn't need authority. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SSLConfig::CertAndStatus cert_and_status; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_and_status.cert_status = CERT_STATUS_AUTHORITY_INVALID; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_and_status.der_cert = cert_der; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config.allowed_bad_certs.push_back(cert_and_status); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HostPortPair host_and_pair("unittest", 0); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SSLClientSocketContext context; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.cert_verifier = cert_verifier_.get(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_socket_.reset( 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_factory_->CreateSSLClientSocket( 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_client_socket, host_and_pair, ssl_config, context)); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_socket_.reset(net::CreateSSLServerSocket(fake_server_socket, 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert, private_key.get(), 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::SSLConfig())); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel channel_1_; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel channel_2_; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::SSLClientSocket> client_socket_; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::SSLServerSocket> server_socket_; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ClientSocketFactory* socket_factory_; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::MockCertVerifier> cert_verifier_; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SSLServerSocket is only implemented using NSS. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_NSS) || defined(OS_WIN) || defined(OS_MACOSX) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test only executes creation of client and server sockets. This is to 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test that creation of sockets doesn't crash and have minimal code to run 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// under valgrind in order to help debugging memory problems. 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SSLServerSocketTest, Initialize) { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Initialize(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test executes Connect() on SSLClientSocket and Handshake() on 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SSLServerSocket to make sure handshaking between the two sockets is 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// completed successfully. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SSLServerSocketTest, Handshake) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Initialize(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback connect_callback; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback handshake_callback; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int server_ret = server_socket_->Handshake(handshake_callback.callback()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(server_ret == net::OK || server_ret == net::ERR_IO_PENDING); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int client_ret = client_socket_->Connect(connect_callback.callback()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client_ret == net::ERR_IO_PENDING) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, connect_callback.WaitForResult()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_ret == net::ERR_IO_PENDING) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(net::OK, handshake_callback.WaitForResult()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the cert status is expected. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLInfo ssl_info; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_socket_->GetSSLInfo(&ssl_info); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SSLServerSocketTest, DataTransfer) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Initialize(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback connect_callback; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback handshake_callback; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Establish connection. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int client_ret = client_socket_->Connect(connect_callback.callback()); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int server_ret = server_socket_->Handshake(handshake_callback.callback()); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(server_ret == net::OK || server_ret == net::ERR_IO_PENDING); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = connect_callback.GetResult(client_ret); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, client_ret); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = handshake_callback.GetResult(server_ret); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, server_ret); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kReadBufSize = 1024; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::StringIOBuffer> write_buf = 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::StringIOBuffer("testing123"); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::DrainableIOBuffer> read_buf = 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::DrainableIOBuffer(new net::IOBuffer(kReadBufSize), 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kReadBufSize); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write then read. 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback write_callback; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback read_callback; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = server_socket_->Write(write_buf, write_buf->size(), 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_callback.callback()); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = client_socket_->Read(read_buf, read_buf->BytesRemaining(), 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_callback.callback()); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_ret > 0 || client_ret == net::ERR_IO_PENDING); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = write_callback.GetResult(server_ret); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(server_ret, 0); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = read_callback.GetResult(client_ret); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_GT(client_ret, 0); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf->DidConsume(client_ret); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (read_buf->BytesConsumed() < write_buf->size()) { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = client_socket_->Read(read_buf, read_buf->BytesRemaining(), 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_callback.callback()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_ret > 0 || client_ret == net::ERR_IO_PENDING); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = read_callback.GetResult(client_ret); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_GT(client_ret, 0); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf->DidConsume(client_ret); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf->SetOffset(0); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size())); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read then write. 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_buf = new net::StringIOBuffer("hello123"); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = server_socket_->Read(read_buf, read_buf->BytesRemaining(), 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_callback.callback()); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = client_socket_->Write(write_buf, write_buf->size(), 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_callback.callback()); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_ret > 0 || client_ret == net::ERR_IO_PENDING); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = read_callback.GetResult(server_ret); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_GT(server_ret, 0); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = write_callback.GetResult(client_ret); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(client_ret, 0); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf->DidConsume(server_ret); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (read_buf->BytesConsumed() < write_buf->size()) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = server_socket_->Read(read_buf, read_buf->BytesRemaining(), 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_callback.callback()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = read_callback.GetResult(server_ret); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_GT(server_ret, 0); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf->DidConsume(server_ret); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed()); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf->SetOffset(0); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size())); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A regression test for bug 127822 (http://crbug.com/127822). 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the server closes the connection after the handshake is finished, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the client's Write() call should not cause an infinite loop. 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: this is a test for SSLClientSocket rather than SSLServerSocket. 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SSLServerSocketTest, ClientWriteAfterServerClose) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Initialize(); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback connect_callback; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback handshake_callback; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Establish connection. 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int client_ret = client_socket_->Connect(connect_callback.callback()); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int server_ret = server_socket_->Handshake(handshake_callback.callback()); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(server_ret == net::OK || server_ret == net::ERR_IO_PENDING); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = connect_callback.GetResult(client_ret); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, client_ret); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = handshake_callback.GetResult(server_ret); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, server_ret); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::StringIOBuffer> write_buf = 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::StringIOBuffer("testing123"); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The server closes the connection. The server needs to write some 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data first so that the client's Read() calls from the transport 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // socket won't return ERR_IO_PENDING. This ensures that the client 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will call Read() on the transport socket again. 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback write_callback; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = server_socket_->Write(write_buf, write_buf->size(), 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_callback.callback()); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = write_callback.GetResult(server_ret); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(server_ret, 0); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_socket_->Disconnect(); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The client writes some data. This should not cause an infinite loop. 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = client_socket_->Write(write_buf, write_buf->size(), 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_callback.callback()); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_ret > 0 || client_ret == net::ERR_IO_PENDING); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = write_callback.GetResult(client_ret); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(client_ret, 0); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->PostDelayedTask( 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, MessageLoop::QuitClosure(), 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(10)); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test executes ExportKeyingMaterial() on the client and server sockets, 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after connecting them, and verifies that the results match. 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test will fail if False Start is enabled (see crbug.com/90208). 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SSLServerSocketTest, ExportKeyingMaterial) { 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Initialize(); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback connect_callback; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback handshake_callback; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int client_ret = client_socket_->Connect(connect_callback.callback()); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int server_ret = server_socket_->Handshake(handshake_callback.callback()); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(server_ret == net::OK || server_ret == net::ERR_IO_PENDING); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client_ret == net::ERR_IO_PENDING) { 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, connect_callback.WaitForResult()); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_ret == net::ERR_IO_PENDING) { 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, handshake_callback.WaitForResult()); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kKeyingMaterialSize = 32; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kKeyingLabel = "EXPERIMENTAL-server-socket-test"; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kKeyingContext = ""; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char server_out[kKeyingMaterialSize]; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = server_socket_->ExportKeyingMaterial(kKeyingLabel, 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, kKeyingContext, 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_out, sizeof(server_out)); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, rv); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char client_out[kKeyingMaterialSize]; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = client_socket_->ExportKeyingMaterial(kKeyingLabel, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, kKeyingContext, 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_out, sizeof(client_out)); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, rv); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(server_out, client_out, sizeof(server_out))); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kKeyingLabelBad = "EXPERIMENTAL-server-socket-test-bad"; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char client_bad[kKeyingMaterialSize]; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = client_socket_->ExportKeyingMaterial(kKeyingLabelBad, 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, kKeyingContext, 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_bad, sizeof(client_bad)); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(rv, net::OK); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, memcmp(server_out, client_bad, sizeof(server_out))); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 588