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