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" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/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/completion_callback.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/ip_endpoint.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_data_directory.h" 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_status_flags.h" 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/mock_cert_verifier.h" 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/x509_certificate.h" 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/http/transport_security_state.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_factory.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket_test_util.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_client_socket.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/stream_socket.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_info.h" 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/test/cert_test_util.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDataChannel { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel() 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : read_buf_len_(0), 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_(false), 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) write_called_after_close_(false), 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_factory_(this) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback) { 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(read_callback_.is_null()); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!read_buf_.get()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (closed_) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data_.empty()) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_callback_ = callback; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf_ = buf; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf_len_ = buf_len; 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ERR_IO_PENDING; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PropogateData(buf, buf_len); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback) { 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(write_callback_.is_null()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (closed_) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (write_called_after_close_) 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ERR_CONNECTION_RESET; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_called_after_close_ = true; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_callback_ = callback; 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&FakeDataChannel::DoWriteCallback, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr())); 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ERR_IO_PENDING; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // This function returns synchronously, so make a copy of the buffer. 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data_.push(new DrainableIOBuffer( 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new StringIOBuffer(std::string(buf->data(), buf_len)), 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch buf_len)); 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr())); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buf_len; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Closes the FakeDataChannel. After Close() is called, Read() returns 0, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicating EOF, and Write() fails with ERR_CONNECTION_RESET. Note that 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after the FakeDataChannel is closed, the first Write() call completes 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously, which is necessary to reproduce bug 127822. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Close() { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closed_ = true; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoReadCallback() { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (read_callback_.is_null() || data_.empty()) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int copied = PropogateData(read_buf_, read_buf_len_); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback callback = read_callback_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_callback_.Reset(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf_ = NULL; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buf_len_ = 0; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(copied); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoWriteCallback() { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (write_callback_.is_null()) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback callback = write_callback_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_callback_.Reset(); 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback.Run(ERR_CONNECTION_RESET); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int PropogateData(scoped_refptr<IOBuffer> read_buf, int read_buf_len) { 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<DrainableIOBuffer> buf = data_.front(); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int copied = std::min(buf->BytesRemaining(), read_buf_len); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(read_buf->data(), buf->data(), copied); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->DidConsume(copied); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!buf->BytesRemaining()) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_.pop(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copied; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback read_callback_; 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<IOBuffer> read_buf_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int read_buf_len_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback write_callback_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::queue<scoped_refptr<DrainableIOBuffer> > data_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if Close() has been called. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool closed_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Controls the completion of Write() after the FakeDataChannel is closed. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After the FakeDataChannel is closed, the first Write() call completes 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // asynchronously. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool write_called_after_close_; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WeakPtrFactory<FakeDataChannel> weak_factory_; 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeDataChannel); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeSocket : public StreamSocket { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeSocket(FakeDataChannel* incoming_channel, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel* outgoing_channel) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : incoming_(incoming_channel), 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outgoing_(outgoing_channel) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeSocket() { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int Read(IOBuffer* buf, int buf_len, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read random number of bytes. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf_len = rand() % buf_len + 1; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return incoming_->Read(buf, buf_len, callback); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int Write(IOBuffer* buf, int buf_len, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write random number of bytes. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf_len = rand() % buf_len + 1; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return outgoing_->Write(buf, buf_len, callback); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual int SetReceiveBufferSize(int32 size) OVERRIDE { 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return OK; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual int SetSendBufferSize(int32 size) OVERRIDE { 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return OK; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int Connect(const CompletionCallback& callback) OVERRIDE { 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return OK; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Disconnect() OVERRIDE { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incoming_->Close(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outgoing_->Close(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsConnected() const OVERRIDE { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsConnectedAndIdle() const OVERRIDE { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE { 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPAddressNumber ip_address(kIPv4AddressSize); 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *address = IPEndPoint(ip_address, 0 /*port*/); 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return OK; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE { 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPAddressNumber ip_address(4); 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *address = IPEndPoint(ip_address, 0); 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return OK; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const BoundNetLog& NetLog() const OVERRIDE { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net_log_; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetSubresourceSpeculation() OVERRIDE {} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetOmniboxSpeculation() OVERRIDE {} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool WasEverUsed() const OVERRIDE { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool UsingTCPFastOpen() const OVERRIDE { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool WasNpnNegotiated() const OVERRIDE { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual NextProto GetNegotiatedProtocol() const OVERRIDE { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kProtoUnknown; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 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; 273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<IOBuffer> write_buf = new StringIOBuffer(kTestData); 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<IOBuffer> read_buf = new IOBuffer(kReadBufSize); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write then read. 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int written = 278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) server.Write(write_buf.get(), kTestDataSize, CompletionCallback()); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(written, 0); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(written, kTestDataSize); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int read = client.Read(read_buf.get(), kReadBufSize, CompletionCallback()); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(read, 0); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(read, written); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read then write. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(ERR_IO_PENDING, 290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) server.Read(read_buf.get(), kReadBufSize, callback.callback())); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) written = client.Write(write_buf.get(), kTestDataSize, CompletionCallback()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(written, 0); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(written, kTestDataSize); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read = callback.WaitForResult(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(read, 0); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(read, written); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read)); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLServerSocketTest : public PlatformTest { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLServerSocketTest() 305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : socket_factory_(ClientSocketFactory::GetDefaultFactory()), 3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cert_verifier_(new MockCertVerifier()), 3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) transport_security_state_(new TransportSecurityState) { 308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cert_verifier_->set_default_result(CERT_STATUS_AUTHORITY_INVALID); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Initialize() { 3133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<ClientSocketHandle> client_connection(new ClientSocketHandle); 3143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) client_connection->SetSocket( 3153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<StreamSocket>(new FakeSocket(&channel_1_, &channel_2_))); 3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<StreamSocket> server_socket( 3173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new FakeSocket(&channel_2_, &channel_1_)); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath certs_dir(GetTestCertsDirectory()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath cert_path = certs_dir.AppendASCII("unittest.selfsigned.der"); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string cert_der; 32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(cert_path, &cert_der)); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<X509Certificate> cert = 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath key_path = certs_dir.AppendASCII("unittest.key.bin"); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key_string; 33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(base::ReadFileToString(key_path, &key_string)); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> key_vector( 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const uint8*>(key_string.data()), 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const uint8*>(key_string.data() + 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_string.length())); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<crypto::RSAPrivateKey> private_key( 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector)); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SSLConfig ssl_config; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config.false_start_enabled = false; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config.channel_id_enabled = false; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Certificate provided by the host doesn't need authority. 344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SSLConfig::CertAndStatus cert_and_status; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_and_status.cert_status = CERT_STATUS_AUTHORITY_INVALID; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_and_status.der_cert = cert_der; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config.allowed_bad_certs.push_back(cert_and_status); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch HostPortPair host_and_pair("unittest", 0); 350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SSLClientSocketContext context; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.cert_verifier = cert_verifier_.get(); 3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) context.transport_security_state = transport_security_state_.get(); 3533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) client_socket_ = 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_factory_->CreateSSLClientSocket( 3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) client_connection.Pass(), host_and_pair, ssl_config, context); 356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch server_socket_ = CreateSSLServerSocket( 3573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) server_socket.Pass(), 358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cert.get(), private_key.get(), SSLConfig()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel channel_1_; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDataChannel channel_2_; 363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<SSLClientSocket> client_socket_; 364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<SSLServerSocket> server_socket_; 365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ClientSocketFactory* socket_factory_; 366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<MockCertVerifier> cert_verifier_; 367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TransportSecurityState> transport_security_state_; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test only executes creation of client and server sockets. This is to 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test that creation of sockets doesn't crash and have minimal code to run 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// under valgrind in order to help debugging memory problems. 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SSLServerSocketTest, Initialize) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Initialize(); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test executes Connect() on SSLClientSocket and Handshake() on 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SSLServerSocket to make sure handshaking between the two sockets is 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// completed successfully. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SSLServerSocketTest, Handshake) { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Initialize(); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback connect_callback; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback handshake_callback; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int server_ret = server_socket_->Handshake(handshake_callback.callback()); 387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int client_ret = client_socket_->Connect(connect_callback.callback()); 390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (client_ret == ERR_IO_PENDING) { 393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(OK, connect_callback.WaitForResult()); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (server_ret == ERR_IO_PENDING) { 396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(OK, handshake_callback.WaitForResult()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the cert status is expected. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLInfo ssl_info; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_socket_->GetSSLInfo(&ssl_info); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SSLServerSocketTest, DataTransfer) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Initialize(); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback connect_callback; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback handshake_callback; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Establish connection. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int client_ret = client_socket_->Connect(connect_callback.callback()); 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int server_ret = server_socket_->Handshake(handshake_callback.callback()); 416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = connect_callback.GetResult(client_ret); 419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(OK, client_ret); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = handshake_callback.GetResult(server_ret); 421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(OK, server_ret); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kReadBufSize = 1024; 424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<StringIOBuffer> write_buf = 425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new StringIOBuffer("testing123"); 426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<DrainableIOBuffer> read_buf = 427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new DrainableIOBuffer(new IOBuffer(kReadBufSize), kReadBufSize); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write then read. 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback write_callback; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback read_callback; 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) server_ret = server_socket_->Write( 433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) write_buf.get(), write_buf->size(), write_callback.callback()); 434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING); 435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) client_ret = client_socket_->Read( 436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); 437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(client_ret > 0 || client_ret == 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()) { 446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) client_ret = client_socket_->Read( 447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); 448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(client_ret > 0 || client_ret == 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. 458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch write_buf = new StringIOBuffer("hello123"); 459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) server_ret = server_socket_->Read( 460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); 461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING); 462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) client_ret = client_socket_->Write( 463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) write_buf.get(), write_buf->size(), write_callback.callback()); 464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(client_ret > 0 || client_ret == 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()) { 473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) server_ret = server_socket_->Read( 474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); 475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(server_ret > 0 || server_ret == 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. 489116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_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()); 497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int server_ret = server_socket_->Handshake(handshake_callback.callback()); 500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = connect_callback.GetResult(client_ret); 503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(OK, client_ret); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = handshake_callback.GetResult(server_ret); 505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(OK, server_ret); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<StringIOBuffer> write_buf = new StringIOBuffer("testing123"); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The server closes the connection. The server needs to write some 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data first so that the client's Read() calls from the transport 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // socket won't return ERR_IO_PENDING. This ensures that the client 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will call Read() on the transport socket again. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback write_callback; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) server_ret = server_socket_->Write( 516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) write_buf.get(), write_buf->size(), write_callback.callback()); 517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ret = write_callback.GetResult(server_ret); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(server_ret, 0); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_socket_->Disconnect(); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The client writes some data. This should not cause an infinite loop. 525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) client_ret = client_socket_->Write( 526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) write_buf.get(), write_buf->size(), write_callback.callback()); 527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ret = write_callback.GetResult(client_ret); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(client_ret, 0); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 53390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FROM_HERE, base::MessageLoop::QuitClosure(), 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(10)); 53590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test executes ExportKeyingMaterial() on the client and server sockets, 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after connecting them, and verifies that the results match. 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test will fail if False Start is enabled (see crbug.com/90208). 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SSLServerSocketTest, ExportKeyingMaterial) { 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Initialize(); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback connect_callback; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback handshake_callback; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int client_ret = client_socket_->Connect(connect_callback.callback()); 548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int server_ret = server_socket_->Handshake(handshake_callback.callback()); 551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (client_ret == ERR_IO_PENDING) { 554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(OK, connect_callback.WaitForResult()); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (server_ret == ERR_IO_PENDING) { 557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(OK, handshake_callback.WaitForResult()); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kKeyingMaterialSize = 32; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kKeyingLabel = "EXPERIMENTAL-server-socket-test"; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kKeyingContext = ""; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char server_out[kKeyingMaterialSize]; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = server_socket_->ExportKeyingMaterial(kKeyingLabel, 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, kKeyingContext, 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_out, sizeof(server_out)); 567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(OK, rv); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char client_out[kKeyingMaterialSize]; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = client_socket_->ExportKeyingMaterial(kKeyingLabel, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, kKeyingContext, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_out, sizeof(client_out)); 573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(OK, rv); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(server_out, client_out, sizeof(server_out))); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kKeyingLabelBad = "EXPERIMENTAL-server-socket-test-bad"; 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char client_bad[kKeyingMaterialSize]; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = client_socket_->ExportKeyingMaterial(kKeyingLabelBad, 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, kKeyingContext, 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_bad, sizeof(client_bad)); 581116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(rv, OK); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, memcmp(server_out, client_bad, sizeof(server_out))); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 586