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