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