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