chrome_async_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)#include "jingle/glue/chrome_async_socket.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/glue/resolving_client_socket_factory.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/address_list.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/mock_cert_verifier.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/ssl_config_service.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket_test_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_client_socket.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/libjingle/source/talk/base/ipaddress.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/libjingle/source/talk/base/sigslot.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/libjingle/source/talk/base/socketaddress.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace jingle_glue {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Data provider that handles reads/writes for ChromeAsyncSocket.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AsyncSocketDataProvider : public net::SocketDataProvider {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncSocketDataProvider() : has_pending_read_(false) {}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AsyncSocketDataProvider() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(writes_.empty());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(reads_.empty());
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If there's no read, sets the "has pending read" flag.  Otherwise,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pops the next read.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::MockRead GetNextRead() {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reads_.empty()) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(!has_pending_read_);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_pending_read_ = true;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::MockRead pending_read(net::SYNCHRONOUS, net::ERR_IO_PENDING);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return pending_read;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::MockRead mock_read = reads_.front();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reads_.pop_front();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return mock_read;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simply pops the next write and, if applicable, compares it to
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |data|.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::MockWriteResult OnWrite(const std::string& data) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!writes_.empty());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::MockWrite mock_write = writes_.front();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writes_.pop_front();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mock_write.result != net::OK) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return net::MockWriteResult(mock_write.mode, mock_write.result);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string expected_data(mock_write.data, mock_write.data_len);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_data, data);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expected_data != data) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return net::MockWriteResult(net::SYNCHRONOUS, net::ERR_UNEXPECTED);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return net::MockWriteResult(mock_write.mode, data.size());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We ignore resets so we can pre-load the socket data provider with
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // read/write events.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Reset() {}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If there is a pending read, completes it with the given read.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, queues up the given read.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddRead(const net::MockRead& mock_read) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_NE(mock_read.result, net::ERR_IO_PENDING);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (has_pending_read_) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      socket()->OnReadComplete(mock_read);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_pending_read_ = false;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reads_.push_back(mock_read);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simply queues up the given write.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddWrite(const net::MockWrite& mock_write) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    writes_.push_back(mock_write);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::deque<net::MockRead> reads_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_pending_read_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::deque<net::MockWrite> writes_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AsyncSocketDataProvider);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockXmppClientSocketFactory : public ResolvingClientSocketFactory {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockXmppClientSocketFactory(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::ClientSocketFactory* mock_client_socket_factory,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::AddressList& address_list)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          : mock_client_socket_factory_(mock_client_socket_factory),
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            address_list_(address_list),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cert_verifier_(new net::MockCertVerifier) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ResolvingClientSocketFactory implementation.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::StreamSocket* CreateTransportClientSocket(
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HostPortPair& host_and_port) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return mock_client_socket_factory_->CreateTransportClientSocket(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        address_list_, NULL, net::NetLog::Source());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::SSLClientSocket* CreateSSLClientSocket(
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::ClientSocketHandle* transport_socket,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HostPortPair& host_and_port) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::SSLClientSocketContext context;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.cert_verifier = cert_verifier_.get();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return mock_client_socket_factory_->CreateSSLClientSocket(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        transport_socket, host_and_port, ssl_config_, context);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::ClientSocketFactory> mock_client_socket_factory_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::AddressList address_list_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::SSLConfig ssl_config_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::CertVerifier> cert_verifier_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeAsyncSocketTest
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public testing::Test,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public sigslot::has_slots<> {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeAsyncSocketTest()
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ssl_socket_data_provider_(net::ASYNC, net::OK),
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        addr_("localhost", 35) {}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ChromeAsyncSocketTest() {}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::MockClientSocketFactory> mock_client_socket_factory(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new net::MockClientSocketFactory());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_client_socket_factory->AddSocketDataProvider(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &async_socket_data_provider_);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_client_socket_factory->AddSSLSocketDataProvider(
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &ssl_socket_data_provider_);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Fake DNS resolution for |addr_| and pass it to the factory.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::IPAddressNumber resolved_addr;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(net::ParseIPLiteralToNumber("127.0.0.1", &resolved_addr));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::AddressList address_list =
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::AddressList::CreateFromIPAddress(resolved_addr, addr_.port());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<MockXmppClientSocketFactory> mock_xmpp_client_socket_factory(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new MockXmppClientSocketFactory(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mock_client_socket_factory.release(),
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            address_list));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_async_socket_.reset(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new ChromeAsyncSocket(mock_xmpp_client_socket_factory.release(),
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              14, 20)),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_async_socket_->SignalConnected.connect(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, &ChromeAsyncSocketTest::OnConnect);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_async_socket_->SignalSSLConnected.connect(
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, &ChromeAsyncSocketTest::OnSSLConnect);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_async_socket_->SignalClosed.connect(
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, &ChromeAsyncSocketTest::OnClose);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_async_socket_->SignalRead.connect(
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, &ChromeAsyncSocketTest::OnRead);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_async_socket_->SignalError.connect(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, &ChromeAsyncSocketTest::OnError);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Run any tasks that we forgot to pump.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.RunAllPending();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectClosed();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNoSignal();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome_async_socket_.reset();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Signal {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SIGNAL_CONNECT,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SIGNAL_SSL_CONNECT,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SIGNAL_CLOSE,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SIGNAL_READ,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SIGNAL_ERROR,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper struct that records the state at the time of a signal.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct SignalSocketState {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SignalSocketState()
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : signal(SIGNAL_ERROR),
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state(ChromeAsyncSocket::STATE_CLOSED),
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          error(ChromeAsyncSocket::ERROR_NONE),
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          net_error(net::OK) {}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SignalSocketState(
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Signal signal,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ChromeAsyncSocket::State state,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ChromeAsyncSocket::Error error,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::Error net_error)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : signal(signal),
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state(state),
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          error(error),
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          net_error(net_error) {}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsEqual(const SignalSocketState& other) const {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (signal == other.signal) &&
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (state == other.state) &&
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (error == other.error) &&
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (net_error == other.net_error);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static SignalSocketState FromAsyncSocket(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Signal signal,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buzz::AsyncSocket* async_socket) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return SignalSocketState(signal,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               async_socket->state(),
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               async_socket->error(),
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               static_cast<net::Error>(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   async_socket->GetError()));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static SignalSocketState NoError(
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Signal signal, buzz::AsyncSocket::State state) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SignalSocketState(signal, state,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 buzz::AsyncSocket::ERROR_NONE,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 net::OK);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Signal signal;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeAsyncSocket::State state;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeAsyncSocket::Error error;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::Error net_error;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CaptureSocketState(Signal signal) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    signal_socket_states_.push_back(
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState::FromAsyncSocket(
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            signal, chrome_async_socket_.get()));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnConnect() {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CaptureSocketState(SIGNAL_CONNECT);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSSLConnect() {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CaptureSocketState(SIGNAL_SSL_CONNECT);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnClose() {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CaptureSocketState(SIGNAL_CLOSE);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRead() {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CaptureSocketState(SIGNAL_READ);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnError() {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // State expect functions.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectState(ChromeAsyncSocket::State state,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   ChromeAsyncSocket::Error error,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   net::Error net_error) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(state, chrome_async_socket_->state());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error, chrome_async_socket_->error());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(net_error, chrome_async_socket_->GetError());
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectNonErrorState(ChromeAsyncSocket::State state) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectState(state, ChromeAsyncSocket::ERROR_NONE, net::OK);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectErrorState(ChromeAsyncSocket::State state,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ChromeAsyncSocket::Error error) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectState(state, error, net::OK);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectClosed() {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Signal expect functions.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectNoSignal() {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!signal_socket_states_.empty()) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ADD_FAILURE() << signal_socket_states_.front().signal;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectSignalSocketState(
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState expected_signal_socket_state) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (signal_socket_states_.empty()) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ADD_FAILURE() << expected_signal_socket_state.signal;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(expected_signal_socket_state.IsEqual(
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        signal_socket_states_.front()))
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << signal_socket_states_.front().signal;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    signal_socket_states_.pop_front();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectReadSignal() {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectSignalSocketState(
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState::NoError(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SIGNAL_READ, ChromeAsyncSocket::STATE_OPEN));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectSSLConnectSignal() {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectSignalSocketState(
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState::NoError(SIGNAL_SSL_CONNECT,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   ChromeAsyncSocket::STATE_TLS_OPEN));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectSSLReadSignal() {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectSignalSocketState(
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState::NoError(
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SIGNAL_READ, ChromeAsyncSocket::STATE_TLS_OPEN));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open/close utility functions.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoOpenClosed() {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectClosed();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    async_socket_data_provider_.set_connect_data(
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::MockConnect(net::SYNCHRONOUS, net::OK));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.RunAllPending();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We may not necessarily be open; may have been other events
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // queued up.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectSignalSocketState(
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState::NoError(
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SIGNAL_CONNECT, ChromeAsyncSocket::STATE_OPEN));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoCloseOpened(SignalSocketState expected_signal_socket_state) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We may be in an error state, so just compare state().
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ChromeAsyncSocket::STATE_OPEN, chrome_async_socket_->state());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(chrome_async_socket_->Close());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectSignalSocketState(expected_signal_socket_state);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoCloseOpenedNoError() {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoCloseOpened(
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState::NoError(
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoSSLOpenClosed() {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char kDummyData[] = "dummy_data";
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    async_socket_data_provider_.AddRead(net::MockRead(kDummyData));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoOpenClosed();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectReadSignal();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kDummyData, DrainRead(1));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.RunAllPending();
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectSSLConnectSignal();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNoSignal();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoSSLCloseOpened(SignalSocketState expected_signal_socket_state) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We may be in an error state, so just compare state().
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ChromeAsyncSocket::STATE_TLS_OPEN,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              chrome_async_socket_->state());
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(chrome_async_socket_->Close());
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectSignalSocketState(expected_signal_socket_state);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoSSLCloseOpenedNoError() {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoSSLCloseOpened(
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState::NoError(
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read utility fucntions.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string DrainRead(size_t buf_size) {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string read;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_array<char> buf(new char[buf_size]);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t len_read;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (true) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool success =
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          chrome_async_socket_->Read(buf.get(), buf_size, &len_read);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!success) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ADD_FAILURE();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (len_read == 0U) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      read.append(buf.get(), len_read);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return read;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ChromeAsyncSocket expects a message loop.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop message_loop_;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncSocketDataProvider async_socket_data_provider_;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::SSLSocketDataProvider ssl_socket_data_provider_;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ChromeAsyncSocket> chrome_async_socket_;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::deque<SignalSocketState> signal_socket_states_;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const talk_base::SocketAddress addr_;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChromeAsyncSocketTest);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, InitialState) {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectClosed();
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, EmptyClose) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectClosed();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Close());
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectClosed();
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, ImmediateConnectAndClose) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNonErrorState(ChromeAsyncSocket::STATE_OPEN);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCloseOpenedNoError();
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After this, no need to test immediate successful connect and
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Close() so thoroughly.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, DoubleClose) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Close());
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectClosed();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState::NoError(
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Close());
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectClosed();
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, NoHostnameConnect) {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  talk_base::IPAddress ip_address;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(talk_base::IPFromString("127.0.0.1", &ip_address));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const talk_base::SocketAddress no_hostname_addr(ip_address, addr_.port());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome_async_socket_->Connect(no_hostname_addr));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED,
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   ChromeAsyncSocket::ERROR_DNS);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Close());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectClosed();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, ZeroPortConnect) {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const talk_base::SocketAddress zero_port_addr(addr_.hostname(), 0);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome_async_socket_->Connect(zero_port_addr));
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   ChromeAsyncSocket::ERROR_DNS);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Close());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectClosed();
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, DoubleConnect) {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_DEBUG_DEATH({
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoOpenClosed();
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(chrome_async_socket_->Connect(addr_));
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectErrorState(ChromeAsyncSocket::STATE_OPEN,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     ChromeAsyncSocket::ERROR_WRONGSTATE);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoCloseOpened(
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState(SIGNAL_CLOSE,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ChromeAsyncSocket::STATE_CLOSED,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ChromeAsyncSocket::ERROR_WRONGSTATE,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          net::OK));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, "non-closed socket");
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, ImmediateConnectCloseBeforeRead) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Close());
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectClosed();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState::NoError(
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, HangingConnect) {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Close());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectClosed();
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState::NoError(
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, PendingConnect) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.set_connect_data(
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockConnect(net::ASYNC, net::OK));
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNonErrorState(ChromeAsyncSocket::STATE_OPEN);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState::NoError(
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CONNECT, ChromeAsyncSocket::STATE_OPEN));
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCloseOpenedNoError();
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After this no need to test successful pending connect so
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thoroughly.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, PendingConnectCloseBeforeRead) {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.set_connect_data(
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockConnect(net::ASYNC, net::OK));
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState::NoError(
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CONNECT, ChromeAsyncSocket::STATE_OPEN));
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCloseOpenedNoError();
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, PendingConnectError) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.set_connect_data(
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockConnect(net::ASYNC, net::ERR_TIMED_OUT));
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState(
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After this we can assume Connect() and Close() work as expected.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, EmptyRead) {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buf[4096];
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t len_read = 10000U;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read));
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, len_read);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCloseOpenedNoError();
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, WrongRead) {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_DEBUG_DEATH({
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    async_socket_data_provider_.set_connect_data(
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::MockConnect(net::ASYNC, net::OK));
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNoSignal();
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char buf[4096];
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t len_read;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectErrorState(ChromeAsyncSocket::STATE_CONNECTING,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     ChromeAsyncSocket::ERROR_WRONGSTATE);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(chrome_async_socket_->Close());
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectSignalSocketState(
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState(
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ChromeAsyncSocket::ERROR_WRONGSTATE, net::OK));
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, "non-open");
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, WrongReadClosed) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buf[4096];
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t len_read;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED,
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   ChromeAsyncSocket::ERROR_WRONGSTATE);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Close());
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kReadData[] = "mydatatoread";
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, Read) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData));
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectReadSignal();
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kReadData, DrainRead(1));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCloseOpenedNoError();
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, ReadTwice) {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData));
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectReadSignal();
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kReadData, DrainRead(1));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kReadData2[] = "mydatatoread2";
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData2));
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectReadSignal();
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kReadData2, DrainRead(1));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCloseOpenedNoError();
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, ReadError) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectReadSignal();
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kReadData, DrainRead(1));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockRead(net::SYNCHRONOUS, net::ERR_TIMED_OUT));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState(
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT));
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, ReadEmpty) {
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(""));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState::NoError(
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, PendingRead) {
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState::NoError(
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_READ, ChromeAsyncSocket::STATE_OPEN));
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kReadData, DrainRead(1));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCloseOpenedNoError();
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, PendingEmptyRead) {
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(""));
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState::NoError(
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, PendingReadError) {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockRead(net::ASYNC, net::ERR_TIMED_OUT));
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState(
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT));
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After this we can assume non-SSL Read() works as expected.
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, WrongWrite) {
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_DEBUG_DEATH({
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string data("foo");
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(chrome_async_socket_->Write(data.data(), data.size()));
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED,
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     ChromeAsyncSocket::ERROR_WRONGSTATE);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(chrome_async_socket_->Close());
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, "non-open");
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kWriteData[] = "mydatatowrite";
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, SyncWrite) {
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::SYNCHRONOUS, kWriteData, 3));
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::SYNCHRONOUS, kWriteData + 3, 5));
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::SYNCHRONOUS,
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     kWriteData + 8, arraysize(kWriteData) - 8));
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5));
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8,
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          arraysize(kWriteData) - 8));
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCloseOpenedNoError();
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, AsyncWrite) {
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::ASYNC, kWriteData, 3));
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::ASYNC, kWriteData + 3, 5));
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::ASYNC, kWriteData + 8, arraysize(kWriteData) - 8));
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5));
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8,
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          arraysize(kWriteData) - 8));
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCloseOpenedNoError();
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, AsyncWriteError) {
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::ASYNC, kWriteData, 3));
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::ASYNC, kWriteData + 3, 5));
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::ASYNC, net::ERR_TIMED_OUT));
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5));
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8,
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          arraysize(kWriteData) - 8));
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState(
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT));
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, LargeWrite) {
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_DEBUG_DEATH({
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoOpenClosed();
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string large_data(100, 'x');
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(chrome_async_socket_->Write(large_data.data(),
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             large_data.size()));
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectState(ChromeAsyncSocket::STATE_OPEN,
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ChromeAsyncSocket::ERROR_WINSOCK,
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                net::ERR_INSUFFICIENT_RESOURCES);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoCloseOpened(
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState(
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ChromeAsyncSocket::ERROR_WINSOCK,
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            net::ERR_INSUFFICIENT_RESOURCES));
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }, "exceed the max write buffer");
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, LargeAccumulatedWrite) {
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_DEBUG_DEATH({
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoOpenClosed();
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string data(15, 'x');
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(chrome_async_socket_->Write(data.data(), data.size()));
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(chrome_async_socket_->Write(data.data(), data.size()));
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectState(ChromeAsyncSocket::STATE_OPEN,
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ChromeAsyncSocket::ERROR_WINSOCK,
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                net::ERR_INSUFFICIENT_RESOURCES);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoCloseOpened(
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState(
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ChromeAsyncSocket::ERROR_WINSOCK,
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            net::ERR_INSUFFICIENT_RESOURCES));
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }, "exceed the max write buffer");
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After this we can assume non-SSL I/O works as expected.
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, HangingSSLConnect) {
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData));
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectReadSignal();
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_CONNECTING);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Close());
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState::NoError(SIGNAL_CLOSE,
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 ChromeAsyncSocket::STATE_CLOSED));
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, ImmediateSSLConnect) {
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData));
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectReadSignal();
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSSLConnectSignal();
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoSSLCloseOpenedNoError();
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, DoubleSSLConnect) {
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_DEBUG_DEATH({
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    async_socket_data_provider_.AddRead(net::MockRead(kReadData));
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoOpenClosed();
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectReadSignal();
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.RunAllPending();
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectSSLConnectSignal();
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNoSignal();
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(chrome_async_socket_->StartTls("fakedomain.com"));
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoSSLCloseOpened(
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState(SIGNAL_CLOSE,
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ChromeAsyncSocket::STATE_CLOSED,
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ChromeAsyncSocket::ERROR_WRONGSTATE,
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          net::OK));
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, "wrong state");
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, FailedSSLConnect) {
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_socket_data_provider_.connect =
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockConnect(net::ASYNC, net::ERR_CERT_COMMON_NAME_INVALID),
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData));
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectReadSignal();
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSignalSocketState(
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalSocketState(
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ChromeAsyncSocket::ERROR_WINSOCK,
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          net::ERR_CERT_COMMON_NAME_INVALID));
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Close());
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectClosed();
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, ReadDuringSSLConnecting) {
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData));
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectReadSignal();
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kReadData, DrainRead(1));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shouldn't do anything.
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData));
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buf[4096];
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t len_read = 10000U;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read));
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, len_read);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSSLConnectSignal();
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSSLReadSignal();
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  len_read = 10000U;
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read));
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kReadData, std::string(buf, len_read));
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoSSLCloseOpenedNoError();
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, WriteDuringSSLConnecting) {
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData));
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoOpenClosed();
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectReadSignal();
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_CONNECTING);
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::ASYNC, kWriteData, 3));
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shouldn't do anything.
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(akalin): Figure out how to test that the write happens
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // *after* the SSL connect.
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSSLConnectSignal();
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoSSLCloseOpenedNoError();
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, SSLConnectDuringPendingRead) {
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_DEBUG_DEATH({
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoOpenClosed();
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(chrome_async_socket_->StartTls("fakedomain.com"));
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoCloseOpened(
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState(SIGNAL_CLOSE,
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ChromeAsyncSocket::STATE_CLOSED,
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ChromeAsyncSocket::ERROR_WRONGSTATE,
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          net::OK));
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, "wrong state");
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, SSLConnectDuringPostedWrite) {
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_DEBUG_DEATH({
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoOpenClosed();
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    async_socket_data_provider_.AddWrite(
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::MockWrite(net::ASYNC, kWriteData, 3));
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(chrome_async_socket_->StartTls("fakedomain.com"));
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.RunAllPending();
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoCloseOpened(
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SignalSocketState(SIGNAL_CLOSE,
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ChromeAsyncSocket::STATE_CLOSED,
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ChromeAsyncSocket::ERROR_WRONGSTATE,
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          net::OK));
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, "wrong state");
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After this we can assume SSL connect works as expected.
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, SSLRead) {
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoSSLOpenClosed();
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddRead(net::MockRead(kReadData));
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectSSLReadSignal();
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kReadData, DrainRead(1));
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoSSLCloseOpenedNoError();
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, SSLSyncWrite) {
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::SYNCHRONOUS, kWriteData, 3));
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::SYNCHRONOUS, kWriteData + 3, 5));
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::SYNCHRONOUS,
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     kWriteData + 8, arraysize(kWriteData) - 8));
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoSSLOpenClosed();
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5));
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8,
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          arraysize(kWriteData) - 8));
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoSSLCloseOpenedNoError();
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeAsyncSocketTest, SSLAsyncWrite) {
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoSSLOpenClosed();
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::ASYNC, kWriteData, 3));
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::ASYNC, kWriteData + 3, 5));
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  async_socket_data_provider_.AddWrite(
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::MockWrite(net::ASYNC, kWriteData + 8, arraysize(kWriteData) - 8));
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5));
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8,
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          arraysize(kWriteData) - 8));
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_.RunAllPending();
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectNoSignal();
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoSSLCloseOpenedNoError();
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace jingle_glue
1080