Home | History | Annotate | Download | only in glue
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "jingle/glue/chrome_async_socket.h"
      6 
      7 #include <deque>
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/logging.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/message_loop/message_loop.h"
     14 #include "base/message_loop/message_pump_default.h"
     15 #include "jingle/glue/resolving_client_socket_factory.h"
     16 #include "net/base/address_list.h"
     17 #include "net/base/net_errors.h"
     18 #include "net/base/net_util.h"
     19 #include "net/cert/mock_cert_verifier.h"
     20 #include "net/http/transport_security_state.h"
     21 #include "net/socket/socket_test_util.h"
     22 #include "net/socket/ssl_client_socket.h"
     23 #include "net/ssl/ssl_config_service.h"
     24 #include "net/url_request/url_request_context_getter.h"
     25 #include "testing/gtest/include/gtest/gtest.h"
     26 #include "third_party/webrtc/base/ipaddress.h"
     27 #include "third_party/webrtc/base/sigslot.h"
     28 #include "third_party/webrtc/base/socketaddress.h"
     29 
     30 namespace jingle_glue {
     31 
     32 namespace {
     33 
     34 // Data provider that handles reads/writes for ChromeAsyncSocket.
     35 class AsyncSocketDataProvider : public net::SocketDataProvider {
     36  public:
     37   AsyncSocketDataProvider() : has_pending_read_(false) {}
     38 
     39   virtual ~AsyncSocketDataProvider() {
     40     EXPECT_TRUE(writes_.empty());
     41     EXPECT_TRUE(reads_.empty());
     42   }
     43 
     44   // If there's no read, sets the "has pending read" flag.  Otherwise,
     45   // pops the next read.
     46   virtual net::MockRead GetNextRead() OVERRIDE {
     47     if (reads_.empty()) {
     48       DCHECK(!has_pending_read_);
     49       has_pending_read_ = true;
     50       const net::MockRead pending_read(net::SYNCHRONOUS, net::ERR_IO_PENDING);
     51       return pending_read;
     52     }
     53     net::MockRead mock_read = reads_.front();
     54     reads_.pop_front();
     55     return mock_read;
     56   }
     57 
     58   // Simply pops the next write and, if applicable, compares it to
     59   // |data|.
     60   virtual net::MockWriteResult OnWrite(const std::string& data) OVERRIDE {
     61     DCHECK(!writes_.empty());
     62     net::MockWrite mock_write = writes_.front();
     63     writes_.pop_front();
     64     if (mock_write.result != net::OK) {
     65       return net::MockWriteResult(mock_write.mode, mock_write.result);
     66     }
     67     std::string expected_data(mock_write.data, mock_write.data_len);
     68     EXPECT_EQ(expected_data, data);
     69     if (expected_data != data) {
     70       return net::MockWriteResult(net::SYNCHRONOUS, net::ERR_UNEXPECTED);
     71     }
     72     return net::MockWriteResult(mock_write.mode, data.size());
     73   }
     74 
     75   // We ignore resets so we can pre-load the socket data provider with
     76   // read/write events.
     77   virtual void Reset() OVERRIDE {}
     78 
     79   // If there is a pending read, completes it with the given read.
     80   // Otherwise, queues up the given read.
     81   void AddRead(const net::MockRead& mock_read) {
     82     DCHECK_NE(mock_read.result, net::ERR_IO_PENDING);
     83     if (has_pending_read_) {
     84       socket()->OnReadComplete(mock_read);
     85       has_pending_read_ = false;
     86       return;
     87     }
     88     reads_.push_back(mock_read);
     89   }
     90 
     91   // Simply queues up the given write.
     92   void AddWrite(const net::MockWrite& mock_write) {
     93     writes_.push_back(mock_write);
     94   }
     95 
     96  private:
     97   std::deque<net::MockRead> reads_;
     98   bool has_pending_read_;
     99 
    100   std::deque<net::MockWrite> writes_;
    101 
    102   DISALLOW_COPY_AND_ASSIGN(AsyncSocketDataProvider);
    103 };
    104 
    105 class MockXmppClientSocketFactory : public ResolvingClientSocketFactory {
    106  public:
    107   MockXmppClientSocketFactory(
    108       net::ClientSocketFactory* mock_client_socket_factory,
    109       const net::AddressList& address_list)
    110           : mock_client_socket_factory_(mock_client_socket_factory),
    111             address_list_(address_list),
    112             cert_verifier_(new net::MockCertVerifier),
    113             transport_security_state_(new net::TransportSecurityState) {
    114   }
    115 
    116   // ResolvingClientSocketFactory implementation.
    117   virtual scoped_ptr<net::StreamSocket> CreateTransportClientSocket(
    118       const net::HostPortPair& host_and_port) OVERRIDE {
    119     return mock_client_socket_factory_->CreateTransportClientSocket(
    120         address_list_, NULL, net::NetLog::Source());
    121   }
    122 
    123   virtual scoped_ptr<net::SSLClientSocket> CreateSSLClientSocket(
    124       scoped_ptr<net::ClientSocketHandle> transport_socket,
    125       const net::HostPortPair& host_and_port) OVERRIDE {
    126     net::SSLClientSocketContext context;
    127     context.cert_verifier = cert_verifier_.get();
    128     context.transport_security_state = transport_security_state_.get();
    129     return mock_client_socket_factory_->CreateSSLClientSocket(
    130         transport_socket.Pass(), host_and_port, ssl_config_, context);
    131   }
    132 
    133  private:
    134   scoped_ptr<net::ClientSocketFactory> mock_client_socket_factory_;
    135   net::AddressList address_list_;
    136   net::SSLConfig ssl_config_;
    137   scoped_ptr<net::CertVerifier> cert_verifier_;
    138   scoped_ptr<net::TransportSecurityState> transport_security_state_;
    139 };
    140 
    141 class ChromeAsyncSocketTest
    142     : public testing::Test,
    143       public sigslot::has_slots<> {
    144  protected:
    145   ChromeAsyncSocketTest()
    146       : ssl_socket_data_provider_(net::ASYNC, net::OK),
    147         addr_("localhost", 35) {
    148     // GTest death tests execute in a fork()ed but not exec()ed process.
    149     // On OS X a CoreFoundation-backed message loop will exit with a
    150     // __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__
    151     // when called.
    152     // Explicitly create a MessagePumpDefault which can run in this enivronment.
    153     scoped_ptr<base::MessagePump> pump(new base::MessagePumpDefault());
    154     message_loop_.reset(new base::MessageLoop(pump.Pass()));
    155   }
    156 
    157   virtual ~ChromeAsyncSocketTest() {}
    158 
    159   virtual void SetUp() {
    160     scoped_ptr<net::MockClientSocketFactory> mock_client_socket_factory(
    161         new net::MockClientSocketFactory());
    162     mock_client_socket_factory->AddSocketDataProvider(
    163         &async_socket_data_provider_);
    164     mock_client_socket_factory->AddSSLSocketDataProvider(
    165         &ssl_socket_data_provider_);
    166 
    167     // Fake DNS resolution for |addr_| and pass it to the factory.
    168     net::IPAddressNumber resolved_addr;
    169     EXPECT_TRUE(net::ParseIPLiteralToNumber("127.0.0.1", &resolved_addr));
    170     const net::AddressList address_list =
    171         net::AddressList::CreateFromIPAddress(resolved_addr, addr_.port());
    172     scoped_ptr<MockXmppClientSocketFactory> mock_xmpp_client_socket_factory(
    173         new MockXmppClientSocketFactory(
    174             mock_client_socket_factory.release(),
    175             address_list));
    176     chrome_async_socket_.reset(
    177         new ChromeAsyncSocket(mock_xmpp_client_socket_factory.release(),
    178                               14, 20)),
    179 
    180     chrome_async_socket_->SignalConnected.connect(
    181         this, &ChromeAsyncSocketTest::OnConnect);
    182     chrome_async_socket_->SignalSSLConnected.connect(
    183         this, &ChromeAsyncSocketTest::OnSSLConnect);
    184     chrome_async_socket_->SignalClosed.connect(
    185         this, &ChromeAsyncSocketTest::OnClose);
    186     chrome_async_socket_->SignalRead.connect(
    187         this, &ChromeAsyncSocketTest::OnRead);
    188     chrome_async_socket_->SignalError.connect(
    189         this, &ChromeAsyncSocketTest::OnError);
    190   }
    191 
    192   virtual void TearDown() {
    193     // Run any tasks that we forgot to pump.
    194     message_loop_->RunUntilIdle();
    195     ExpectClosed();
    196     ExpectNoSignal();
    197     chrome_async_socket_.reset();
    198   }
    199 
    200   enum Signal {
    201     SIGNAL_CONNECT,
    202     SIGNAL_SSL_CONNECT,
    203     SIGNAL_CLOSE,
    204     SIGNAL_READ,
    205     SIGNAL_ERROR,
    206   };
    207 
    208   // Helper struct that records the state at the time of a signal.
    209 
    210   struct SignalSocketState {
    211     SignalSocketState()
    212         : signal(SIGNAL_ERROR),
    213           state(ChromeAsyncSocket::STATE_CLOSED),
    214           error(ChromeAsyncSocket::ERROR_NONE),
    215           net_error(net::OK) {}
    216 
    217     SignalSocketState(
    218         Signal signal,
    219         ChromeAsyncSocket::State state,
    220         ChromeAsyncSocket::Error error,
    221         net::Error net_error)
    222         : signal(signal),
    223           state(state),
    224           error(error),
    225           net_error(net_error) {}
    226 
    227     bool IsEqual(const SignalSocketState& other) const {
    228       return
    229           (signal == other.signal) &&
    230           (state == other.state) &&
    231           (error == other.error) &&
    232           (net_error == other.net_error);
    233     }
    234 
    235     static SignalSocketState FromAsyncSocket(
    236         Signal signal,
    237         buzz::AsyncSocket* async_socket) {
    238       return SignalSocketState(signal,
    239                                async_socket->state(),
    240                                async_socket->error(),
    241                                static_cast<net::Error>(
    242                                    async_socket->GetError()));
    243     }
    244 
    245     static SignalSocketState NoError(
    246         Signal signal, buzz::AsyncSocket::State state) {
    247         return SignalSocketState(signal, state,
    248                                  buzz::AsyncSocket::ERROR_NONE,
    249                                  net::OK);
    250     }
    251 
    252     Signal signal;
    253     ChromeAsyncSocket::State state;
    254     ChromeAsyncSocket::Error error;
    255     net::Error net_error;
    256   };
    257 
    258   void CaptureSocketState(Signal signal) {
    259     signal_socket_states_.push_back(
    260         SignalSocketState::FromAsyncSocket(
    261             signal, chrome_async_socket_.get()));
    262   }
    263 
    264   void OnConnect() {
    265     CaptureSocketState(SIGNAL_CONNECT);
    266   }
    267 
    268   void OnSSLConnect() {
    269     CaptureSocketState(SIGNAL_SSL_CONNECT);
    270   }
    271 
    272   void OnClose() {
    273     CaptureSocketState(SIGNAL_CLOSE);
    274   }
    275 
    276   void OnRead() {
    277     CaptureSocketState(SIGNAL_READ);
    278   }
    279 
    280   void OnError() {
    281     ADD_FAILURE();
    282   }
    283 
    284   // State expect functions.
    285 
    286   void ExpectState(ChromeAsyncSocket::State state,
    287                    ChromeAsyncSocket::Error error,
    288                    net::Error net_error) {
    289     EXPECT_EQ(state, chrome_async_socket_->state());
    290     EXPECT_EQ(error, chrome_async_socket_->error());
    291     EXPECT_EQ(net_error, chrome_async_socket_->GetError());
    292   }
    293 
    294   void ExpectNonErrorState(ChromeAsyncSocket::State state) {
    295     ExpectState(state, ChromeAsyncSocket::ERROR_NONE, net::OK);
    296   }
    297 
    298   void ExpectErrorState(ChromeAsyncSocket::State state,
    299                         ChromeAsyncSocket::Error error) {
    300     ExpectState(state, error, net::OK);
    301   }
    302 
    303   void ExpectClosed() {
    304     ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED);
    305   }
    306 
    307   // Signal expect functions.
    308 
    309   void ExpectNoSignal() {
    310     if (!signal_socket_states_.empty()) {
    311       ADD_FAILURE() << signal_socket_states_.front().signal;
    312     }
    313   }
    314 
    315   void ExpectSignalSocketState(
    316       SignalSocketState expected_signal_socket_state) {
    317     if (signal_socket_states_.empty()) {
    318       ADD_FAILURE() << expected_signal_socket_state.signal;
    319       return;
    320     }
    321     EXPECT_TRUE(expected_signal_socket_state.IsEqual(
    322         signal_socket_states_.front()))
    323         << signal_socket_states_.front().signal;
    324     signal_socket_states_.pop_front();
    325   }
    326 
    327   void ExpectReadSignal() {
    328     ExpectSignalSocketState(
    329         SignalSocketState::NoError(
    330             SIGNAL_READ, ChromeAsyncSocket::STATE_OPEN));
    331   }
    332 
    333   void ExpectSSLConnectSignal() {
    334     ExpectSignalSocketState(
    335         SignalSocketState::NoError(SIGNAL_SSL_CONNECT,
    336                                    ChromeAsyncSocket::STATE_TLS_OPEN));
    337   }
    338 
    339   void ExpectSSLReadSignal() {
    340     ExpectSignalSocketState(
    341         SignalSocketState::NoError(
    342             SIGNAL_READ, ChromeAsyncSocket::STATE_TLS_OPEN));
    343   }
    344 
    345   // Open/close utility functions.
    346 
    347   void DoOpenClosed() {
    348     ExpectClosed();
    349     async_socket_data_provider_.set_connect_data(
    350         net::MockConnect(net::SYNCHRONOUS, net::OK));
    351     EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
    352     ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING);
    353 
    354     message_loop_->RunUntilIdle();
    355     // We may not necessarily be open; may have been other events
    356     // queued up.
    357     ExpectSignalSocketState(
    358         SignalSocketState::NoError(
    359             SIGNAL_CONNECT, ChromeAsyncSocket::STATE_OPEN));
    360   }
    361 
    362   void DoCloseOpened(SignalSocketState expected_signal_socket_state) {
    363     // We may be in an error state, so just compare state().
    364     EXPECT_EQ(ChromeAsyncSocket::STATE_OPEN, chrome_async_socket_->state());
    365     EXPECT_TRUE(chrome_async_socket_->Close());
    366     ExpectSignalSocketState(expected_signal_socket_state);
    367     ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED);
    368   }
    369 
    370   void DoCloseOpenedNoError() {
    371     DoCloseOpened(
    372         SignalSocketState::NoError(
    373             SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
    374   }
    375 
    376   void DoSSLOpenClosed() {
    377     const char kDummyData[] = "dummy_data";
    378     async_socket_data_provider_.AddRead(net::MockRead(kDummyData));
    379     DoOpenClosed();
    380     ExpectReadSignal();
    381     EXPECT_EQ(kDummyData, DrainRead(1));
    382 
    383     EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
    384     message_loop_->RunUntilIdle();
    385     ExpectSSLConnectSignal();
    386     ExpectNoSignal();
    387     ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN);
    388   }
    389 
    390   void DoSSLCloseOpened(SignalSocketState expected_signal_socket_state) {
    391     // We may be in an error state, so just compare state().
    392     EXPECT_EQ(ChromeAsyncSocket::STATE_TLS_OPEN,
    393               chrome_async_socket_->state());
    394     EXPECT_TRUE(chrome_async_socket_->Close());
    395     ExpectSignalSocketState(expected_signal_socket_state);
    396     ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED);
    397   }
    398 
    399   void DoSSLCloseOpenedNoError() {
    400     DoSSLCloseOpened(
    401         SignalSocketState::NoError(
    402             SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
    403   }
    404 
    405   // Read utility fucntions.
    406 
    407   std::string DrainRead(size_t buf_size) {
    408     std::string read;
    409     scoped_ptr<char[]> buf(new char[buf_size]);
    410     size_t len_read;
    411     while (true) {
    412       bool success =
    413           chrome_async_socket_->Read(buf.get(), buf_size, &len_read);
    414       if (!success) {
    415         ADD_FAILURE();
    416         break;
    417       }
    418       if (len_read == 0U) {
    419         break;
    420       }
    421       read.append(buf.get(), len_read);
    422     }
    423     return read;
    424   }
    425 
    426   // ChromeAsyncSocket expects a message loop.
    427   scoped_ptr<base::MessageLoop> message_loop_;
    428 
    429   AsyncSocketDataProvider async_socket_data_provider_;
    430   net::SSLSocketDataProvider ssl_socket_data_provider_;
    431 
    432   scoped_ptr<ChromeAsyncSocket> chrome_async_socket_;
    433   std::deque<SignalSocketState> signal_socket_states_;
    434   const rtc::SocketAddress addr_;
    435 
    436  private:
    437   DISALLOW_COPY_AND_ASSIGN(ChromeAsyncSocketTest);
    438 };
    439 
    440 TEST_F(ChromeAsyncSocketTest, InitialState) {
    441   ExpectClosed();
    442   ExpectNoSignal();
    443 }
    444 
    445 TEST_F(ChromeAsyncSocketTest, EmptyClose) {
    446   ExpectClosed();
    447   EXPECT_TRUE(chrome_async_socket_->Close());
    448   ExpectClosed();
    449 }
    450 
    451 TEST_F(ChromeAsyncSocketTest, ImmediateConnectAndClose) {
    452   DoOpenClosed();
    453 
    454   ExpectNonErrorState(ChromeAsyncSocket::STATE_OPEN);
    455 
    456   DoCloseOpenedNoError();
    457 }
    458 
    459 // After this, no need to test immediate successful connect and
    460 // Close() so thoroughly.
    461 
    462 TEST_F(ChromeAsyncSocketTest, DoubleClose) {
    463   DoOpenClosed();
    464 
    465   EXPECT_TRUE(chrome_async_socket_->Close());
    466   ExpectClosed();
    467   ExpectSignalSocketState(
    468       SignalSocketState::NoError(
    469           SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
    470 
    471   EXPECT_TRUE(chrome_async_socket_->Close());
    472   ExpectClosed();
    473 }
    474 
    475 TEST_F(ChromeAsyncSocketTest, NoHostnameConnect) {
    476   rtc::IPAddress ip_address;
    477   EXPECT_TRUE(rtc::IPFromString("127.0.0.1", &ip_address));
    478   const rtc::SocketAddress no_hostname_addr(ip_address, addr_.port());
    479   EXPECT_FALSE(chrome_async_socket_->Connect(no_hostname_addr));
    480   ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED,
    481                    ChromeAsyncSocket::ERROR_DNS);
    482 
    483   EXPECT_TRUE(chrome_async_socket_->Close());
    484   ExpectClosed();
    485 }
    486 
    487 TEST_F(ChromeAsyncSocketTest, ZeroPortConnect) {
    488   const rtc::SocketAddress zero_port_addr(addr_.hostname(), 0);
    489   EXPECT_FALSE(chrome_async_socket_->Connect(zero_port_addr));
    490   ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED,
    491                    ChromeAsyncSocket::ERROR_DNS);
    492 
    493   EXPECT_TRUE(chrome_async_socket_->Close());
    494   ExpectClosed();
    495 }
    496 
    497 TEST_F(ChromeAsyncSocketTest, DoubleConnect) {
    498   EXPECT_DEBUG_DEATH({
    499     DoOpenClosed();
    500 
    501     EXPECT_FALSE(chrome_async_socket_->Connect(addr_));
    502     ExpectErrorState(ChromeAsyncSocket::STATE_OPEN,
    503                      ChromeAsyncSocket::ERROR_WRONGSTATE);
    504 
    505     DoCloseOpened(
    506         SignalSocketState(SIGNAL_CLOSE,
    507                           ChromeAsyncSocket::STATE_CLOSED,
    508                           ChromeAsyncSocket::ERROR_WRONGSTATE,
    509                           net::OK));
    510   }, "non-closed socket");
    511 }
    512 
    513 TEST_F(ChromeAsyncSocketTest, ImmediateConnectCloseBeforeRead) {
    514   DoOpenClosed();
    515 
    516   EXPECT_TRUE(chrome_async_socket_->Close());
    517   ExpectClosed();
    518   ExpectSignalSocketState(
    519       SignalSocketState::NoError(
    520           SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
    521 
    522   message_loop_->RunUntilIdle();
    523 }
    524 
    525 TEST_F(ChromeAsyncSocketTest, HangingConnect) {
    526   EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
    527   ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING);
    528   ExpectNoSignal();
    529 
    530   EXPECT_TRUE(chrome_async_socket_->Close());
    531   ExpectClosed();
    532   ExpectSignalSocketState(
    533       SignalSocketState::NoError(
    534           SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
    535 }
    536 
    537 TEST_F(ChromeAsyncSocketTest, PendingConnect) {
    538   async_socket_data_provider_.set_connect_data(
    539       net::MockConnect(net::ASYNC, net::OK));
    540   EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
    541   ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING);
    542   ExpectNoSignal();
    543 
    544   message_loop_->RunUntilIdle();
    545   ExpectNonErrorState(ChromeAsyncSocket::STATE_OPEN);
    546   ExpectSignalSocketState(
    547       SignalSocketState::NoError(
    548           SIGNAL_CONNECT, ChromeAsyncSocket::STATE_OPEN));
    549   ExpectNoSignal();
    550 
    551   message_loop_->RunUntilIdle();
    552 
    553   DoCloseOpenedNoError();
    554 }
    555 
    556 // After this no need to test successful pending connect so
    557 // thoroughly.
    558 
    559 TEST_F(ChromeAsyncSocketTest, PendingConnectCloseBeforeRead) {
    560   async_socket_data_provider_.set_connect_data(
    561       net::MockConnect(net::ASYNC, net::OK));
    562   EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
    563 
    564   message_loop_->RunUntilIdle();
    565   ExpectSignalSocketState(
    566       SignalSocketState::NoError(
    567           SIGNAL_CONNECT, ChromeAsyncSocket::STATE_OPEN));
    568 
    569   DoCloseOpenedNoError();
    570 
    571   message_loop_->RunUntilIdle();
    572 }
    573 
    574 TEST_F(ChromeAsyncSocketTest, PendingConnectError) {
    575   async_socket_data_provider_.set_connect_data(
    576       net::MockConnect(net::ASYNC, net::ERR_TIMED_OUT));
    577   EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
    578 
    579   message_loop_->RunUntilIdle();
    580 
    581   ExpectSignalSocketState(
    582       SignalSocketState(
    583           SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
    584           ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT));
    585 }
    586 
    587 // After this we can assume Connect() and Close() work as expected.
    588 
    589 TEST_F(ChromeAsyncSocketTest, EmptyRead) {
    590   DoOpenClosed();
    591 
    592   char buf[4096];
    593   size_t len_read = 10000U;
    594   EXPECT_TRUE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read));
    595   EXPECT_EQ(0U, len_read);
    596 
    597   DoCloseOpenedNoError();
    598 }
    599 
    600 TEST_F(ChromeAsyncSocketTest, WrongRead) {
    601   EXPECT_DEBUG_DEATH({
    602     async_socket_data_provider_.set_connect_data(
    603         net::MockConnect(net::ASYNC, net::OK));
    604     EXPECT_TRUE(chrome_async_socket_->Connect(addr_));
    605     ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING);
    606     ExpectNoSignal();
    607 
    608     char buf[4096];
    609     size_t len_read;
    610     EXPECT_FALSE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read));
    611     ExpectErrorState(ChromeAsyncSocket::STATE_CONNECTING,
    612                      ChromeAsyncSocket::ERROR_WRONGSTATE);
    613     EXPECT_TRUE(chrome_async_socket_->Close());
    614     ExpectSignalSocketState(
    615         SignalSocketState(
    616             SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
    617             ChromeAsyncSocket::ERROR_WRONGSTATE, net::OK));
    618   }, "non-open");
    619 }
    620 
    621 TEST_F(ChromeAsyncSocketTest, WrongReadClosed) {
    622   char buf[4096];
    623   size_t len_read;
    624   EXPECT_FALSE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read));
    625   ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED,
    626                    ChromeAsyncSocket::ERROR_WRONGSTATE);
    627   EXPECT_TRUE(chrome_async_socket_->Close());
    628 }
    629 
    630 const char kReadData[] = "mydatatoread";
    631 
    632 TEST_F(ChromeAsyncSocketTest, Read) {
    633   async_socket_data_provider_.AddRead(net::MockRead(kReadData));
    634   DoOpenClosed();
    635 
    636   ExpectReadSignal();
    637   ExpectNoSignal();
    638 
    639   EXPECT_EQ(kReadData, DrainRead(1));
    640 
    641   message_loop_->RunUntilIdle();
    642 
    643   DoCloseOpenedNoError();
    644 }
    645 
    646 TEST_F(ChromeAsyncSocketTest, ReadTwice) {
    647   async_socket_data_provider_.AddRead(net::MockRead(kReadData));
    648   DoOpenClosed();
    649 
    650   ExpectReadSignal();
    651   ExpectNoSignal();
    652 
    653   EXPECT_EQ(kReadData, DrainRead(1));
    654 
    655   message_loop_->RunUntilIdle();
    656 
    657   const char kReadData2[] = "mydatatoread2";
    658   async_socket_data_provider_.AddRead(net::MockRead(kReadData2));
    659 
    660   ExpectReadSignal();
    661   ExpectNoSignal();
    662 
    663   EXPECT_EQ(kReadData2, DrainRead(1));
    664 
    665   DoCloseOpenedNoError();
    666 }
    667 
    668 TEST_F(ChromeAsyncSocketTest, ReadError) {
    669   async_socket_data_provider_.AddRead(net::MockRead(kReadData));
    670   DoOpenClosed();
    671 
    672   ExpectReadSignal();
    673   ExpectNoSignal();
    674 
    675   EXPECT_EQ(kReadData, DrainRead(1));
    676 
    677   message_loop_->RunUntilIdle();
    678 
    679   async_socket_data_provider_.AddRead(
    680       net::MockRead(net::SYNCHRONOUS, net::ERR_TIMED_OUT));
    681 
    682   ExpectSignalSocketState(
    683       SignalSocketState(
    684           SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
    685           ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT));
    686 }
    687 
    688 TEST_F(ChromeAsyncSocketTest, ReadEmpty) {
    689   async_socket_data_provider_.AddRead(net::MockRead(""));
    690   DoOpenClosed();
    691 
    692   ExpectSignalSocketState(
    693       SignalSocketState::NoError(
    694           SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
    695 }
    696 
    697 TEST_F(ChromeAsyncSocketTest, PendingRead) {
    698   DoOpenClosed();
    699 
    700   ExpectNoSignal();
    701 
    702   async_socket_data_provider_.AddRead(net::MockRead(kReadData));
    703 
    704   ExpectSignalSocketState(
    705       SignalSocketState::NoError(
    706           SIGNAL_READ, ChromeAsyncSocket::STATE_OPEN));
    707   ExpectNoSignal();
    708 
    709   EXPECT_EQ(kReadData, DrainRead(1));
    710 
    711   message_loop_->RunUntilIdle();
    712 
    713   DoCloseOpenedNoError();
    714 }
    715 
    716 TEST_F(ChromeAsyncSocketTest, PendingEmptyRead) {
    717   DoOpenClosed();
    718 
    719   ExpectNoSignal();
    720 
    721   async_socket_data_provider_.AddRead(net::MockRead(""));
    722 
    723   ExpectSignalSocketState(
    724       SignalSocketState::NoError(
    725           SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED));
    726 }
    727 
    728 TEST_F(ChromeAsyncSocketTest, PendingReadError) {
    729   DoOpenClosed();
    730 
    731   ExpectNoSignal();
    732 
    733   async_socket_data_provider_.AddRead(
    734       net::MockRead(net::ASYNC, net::ERR_TIMED_OUT));
    735 
    736   ExpectSignalSocketState(
    737       SignalSocketState(
    738           SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
    739           ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT));
    740 }
    741 
    742 // After this we can assume non-SSL Read() works as expected.
    743 
    744 TEST_F(ChromeAsyncSocketTest, WrongWrite) {
    745   EXPECT_DEBUG_DEATH({
    746     std::string data("foo");
    747     EXPECT_FALSE(chrome_async_socket_->Write(data.data(), data.size()));
    748     ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED,
    749                      ChromeAsyncSocket::ERROR_WRONGSTATE);
    750     EXPECT_TRUE(chrome_async_socket_->Close());
    751   }, "non-open");
    752 }
    753 
    754 const char kWriteData[] = "mydatatowrite";
    755 
    756 TEST_F(ChromeAsyncSocketTest, SyncWrite) {
    757   async_socket_data_provider_.AddWrite(
    758       net::MockWrite(net::SYNCHRONOUS, kWriteData, 3));
    759   async_socket_data_provider_.AddWrite(
    760       net::MockWrite(net::SYNCHRONOUS, kWriteData + 3, 5));
    761   async_socket_data_provider_.AddWrite(
    762       net::MockWrite(net::SYNCHRONOUS,
    763                      kWriteData + 8, arraysize(kWriteData) - 8));
    764   DoOpenClosed();
    765 
    766   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
    767   message_loop_->RunUntilIdle();
    768   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5));
    769   message_loop_->RunUntilIdle();
    770   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8,
    771                                           arraysize(kWriteData) - 8));
    772   message_loop_->RunUntilIdle();
    773 
    774   ExpectNoSignal();
    775 
    776   DoCloseOpenedNoError();
    777 }
    778 
    779 TEST_F(ChromeAsyncSocketTest, AsyncWrite) {
    780   DoOpenClosed();
    781 
    782   async_socket_data_provider_.AddWrite(
    783       net::MockWrite(net::ASYNC, kWriteData, 3));
    784   async_socket_data_provider_.AddWrite(
    785       net::MockWrite(net::ASYNC, kWriteData + 3, 5));
    786   async_socket_data_provider_.AddWrite(
    787       net::MockWrite(net::ASYNC, kWriteData + 8, arraysize(kWriteData) - 8));
    788 
    789   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
    790   message_loop_->RunUntilIdle();
    791   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5));
    792   message_loop_->RunUntilIdle();
    793   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8,
    794                                           arraysize(kWriteData) - 8));
    795   message_loop_->RunUntilIdle();
    796 
    797   ExpectNoSignal();
    798 
    799   DoCloseOpenedNoError();
    800 }
    801 
    802 TEST_F(ChromeAsyncSocketTest, AsyncWriteError) {
    803   DoOpenClosed();
    804 
    805   async_socket_data_provider_.AddWrite(
    806       net::MockWrite(net::ASYNC, kWriteData, 3));
    807   async_socket_data_provider_.AddWrite(
    808       net::MockWrite(net::ASYNC, kWriteData + 3, 5));
    809   async_socket_data_provider_.AddWrite(
    810       net::MockWrite(net::ASYNC, net::ERR_TIMED_OUT));
    811 
    812   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
    813   message_loop_->RunUntilIdle();
    814   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5));
    815   message_loop_->RunUntilIdle();
    816   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8,
    817                                           arraysize(kWriteData) - 8));
    818   message_loop_->RunUntilIdle();
    819 
    820   ExpectSignalSocketState(
    821       SignalSocketState(
    822           SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
    823           ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT));
    824 }
    825 
    826 TEST_F(ChromeAsyncSocketTest, LargeWrite) {
    827   EXPECT_DEBUG_DEATH({
    828     DoOpenClosed();
    829 
    830     std::string large_data(100, 'x');
    831     EXPECT_FALSE(chrome_async_socket_->Write(large_data.data(),
    832                                              large_data.size()));
    833     ExpectState(ChromeAsyncSocket::STATE_OPEN,
    834                 ChromeAsyncSocket::ERROR_WINSOCK,
    835                 net::ERR_INSUFFICIENT_RESOURCES);
    836     DoCloseOpened(
    837         SignalSocketState(
    838             SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
    839             ChromeAsyncSocket::ERROR_WINSOCK,
    840             net::ERR_INSUFFICIENT_RESOURCES));
    841     }, "exceed the max write buffer");
    842 }
    843 
    844 TEST_F(ChromeAsyncSocketTest, LargeAccumulatedWrite) {
    845   EXPECT_DEBUG_DEATH({
    846     DoOpenClosed();
    847 
    848     std::string data(15, 'x');
    849     EXPECT_TRUE(chrome_async_socket_->Write(data.data(), data.size()));
    850     EXPECT_FALSE(chrome_async_socket_->Write(data.data(), data.size()));
    851     ExpectState(ChromeAsyncSocket::STATE_OPEN,
    852                 ChromeAsyncSocket::ERROR_WINSOCK,
    853                 net::ERR_INSUFFICIENT_RESOURCES);
    854     DoCloseOpened(
    855         SignalSocketState(
    856             SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
    857             ChromeAsyncSocket::ERROR_WINSOCK,
    858             net::ERR_INSUFFICIENT_RESOURCES));
    859     }, "exceed the max write buffer");
    860 }
    861 
    862 // After this we can assume non-SSL I/O works as expected.
    863 
    864 TEST_F(ChromeAsyncSocketTest, HangingSSLConnect) {
    865   async_socket_data_provider_.AddRead(net::MockRead(kReadData));
    866   DoOpenClosed();
    867   ExpectReadSignal();
    868 
    869   EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
    870   ExpectNoSignal();
    871 
    872   ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_CONNECTING);
    873   EXPECT_TRUE(chrome_async_socket_->Close());
    874   ExpectSignalSocketState(
    875       SignalSocketState::NoError(SIGNAL_CLOSE,
    876                                  ChromeAsyncSocket::STATE_CLOSED));
    877   ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED);
    878 }
    879 
    880 TEST_F(ChromeAsyncSocketTest, ImmediateSSLConnect) {
    881   async_socket_data_provider_.AddRead(net::MockRead(kReadData));
    882   DoOpenClosed();
    883   ExpectReadSignal();
    884 
    885   EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
    886   message_loop_->RunUntilIdle();
    887   ExpectSSLConnectSignal();
    888   ExpectNoSignal();
    889   ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN);
    890 
    891   DoSSLCloseOpenedNoError();
    892 }
    893 
    894 TEST_F(ChromeAsyncSocketTest, DoubleSSLConnect) {
    895   EXPECT_DEBUG_DEATH({
    896     async_socket_data_provider_.AddRead(net::MockRead(kReadData));
    897     DoOpenClosed();
    898     ExpectReadSignal();
    899 
    900     EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
    901     message_loop_->RunUntilIdle();
    902     ExpectSSLConnectSignal();
    903     ExpectNoSignal();
    904     ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN);
    905 
    906     EXPECT_FALSE(chrome_async_socket_->StartTls("fakedomain.com"));
    907 
    908     DoSSLCloseOpened(
    909         SignalSocketState(SIGNAL_CLOSE,
    910                           ChromeAsyncSocket::STATE_CLOSED,
    911                           ChromeAsyncSocket::ERROR_WRONGSTATE,
    912                           net::OK));
    913   }, "wrong state");
    914 }
    915 
    916 TEST_F(ChromeAsyncSocketTest, FailedSSLConnect) {
    917   ssl_socket_data_provider_.connect =
    918       net::MockConnect(net::ASYNC, net::ERR_CERT_COMMON_NAME_INVALID),
    919 
    920   async_socket_data_provider_.AddRead(net::MockRead(kReadData));
    921   DoOpenClosed();
    922   ExpectReadSignal();
    923 
    924   EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
    925   message_loop_->RunUntilIdle();
    926   ExpectSignalSocketState(
    927       SignalSocketState(
    928           SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED,
    929           ChromeAsyncSocket::ERROR_WINSOCK,
    930           net::ERR_CERT_COMMON_NAME_INVALID));
    931 
    932   EXPECT_TRUE(chrome_async_socket_->Close());
    933   ExpectClosed();
    934 }
    935 
    936 TEST_F(ChromeAsyncSocketTest, ReadDuringSSLConnecting) {
    937   async_socket_data_provider_.AddRead(net::MockRead(kReadData));
    938   DoOpenClosed();
    939   ExpectReadSignal();
    940   EXPECT_EQ(kReadData, DrainRead(1));
    941 
    942   EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
    943   ExpectNoSignal();
    944 
    945   // Shouldn't do anything.
    946   async_socket_data_provider_.AddRead(net::MockRead(kReadData));
    947 
    948   char buf[4096];
    949   size_t len_read = 10000U;
    950   EXPECT_TRUE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read));
    951   EXPECT_EQ(0U, len_read);
    952 
    953   message_loop_->RunUntilIdle();
    954   ExpectSSLConnectSignal();
    955   ExpectSSLReadSignal();
    956   ExpectNoSignal();
    957   ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN);
    958 
    959   len_read = 10000U;
    960   EXPECT_TRUE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read));
    961   EXPECT_EQ(kReadData, std::string(buf, len_read));
    962 
    963   DoSSLCloseOpenedNoError();
    964 }
    965 
    966 TEST_F(ChromeAsyncSocketTest, WriteDuringSSLConnecting) {
    967   async_socket_data_provider_.AddRead(net::MockRead(kReadData));
    968   DoOpenClosed();
    969   ExpectReadSignal();
    970 
    971   EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com"));
    972   ExpectNoSignal();
    973   ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_CONNECTING);
    974 
    975   async_socket_data_provider_.AddWrite(
    976       net::MockWrite(net::ASYNC, kWriteData, 3));
    977 
    978   // Shouldn't do anything.
    979   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
    980 
    981   // TODO(akalin): Figure out how to test that the write happens
    982   // *after* the SSL connect.
    983 
    984   message_loop_->RunUntilIdle();
    985   ExpectSSLConnectSignal();
    986   ExpectNoSignal();
    987 
    988   message_loop_->RunUntilIdle();
    989 
    990   DoSSLCloseOpenedNoError();
    991 }
    992 
    993 TEST_F(ChromeAsyncSocketTest, SSLConnectDuringPendingRead) {
    994   EXPECT_DEBUG_DEATH({
    995     DoOpenClosed();
    996 
    997     EXPECT_FALSE(chrome_async_socket_->StartTls("fakedomain.com"));
    998 
    999     DoCloseOpened(
   1000         SignalSocketState(SIGNAL_CLOSE,
   1001                           ChromeAsyncSocket::STATE_CLOSED,
   1002                           ChromeAsyncSocket::ERROR_WRONGSTATE,
   1003                           net::OK));
   1004   }, "wrong state");
   1005 }
   1006 
   1007 TEST_F(ChromeAsyncSocketTest, SSLConnectDuringPostedWrite) {
   1008   EXPECT_DEBUG_DEATH({
   1009     DoOpenClosed();
   1010 
   1011     async_socket_data_provider_.AddWrite(
   1012         net::MockWrite(net::ASYNC, kWriteData, 3));
   1013     EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
   1014 
   1015     EXPECT_FALSE(chrome_async_socket_->StartTls("fakedomain.com"));
   1016 
   1017     message_loop_->RunUntilIdle();
   1018 
   1019     DoCloseOpened(
   1020         SignalSocketState(SIGNAL_CLOSE,
   1021                           ChromeAsyncSocket::STATE_CLOSED,
   1022                           ChromeAsyncSocket::ERROR_WRONGSTATE,
   1023                           net::OK));
   1024   }, "wrong state");
   1025 }
   1026 
   1027 // After this we can assume SSL connect works as expected.
   1028 
   1029 TEST_F(ChromeAsyncSocketTest, SSLRead) {
   1030   DoSSLOpenClosed();
   1031   async_socket_data_provider_.AddRead(net::MockRead(kReadData));
   1032   message_loop_->RunUntilIdle();
   1033 
   1034   ExpectSSLReadSignal();
   1035   ExpectNoSignal();
   1036 
   1037   EXPECT_EQ(kReadData, DrainRead(1));
   1038 
   1039   message_loop_->RunUntilIdle();
   1040 
   1041   DoSSLCloseOpenedNoError();
   1042 }
   1043 
   1044 TEST_F(ChromeAsyncSocketTest, SSLSyncWrite) {
   1045   async_socket_data_provider_.AddWrite(
   1046       net::MockWrite(net::SYNCHRONOUS, kWriteData, 3));
   1047   async_socket_data_provider_.AddWrite(
   1048       net::MockWrite(net::SYNCHRONOUS, kWriteData + 3, 5));
   1049   async_socket_data_provider_.AddWrite(
   1050       net::MockWrite(net::SYNCHRONOUS,
   1051                      kWriteData + 8, arraysize(kWriteData) - 8));
   1052   DoSSLOpenClosed();
   1053 
   1054   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
   1055   message_loop_->RunUntilIdle();
   1056   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5));
   1057   message_loop_->RunUntilIdle();
   1058   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8,
   1059                                           arraysize(kWriteData) - 8));
   1060   message_loop_->RunUntilIdle();
   1061 
   1062   ExpectNoSignal();
   1063 
   1064   DoSSLCloseOpenedNoError();
   1065 }
   1066 
   1067 TEST_F(ChromeAsyncSocketTest, SSLAsyncWrite) {
   1068   DoSSLOpenClosed();
   1069 
   1070   async_socket_data_provider_.AddWrite(
   1071       net::MockWrite(net::ASYNC, kWriteData, 3));
   1072   async_socket_data_provider_.AddWrite(
   1073       net::MockWrite(net::ASYNC, kWriteData + 3, 5));
   1074   async_socket_data_provider_.AddWrite(
   1075       net::MockWrite(net::ASYNC, kWriteData + 8, arraysize(kWriteData) - 8));
   1076 
   1077   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3));
   1078   message_loop_->RunUntilIdle();
   1079   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5));
   1080   message_loop_->RunUntilIdle();
   1081   EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8,
   1082                                           arraysize(kWriteData) - 8));
   1083   message_loop_->RunUntilIdle();
   1084 
   1085   ExpectNoSignal();
   1086 
   1087   DoSSLCloseOpenedNoError();
   1088 }
   1089 
   1090 }  // namespace
   1091 
   1092 }  // namespace jingle_glue
   1093