Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: net/websockets/websocket_job_unittest.cc

Issue 7185032: WebSocket over SPDY: WebSocketJob handling SpdyWebSocketStream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: last change cause deadlock on SocketStreamTest Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/websockets/websocket_job.h" 5 #include "net/websockets/websocket_job.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
11 #include "base/string_split.h" 11 #include "base/string_split.h"
12 #include "base/string_util.h" 12 #include "base/string_util.h"
13 #include "googleurl/src/gurl.h" 13 #include "googleurl/src/gurl.h"
14 #include "net/base/completion_callback.h" 14 #include "net/base/completion_callback.h"
15 #include "net/base/cookie_store.h" 15 #include "net/base/cookie_store.h"
16 #include "net/base/mock_host_resolver.h" 16 #include "net/base/mock_host_resolver.h"
17 #include "net/base/net_errors.h" 17 #include "net/base/net_errors.h"
18 #include "net/base/ssl_config_service.h" 18 #include "net/base/ssl_config_service.h"
19 #include "net/base/sys_addrinfo.h" 19 #include "net/base/sys_addrinfo.h"
20 #include "net/base/test_completion_callback.h" 20 #include "net/base/test_completion_callback.h"
21 #include "net/base/transport_security_state.h" 21 #include "net/base/transport_security_state.h"
22 #include "net/http/http_transaction_factory.h"
22 #include "net/proxy/proxy_service.h" 23 #include "net/proxy/proxy_service.h"
23 #include "net/socket/socket_test_util.h" 24 #include "net/socket/socket_test_util.h"
24 #include "net/socket_stream/socket_stream.h" 25 #include "net/socket_stream/socket_stream.h"
26 #include "net/spdy/spdy_session.h"
27 #include "net/spdy/spdy_test_util.h"
28 #include "net/spdy/spdy_websocket_test_util.h"
25 #include "net/url_request/url_request_context.h" 29 #include "net/url_request/url_request_context.h"
26 #include "net/websockets/websocket_throttle.h" 30 #include "net/websockets/websocket_throttle.h"
27 #include "testing/gtest/include/gtest/gtest.h" 31 #include "testing/gtest/include/gtest/gtest.h"
28 #include "testing/gmock/include/gmock/gmock.h" 32 #include "testing/gmock/include/gmock/gmock.h"
29 #include "testing/platform_test.h" 33 #include "testing/platform_test.h"
30 34
31 namespace { 35 namespace {
32 36
33 class MockSocketStream : public net::SocketStream { 37 class MockSocketStream : public net::SocketStream {
34 public: 38 public:
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 transport_security_state_->EnableHost("upgrademe.com", state); 195 transport_security_state_->EnableHost("upgrademe.com", state);
192 } 196 }
193 197
194 private: 198 private:
195 friend class base::RefCountedThreadSafe<MockURLRequestContext>; 199 friend class base::RefCountedThreadSafe<MockURLRequestContext>;
196 virtual ~MockURLRequestContext() {} 200 virtual ~MockURLRequestContext() {}
197 201
198 scoped_refptr<net::TransportSecurityState> transport_security_state_; 202 scoped_refptr<net::TransportSecurityState> transport_security_state_;
199 }; 203 };
200 204
205 class MockHttpTransactionFactory : public net::HttpTransactionFactory {
206 public:
207 MockHttpTransactionFactory(scoped_refptr<net::OrderedSocketData>& data) {
208 data_ = data;
209 data_->AddRef();
210 net::MockConnect connect_data(false, net::OK);
211 data_->set_connect_data(connect_data);
212 session_deps_.reset(new net::SpdySessionDependencies);
213 session_deps_->socket_factory->AddSocketDataProvider(data_.get());
214 http_session_ =
215 net::SpdySessionDependencies::SpdyCreateSession(session_deps_.get());
216 host_port_pair_.set_host("example.com");
217 host_port_pair_.set_port(80);
218 host_port_proxy_pair_.first = host_port_pair_;
219 host_port_proxy_pair_.second = net::ProxyServer::Direct();
220 net::SpdySessionPool* spdy_session_pool =
221 http_session_->spdy_session_pool();
222 DCHECK(spdy_session_pool);
223 EXPECT_FALSE(spdy_session_pool->HasSession(host_port_proxy_pair_));
224 session_ =
225 spdy_session_pool->Get(host_port_proxy_pair_, net::BoundNetLog());
226 EXPECT_TRUE(spdy_session_pool->HasSession(host_port_proxy_pair_));
227
228 transport_params_ = new net::TransportSocketParams(host_port_pair_,
229 net::MEDIUM,
230 GURL(),
231 false,
232 false);
233 net::ClientSocketHandle* connection = new net::ClientSocketHandle;
234 EXPECT_EQ(net::OK, connection->Init(host_port_pair_.ToString(),
235 transport_params_,
236 net::MEDIUM,
237 NULL,
238 http_session_->transport_socket_pool(),
239 net::BoundNetLog()));
240 EXPECT_EQ(net::OK,
241 session_->InitializeWithSocket(connection, false, net::OK));
242 }
243 virtual int CreateTransaction(scoped_ptr<net::HttpTransaction>* trans) {
244 NOTREACHED();
245 return net::ERR_UNEXPECTED;
246 }
247 virtual net::HttpCache* GetCache() {
248 NOTREACHED();
249 return NULL;
250 }
251 virtual net::HttpNetworkSession* GetSession() {
252 return http_session_.get();
253 }
254 private:
255 scoped_refptr<net::OrderedSocketData> data_;
256 scoped_ptr<net::SpdySessionDependencies> session_deps_;
257 scoped_refptr<net::HttpNetworkSession> http_session_;
258 scoped_refptr<net::TransportSocketParams> transport_params_;
259 scoped_refptr<net::SpdySession> session_;
260 net::HostPortPair host_port_pair_;
261 net::HostPortProxyPair host_port_proxy_pair_;
262 };
263
201 } 264 }
202 265
203 namespace net { 266 namespace net {
204 267
205 class WebSocketJobTest : public PlatformTest { 268 class WebSocketJobTest : public PlatformTest {
206 public: 269 public:
207 virtual void SetUp() { 270 virtual void SetUp() {
271 spdy::SpdyFramer::set_enable_compression_default(false);
208 stream_type_ = STREAM_INVALID; 272 stream_type_ = STREAM_INVALID;
209 cookie_store_ = new MockCookieStore; 273 cookie_store_ = new MockCookieStore;
210 context_ = new MockURLRequestContext(cookie_store_.get()); 274 context_ = new MockURLRequestContext(cookie_store_.get());
211 } 275 }
212 virtual void TearDown() { 276 virtual void TearDown() {
213 cookie_store_ = NULL; 277 cookie_store_ = NULL;
214 context_ = NULL; 278 context_ = NULL;
215 websocket_ = NULL; 279 websocket_ = NULL;
216 socket_ = NULL; 280 socket_ = NULL;
217 } 281 }
(...skipping 17 matching lines...) Expand all
235 STREAM_MOCK_SOCKET, 299 STREAM_MOCK_SOCKET,
236 STREAM_SOCKET, 300 STREAM_SOCKET,
237 STREAM_SPDY_WEBSOCKET, 301 STREAM_SPDY_WEBSOCKET,
238 }; 302 };
239 void InitWebSocketJob(const GURL& url, 303 void InitWebSocketJob(const GURL& url,
240 MockSocketStreamDelegate* delegate, 304 MockSocketStreamDelegate* delegate,
241 StreamType stream_type) { 305 StreamType stream_type) {
242 stream_type_ = stream_type; 306 stream_type_ = stream_type;
243 websocket_ = new WebSocketJob(delegate); 307 websocket_ = new WebSocketJob(delegate);
244 308
309 if (stream_type == STREAM_MOCK_SOCKET)
310 socket_ = new MockSocketStream(url, websocket_.get());
311
312 if (stream_type == STREAM_SPDY_WEBSOCKET) {
313 http_factory_.reset(new MockHttpTransactionFactory(data_));
314 context_->set_http_transaction_factory(http_factory_.get());
315 }
316
245 if (stream_type == STREAM_SOCKET || 317 if (stream_type == STREAM_SOCKET ||
246 stream_type == STREAM_SPDY_WEBSOCKET) { 318 stream_type == STREAM_SPDY_WEBSOCKET) {
247 ssl_config_service_ = new MockSSLConfigService(); 319 ssl_config_service_ = new MockSSLConfigService();
248 context_->set_ssl_config_service(ssl_config_service_); 320 context_->set_ssl_config_service(ssl_config_service_);
249 proxy_service_.reset(net::ProxyService::CreateDirect()); 321 proxy_service_.reset(net::ProxyService::CreateDirect());
250 context_->set_proxy_service(proxy_service_.get()); 322 context_->set_proxy_service(proxy_service_.get());
251 host_resolver_.reset(new net::MockHostResolver); 323 host_resolver_.reset(new net::MockHostResolver);
252 context_->set_host_resolver(host_resolver_.get()); 324 context_->set_host_resolver(host_resolver_.get());
325
326 socket_ = new SocketStream(url, websocket_.get());
327 socket_factory_.reset(new MockClientSocketFactory);
328 DCHECK(data_.get());
329 socket_factory_->AddSocketDataProvider(data_.get());
330 socket_->SetClientSocketFactory(socket_factory_.get());
253 } 331 }
Yuta Kitamura 2011/07/08 07:40:21 The three blocks above sound a bit confusing... H
Takashi Toyoshima 2011/07/08 08:35:14 Thanks. New one looks fine!
254 332
255 switch (stream_type) {
256 case STREAM_INVALID:
257 NOTREACHED();
258 break;
259 case STREAM_MOCK_SOCKET:
260 socket_ = new MockSocketStream(url, websocket_.get());
261 break;
262 case STREAM_SOCKET:
263 socket_ = new SocketStream(url, websocket_.get());
264 socket_factory_.reset(new MockClientSocketFactory);
265 DCHECK(data_.get());
266 socket_factory_->AddSocketDataProvider(data_.get());
267 socket_->SetClientSocketFactory(socket_factory_.get());
268 break;
269 case STREAM_SPDY_WEBSOCKET:
270 // TODO(toyoshim): Support SpdyWebSocketStream.
271 break;
272 }
273 websocket_->InitSocketStream(socket_.get()); 333 websocket_->InitSocketStream(socket_.get());
274 websocket_->set_context(context_.get()); 334 websocket_->set_context(context_.get());
275 struct addrinfo addr; 335 struct addrinfo addr;
276 memset(&addr, 0, sizeof(struct addrinfo)); 336 memset(&addr, 0, sizeof(struct addrinfo));
277 addr.ai_family = AF_INET; 337 addr.ai_family = AF_INET;
278 addr.ai_addrlen = sizeof(struct sockaddr_in); 338 addr.ai_addrlen = sizeof(struct sockaddr_in);
279 struct sockaddr_in sa_in; 339 struct sockaddr_in sa_in;
280 memset(&sa_in, 0, sizeof(struct sockaddr_in)); 340 memset(&sa_in, 0, sizeof(struct sockaddr_in));
281 memcpy(&sa_in.sin_addr, "\x7f\0\0\1", 4); 341 memcpy(&sa_in.sin_addr, "\x7f\0\0\1", 4);
282 addr.ai_addr = reinterpret_cast<sockaddr*>(&sa_in); 342 addr.ai_addr = reinterpret_cast<sockaddr*>(&sa_in);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 return delegate->received_data(); 377 return delegate->received_data();
318 } 378 }
319 379
320 void TestSimpleHandshake(); 380 void TestSimpleHandshake();
321 void TestSlowHandshake(); 381 void TestSlowHandshake();
322 void TestHandshakeWithCookie(); 382 void TestHandshakeWithCookie();
323 void TestHandshakeWithCookieButNotAllowed(); 383 void TestHandshakeWithCookieButNotAllowed();
324 void TestHSTSUpgrade(); 384 void TestHSTSUpgrade();
325 void TestInvalidSendData(); 385 void TestInvalidSendData();
326 void TestConnectByWebSocket(); 386 void TestConnectByWebSocket();
387 void TestConnectBySpdy(bool use_spdy);
327 388
328 StreamType stream_type_; 389 StreamType stream_type_;
329 scoped_refptr<MockCookieStore> cookie_store_; 390 scoped_refptr<MockCookieStore> cookie_store_;
330 scoped_refptr<MockURLRequestContext> context_; 391 scoped_refptr<MockURLRequestContext> context_;
331 scoped_refptr<WebSocketJob> websocket_; 392 scoped_refptr<WebSocketJob> websocket_;
332 scoped_refptr<SocketStream> socket_; 393 scoped_refptr<SocketStream> socket_;
333 scoped_ptr<MockClientSocketFactory> socket_factory_; 394 scoped_ptr<MockClientSocketFactory> socket_factory_;
334 scoped_refptr<OrderedSocketData> data_; 395 scoped_refptr<OrderedSocketData> data_;
335 TestCompletionCallback sync_callback_; 396 TestCompletionCallback sync_callback_;
336 scoped_refptr<MockSSLConfigService> ssl_config_service_; 397 scoped_refptr<MockSSLConfigService> ssl_config_service_;
337 scoped_ptr<net::ProxyService> proxy_service_; 398 scoped_ptr<net::ProxyService> proxy_service_;
338 scoped_ptr<net::MockHostResolver> host_resolver_; 399 scoped_ptr<net::MockHostResolver> host_resolver_;
400 scoped_ptr<MockHttpTransactionFactory> http_factory_;
339 401
340 static const char kHandshakeRequestWithoutCookie[]; 402 static const char kHandshakeRequestWithoutCookie[];
341 static const char kHandshakeRequestWithCookie[]; 403 static const char kHandshakeRequestWithCookie[];
342 static const char kHandshakeRequestWithFilteredCookie[]; 404 static const char kHandshakeRequestWithFilteredCookie[];
343 static const char kHandshakeResponseWithoutCookie[]; 405 static const char kHandshakeResponseWithoutCookie[];
344 static const char kHandshakeResponseWithCookie[]; 406 static const char kHandshakeResponseWithCookie[];
345 static const char kDataHello[]; 407 static const char kDataHello[];
346 static const char kDataWorld[]; 408 static const char kDataWorld[];
409 static const char* const kHandshakeRequestForSpdy[];
410 static const char* const kHandshakeResponseForSpdy[];
347 static const size_t kHandshakeRequestWithoutCookieLength; 411 static const size_t kHandshakeRequestWithoutCookieLength;
348 static const size_t kHandshakeRequestWithCookieLength; 412 static const size_t kHandshakeRequestWithCookieLength;
349 static const size_t kHandshakeRequestWithFilteredCookieLength; 413 static const size_t kHandshakeRequestWithFilteredCookieLength;
350 static const size_t kHandshakeResponseWithoutCookieLength; 414 static const size_t kHandshakeResponseWithoutCookieLength;
351 static const size_t kHandshakeResponseWithCookieLength; 415 static const size_t kHandshakeResponseWithCookieLength;
352 static const size_t kDataHelloLength; 416 static const size_t kDataHelloLength;
353 static const size_t kDataWorldLength; 417 static const size_t kDataWorldLength;
354 }; 418 };
355 419
356 const char WebSocketJobTest::kHandshakeRequestWithoutCookie[] = 420 const char WebSocketJobTest::kHandshakeRequestWithoutCookie[] =
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 "Sec-WebSocket-Location: ws://example.com/demo\r\n" 473 "Sec-WebSocket-Location: ws://example.com/demo\r\n"
410 "Sec-WebSocket-Protocol: sample\r\n" 474 "Sec-WebSocket-Protocol: sample\r\n"
411 "Set-Cookie: CR-set-test=1\r\n" 475 "Set-Cookie: CR-set-test=1\r\n"
412 "\r\n" 476 "\r\n"
413 "8jKS'y:G*Co,Wxa-"; 477 "8jKS'y:G*Co,Wxa-";
414 478
415 const char WebSocketJobTest::kDataHello[] = "Hello, "; 479 const char WebSocketJobTest::kDataHello[] = "Hello, ";
416 480
417 const char WebSocketJobTest::kDataWorld[] = "World!\n"; 481 const char WebSocketJobTest::kDataWorld[] = "World!\n";
418 482
483 // TODO(toyoshim): I should clarify which WebSocket headers for handshake must
484 // be exported to SPDY SYN_STREAM and SYN_REPLY.
485 // Because it depends on HyBi versions, just define it as follow for now.
486 const char* const WebSocketJobTest::kHandshakeRequestForSpdy[] = {
487 "host", "example.com",
488 "origin", "http://example.com",
489 "sec-websocket-protocol", "sample",
490 "url", "ws://example.com/demo"
491 };
492
493 const char* const WebSocketJobTest::kHandshakeResponseForSpdy[] = {
494 "sec-websocket-origin", "http://example.com",
495 "sec-websocket-location", "ws://example.com/demo",
496 "sec-websocket-protocol", "sample",
497 };
498
419 const size_t WebSocketJobTest::kHandshakeRequestWithoutCookieLength = 499 const size_t WebSocketJobTest::kHandshakeRequestWithoutCookieLength =
420 arraysize(kHandshakeRequestWithoutCookie) - 1; 500 arraysize(kHandshakeRequestWithoutCookie) - 1;
421 const size_t WebSocketJobTest::kHandshakeRequestWithCookieLength = 501 const size_t WebSocketJobTest::kHandshakeRequestWithCookieLength =
422 arraysize(kHandshakeRequestWithCookie) - 1; 502 arraysize(kHandshakeRequestWithCookie) - 1;
423 const size_t WebSocketJobTest::kHandshakeRequestWithFilteredCookieLength = 503 const size_t WebSocketJobTest::kHandshakeRequestWithFilteredCookieLength =
424 arraysize(kHandshakeRequestWithFilteredCookie) - 1; 504 arraysize(kHandshakeRequestWithFilteredCookie) - 1;
425 const size_t WebSocketJobTest::kHandshakeResponseWithoutCookieLength = 505 const size_t WebSocketJobTest::kHandshakeResponseWithoutCookieLength =
426 arraysize(kHandshakeResponseWithoutCookie) - 1; 506 arraysize(kHandshakeResponseWithoutCookie) - 1;
427 const size_t WebSocketJobTest::kHandshakeResponseWithCookieLength = 507 const size_t WebSocketJobTest::kHandshakeResponseWithCookieLength =
428 arraysize(kHandshakeResponseWithCookie) - 1; 508 arraysize(kHandshakeResponseWithCookie) - 1;
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 EXPECT_EQ(WebSocketJob::CONNECTING, GetWebSocketJobState()); 697 EXPECT_EQ(WebSocketJob::CONNECTING, GetWebSocketJobState());
618 CloseWebSocketJob(); 698 CloseWebSocketJob();
619 } 699 }
620 700
621 // Following tests verify cooperation between WebSocketJob and SocketStream. 701 // Following tests verify cooperation between WebSocketJob and SocketStream.
622 // Other former tests use MockSocketStream as SocketStream, so we could not 702 // Other former tests use MockSocketStream as SocketStream, so we could not
623 // check SocketStream behavior. 703 // check SocketStream behavior.
624 // OrderedSocketData provide socket level verifiation by checking out-going 704 // OrderedSocketData provide socket level verifiation by checking out-going
625 // packets in comparison with the MockWrite array and emulating in-coming 705 // packets in comparison with the MockWrite array and emulating in-coming
626 // packets with MockRead array. 706 // packets with MockRead array.
627 // TODO(toyoshim): Add tests which verify protocol switch and ERR_IO_PENDING.
628 707
629 void WebSocketJobTest::TestConnectByWebSocket() { 708 void WebSocketJobTest::TestConnectByWebSocket() {
630 // This is a test for verifying cooperation between WebSocketJob and 709 // This is a test for verifying cooperation between WebSocketJob and
631 // SocketStream in basic situation. 710 // SocketStream in basic situation.
632 MockWrite writes[] = { 711 MockWrite writes[] = {
633 MockWrite(true, 712 MockWrite(true,
634 kHandshakeRequestWithoutCookie, 713 kHandshakeRequestWithoutCookie,
635 kHandshakeRequestWithoutCookieLength, 714 kHandshakeRequestWithoutCookieLength,
636 1), 715 1),
637 MockWrite(true, 716 MockWrite(true,
(...skipping 26 matching lines...) Expand all
664 NewCallback(test, &WebSocketJobTest::DoSync)); 743 NewCallback(test, &WebSocketJobTest::DoSync));
665 InitWebSocketJob(url, &delegate, STREAM_SOCKET); 744 InitWebSocketJob(url, &delegate, STREAM_SOCKET);
666 745
667 websocket_->Connect(); 746 websocket_->Connect();
668 EXPECT_EQ(OK, WaitForResult()); 747 EXPECT_EQ(OK, WaitForResult());
669 EXPECT_TRUE(data_->at_read_eof()); 748 EXPECT_TRUE(data_->at_read_eof());
670 EXPECT_TRUE(data_->at_write_eof()); 749 EXPECT_TRUE(data_->at_write_eof());
671 EXPECT_EQ(WebSocketJob::CLOSED, GetWebSocketJobState()); 750 EXPECT_EQ(WebSocketJob::CLOSED, GetWebSocketJobState());
672 } 751 }
673 752
753 void WebSocketJobTest::TestConnectBySpdy(bool use_spdy) {
754 // This is a test for verifying cooperation between WebSocketJob and
755 // SocketStream in the situation we have SPDY session to the server.
756 MockWrite writes_websocket[] = {
757 MockWrite(true,
758 kHandshakeRequestWithoutCookie,
759 kHandshakeRequestWithoutCookieLength,
760 1),
761 MockWrite(true,
762 kDataHello,
763 kDataHelloLength,
764 3)
765 };
766 MockRead reads_websocket[] = {
767 MockRead(true,
768 kHandshakeResponseWithoutCookie,
769 kHandshakeResponseWithoutCookieLength,
770 2),
771 MockRead(true,
772 kDataWorld,
773 kDataWorldLength,
774 4),
775 MockRead(false, 0, 5) // EOF
776 };
777
778 const spdy::SpdyStreamId kStreamId = 1;
779 scoped_ptr<spdy::SpdyFrame> request_frame(
780 ConstructSpdyWebSocketHandshakeRequestFrame(
781 kHandshakeRequestForSpdy,
782 arraysize(kHandshakeRequestForSpdy) / 2,
783 kStreamId,
784 MEDIUM));
785 scoped_ptr<spdy::SpdyFrame> response_frame(
786 ConstructSpdyWebSocketHandshakeResponseFrame(
787 kHandshakeResponseForSpdy,
788 arraysize(kHandshakeResponseForSpdy) / 2,
789 kStreamId,
790 MEDIUM));
791 scoped_ptr<spdy::SpdyFrame> data_hello_frame(
792 ConstructSpdyWebSocketDataFrame(
793 kDataHello,
794 kDataHelloLength,
795 kStreamId,
796 false));
797 scoped_ptr<spdy::SpdyFrame> data_world_frame(
798 ConstructSpdyWebSocketDataFrame(
799 kDataWorld,
800 kDataWorldLength,
801 kStreamId,
802 false));
803 MockWrite writes_spdy[] = {
804 CreateMockWrite(*request_frame.get(), 1),
805 CreateMockWrite(*data_hello_frame.get(), 3),
806 };
807 MockRead reads_spdy[] = {
808 CreateMockRead(*response_frame.get(), 2),
809 CreateMockRead(*data_world_frame.get(), 4),
810 MockRead(false, 0, 5) // EOF
811 };
812
813 if (use_spdy)
814 data_ = new OrderedSocketData(
815 reads_spdy, arraysize(reads_spdy),
816 writes_spdy, arraysize(writes_spdy));
817 else
818 data_ = new OrderedSocketData(
819 reads_websocket, arraysize(reads_websocket),
820 writes_websocket, arraysize(writes_websocket));
821
822 GURL url("ws://example.com/demo");
823 MockSocketStreamDelegate delegate;
824 WebSocketJobTest* test = this;
825 delegate.SetOnConnected(
826 NewCallback(test, &WebSocketJobTest::DoSendRequest));
827 delegate.SetOnReceivedData(
828 NewCallback(test, &WebSocketJobTest::DoSendData));
829 delegate.SetOnClose(
830 NewCallback(test, &WebSocketJobTest::DoSync));
831 InitWebSocketJob(url, &delegate, STREAM_SPDY_WEBSOCKET);
832
833 websocket_->Connect();
834 EXPECT_EQ(OK, WaitForResult());
835
836 EXPECT_TRUE(data_->at_read_eof());
837 EXPECT_TRUE(data_->at_write_eof());
838 EXPECT_EQ(WebSocketJob::CLOSED, GetWebSocketJobState());
839 }
840
674 // Execute tests in both spdy-disabled mode and spdy-enabled mode. 841 // Execute tests in both spdy-disabled mode and spdy-enabled mode.
675 TEST_F(WebSocketJobTest, SimpleHandshake) { 842 TEST_F(WebSocketJobTest, SimpleHandshake) {
676 WebSocketJob::set_websocket_over_spdy_enabled(false); 843 WebSocketJob::set_websocket_over_spdy_enabled(false);
677 TestSimpleHandshake(); 844 TestSimpleHandshake();
678 } 845 }
679 846
680 TEST_F(WebSocketJobTest, SlowHandshake) { 847 TEST_F(WebSocketJobTest, SlowHandshake) {
681 WebSocketJob::set_websocket_over_spdy_enabled(false); 848 WebSocketJob::set_websocket_over_spdy_enabled(false);
682 TestSlowHandshake(); 849 TestSlowHandshake();
683 } 850 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 TEST_F(WebSocketJobTest, ConnectByWebSocket) { 902 TEST_F(WebSocketJobTest, ConnectByWebSocket) {
736 WebSocketJob::set_websocket_over_spdy_enabled(false); 903 WebSocketJob::set_websocket_over_spdy_enabled(false);
737 TestConnectByWebSocket(); 904 TestConnectByWebSocket();
738 } 905 }
739 906
740 TEST_F(WebSocketJobTest, ConnectByWebSocketSpdyEnabled) { 907 TEST_F(WebSocketJobTest, ConnectByWebSocketSpdyEnabled) {
741 WebSocketJob::set_websocket_over_spdy_enabled(true); 908 WebSocketJob::set_websocket_over_spdy_enabled(true);
742 TestConnectByWebSocket(); 909 TestConnectByWebSocket();
743 } 910 }
744 911
912 TEST_F(WebSocketJobTest, ConnectBySpdy) {
913 WebSocketJob::set_websocket_over_spdy_enabled(false);
914 TestConnectBySpdy(false);
915 }
916
917 TEST_F(WebSocketJobTest, ConnectBySpdySpdyEnabled) {
918 WebSocketJob::set_websocket_over_spdy_enabled(true);
919 TestConnectBySpdy(true);
920 }
921
922 // TODO(toyoshim): Add tests to verify throttling, SPDY stream limitation.
923 // TODO(toyoshim,yutak): Add tests to verify closing handshake.
924
745 } // namespace net 925 } // namespace net
OLDNEW
« net/websockets/websocket_job.cc ('K') | « net/websockets/websocket_job.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698