OLD | NEW |
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/socket_stream/socket_stream.h" | 5 #include "net/socket_stream/socket_stream.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
12 #include "base/callback.h" | 12 #include "base/callback.h" |
13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
14 #include "net/base/auth.h" | 14 #include "net/base/auth.h" |
15 #include "net/base/mock_host_resolver.h" | 15 #include "net/base/mock_host_resolver.h" |
16 #include "net/base/net_log.h" | 16 #include "net/base/net_log.h" |
17 #include "net/base/net_log_unittest.h" | 17 #include "net/base/net_log_unittest.h" |
18 #include "net/base/test_completion_callback.h" | 18 #include "net/base/test_completion_callback.h" |
19 #include "net/socket/socket_test_util.h" | 19 #include "net/socket/socket_test_util.h" |
20 #include "net/url_request/url_request_test_util.h" | 20 #include "net/url_request/url_request_test_util.h" |
21 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
22 #include "testing/platform_test.h" | 22 #include "testing/platform_test.h" |
23 | 23 |
24 struct SocketStreamEvent { | 24 struct SocketStreamEvent { |
25 enum EventType { | 25 enum EventType { |
26 EVENT_START_OPEN_CONNECTION, EVENT_CONNECTED, EVENT_SENT_DATA, | 26 EVENT_START_OPEN_CONNECTION, EVENT_CONNECTED, EVENT_SENT_DATA, |
27 EVENT_RECEIVED_DATA, EVENT_CLOSE, EVENT_AUTH_REQUIRED, | 27 EVENT_RECEIVED_DATA, EVENT_CLOSE, EVENT_AUTH_REQUIRED, EVENT_ERROR, |
28 }; | 28 }; |
29 | 29 |
30 SocketStreamEvent(EventType type, | 30 SocketStreamEvent(EventType type, |
31 net::SocketStream* socket_stream, | 31 net::SocketStream* socket_stream, |
32 int num, | 32 int num, |
33 const std::string& str, | 33 const std::string& str, |
34 net::AuthChallengeInfo* auth_challenge_info, | 34 net::AuthChallengeInfo* auth_challenge_info, |
35 net::CompletionCallback* callback) | 35 net::CompletionCallback* callback, |
| 36 int error) |
36 : event_type(type), socket(socket_stream), number(num), data(str), | 37 : event_type(type), socket(socket_stream), number(num), data(str), |
37 auth_info(auth_challenge_info) {} | 38 auth_info(auth_challenge_info), error_code(error) {} |
38 | 39 |
39 EventType event_type; | 40 EventType event_type; |
40 net::SocketStream* socket; | 41 net::SocketStream* socket; |
41 int number; | 42 int number; |
42 std::string data; | 43 std::string data; |
43 scoped_refptr<net::AuthChallengeInfo> auth_info; | 44 scoped_refptr<net::AuthChallengeInfo> auth_info; |
| 45 int error_code; |
44 }; | 46 }; |
45 | 47 |
46 class SocketStreamEventRecorder : public net::SocketStream::Delegate { | 48 class SocketStreamEventRecorder : public net::SocketStream::Delegate { |
47 public: | 49 public: |
48 explicit SocketStreamEventRecorder(net::CompletionCallback* callback) | 50 explicit SocketStreamEventRecorder(net::CompletionCallback* callback) |
49 : callback_(callback) {} | 51 : callback_(callback) {} |
50 virtual ~SocketStreamEventRecorder() {} | 52 virtual ~SocketStreamEventRecorder() {} |
51 | 53 |
52 void SetOnStartOpenConnection( | 54 void SetOnStartOpenConnection( |
53 const base::Callback<int(SocketStreamEvent*)>& callback) { | 55 const base::Callback<int(SocketStreamEvent*)>& callback) { |
(...skipping 11 matching lines...) Expand all Loading... |
65 const base::Callback<void(SocketStreamEvent*)>& callback) { | 67 const base::Callback<void(SocketStreamEvent*)>& callback) { |
66 on_received_data_ = callback; | 68 on_received_data_ = callback; |
67 } | 69 } |
68 void SetOnClose(const base::Callback<void(SocketStreamEvent*)>& callback) { | 70 void SetOnClose(const base::Callback<void(SocketStreamEvent*)>& callback) { |
69 on_close_ = callback; | 71 on_close_ = callback; |
70 } | 72 } |
71 void SetOnAuthRequired( | 73 void SetOnAuthRequired( |
72 const base::Callback<void(SocketStreamEvent*)>& callback) { | 74 const base::Callback<void(SocketStreamEvent*)>& callback) { |
73 on_auth_required_ = callback; | 75 on_auth_required_ = callback; |
74 } | 76 } |
| 77 void SetOnError(const base::Callback<void(SocketStreamEvent*)>& callback) { |
| 78 on_error_ = callback; |
| 79 } |
75 | 80 |
76 virtual int OnStartOpenConnection(net::SocketStream* socket, | 81 virtual int OnStartOpenConnection(net::SocketStream* socket, |
77 net::CompletionCallback* callback) { | 82 net::CompletionCallback* callback) { |
78 connection_callback_ = callback; | 83 connection_callback_ = callback; |
79 events_.push_back( | 84 events_.push_back( |
80 SocketStreamEvent(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 85 SocketStreamEvent(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
81 socket, 0, std::string(), NULL, callback)); | 86 socket, 0, std::string(), NULL, callback, net::OK)); |
82 if (!on_start_open_connection_.is_null()) | 87 if (!on_start_open_connection_.is_null()) |
83 return on_start_open_connection_.Run(&events_.back()); | 88 return on_start_open_connection_.Run(&events_.back()); |
84 return net::OK; | 89 return net::OK; |
85 } | 90 } |
86 virtual void OnConnected(net::SocketStream* socket, | 91 virtual void OnConnected(net::SocketStream* socket, |
87 int num_pending_send_allowed) { | 92 int num_pending_send_allowed) { |
88 events_.push_back( | 93 events_.push_back( |
89 SocketStreamEvent(SocketStreamEvent::EVENT_CONNECTED, | 94 SocketStreamEvent(SocketStreamEvent::EVENT_CONNECTED, |
90 socket, num_pending_send_allowed, std::string(), | 95 socket, num_pending_send_allowed, std::string(), |
91 NULL, NULL)); | 96 NULL, NULL, net::OK)); |
92 if (!on_connected_.is_null()) | 97 if (!on_connected_.is_null()) |
93 on_connected_.Run(&events_.back()); | 98 on_connected_.Run(&events_.back()); |
94 } | 99 } |
95 virtual void OnSentData(net::SocketStream* socket, | 100 virtual void OnSentData(net::SocketStream* socket, |
96 int amount_sent) { | 101 int amount_sent) { |
97 events_.push_back( | 102 events_.push_back( |
98 SocketStreamEvent(SocketStreamEvent::EVENT_SENT_DATA, | 103 SocketStreamEvent(SocketStreamEvent::EVENT_SENT_DATA, socket, |
99 socket, amount_sent, std::string(), NULL, NULL)); | 104 amount_sent, std::string(), NULL, NULL, net::OK)); |
100 if (!on_sent_data_.is_null()) | 105 if (!on_sent_data_.is_null()) |
101 on_sent_data_.Run(&events_.back()); | 106 on_sent_data_.Run(&events_.back()); |
102 } | 107 } |
103 virtual void OnReceivedData(net::SocketStream* socket, | 108 virtual void OnReceivedData(net::SocketStream* socket, |
104 const char* data, int len) { | 109 const char* data, int len) { |
105 events_.push_back( | 110 events_.push_back( |
106 SocketStreamEvent(SocketStreamEvent::EVENT_RECEIVED_DATA, | 111 SocketStreamEvent(SocketStreamEvent::EVENT_RECEIVED_DATA, socket, len, |
107 socket, len, std::string(data, len), NULL, NULL)); | 112 std::string(data, len), NULL, NULL, net::OK)); |
108 if (!on_received_data_.is_null()) | 113 if (!on_received_data_.is_null()) |
109 on_received_data_.Run(&events_.back()); | 114 on_received_data_.Run(&events_.back()); |
110 } | 115 } |
111 virtual void OnClose(net::SocketStream* socket) { | 116 virtual void OnClose(net::SocketStream* socket) { |
112 events_.push_back( | 117 events_.push_back( |
113 SocketStreamEvent(SocketStreamEvent::EVENT_CLOSE, | 118 SocketStreamEvent(SocketStreamEvent::EVENT_CLOSE, socket, 0, |
114 socket, 0, std::string(), NULL, NULL)); | 119 std::string(), NULL, NULL, net::OK)); |
115 if (!on_close_.is_null()) | 120 if (!on_close_.is_null()) |
116 on_close_.Run(&events_.back()); | 121 on_close_.Run(&events_.back()); |
117 if (callback_) | 122 if (callback_) |
118 callback_->Run(net::OK); | 123 callback_->Run(net::OK); |
119 } | 124 } |
120 virtual void OnAuthRequired(net::SocketStream* socket, | 125 virtual void OnAuthRequired(net::SocketStream* socket, |
121 net::AuthChallengeInfo* auth_info) { | 126 net::AuthChallengeInfo* auth_info) { |
122 events_.push_back( | 127 events_.push_back( |
123 SocketStreamEvent(SocketStreamEvent::EVENT_AUTH_REQUIRED, | 128 SocketStreamEvent(SocketStreamEvent::EVENT_AUTH_REQUIRED, socket, 0, |
124 socket, 0, std::string(), auth_info, NULL)); | 129 std::string(), auth_info, NULL, net::OK)); |
125 if (!on_auth_required_.is_null()) | 130 if (!on_auth_required_.is_null()) |
126 on_auth_required_.Run(&events_.back()); | 131 on_auth_required_.Run(&events_.back()); |
127 } | 132 } |
| 133 virtual void OnError(const net::SocketStream* socket, int error) { |
| 134 events_.push_back( |
| 135 SocketStreamEvent(SocketStreamEvent::EVENT_ERROR, NULL, 0, |
| 136 std::string(), NULL, NULL, error)); |
| 137 if (!on_error_.is_null()) |
| 138 on_error_.Run(&events_.back()); |
| 139 if (callback_) |
| 140 callback_->Run(error); |
| 141 } |
128 | 142 |
129 void DoClose(SocketStreamEvent* event) { | 143 void DoClose(SocketStreamEvent* event) { |
130 event->socket->Close(); | 144 event->socket->Close(); |
131 } | 145 } |
132 void DoRestartWithAuth(SocketStreamEvent* event) { | 146 void DoRestartWithAuth(SocketStreamEvent* event) { |
133 VLOG(1) << "RestartWithAuth username=" << username_ | 147 VLOG(1) << "RestartWithAuth username=" << username_ |
134 << " password=" << password_; | 148 << " password=" << password_; |
135 event->socket->RestartWithAuth(username_, password_); | 149 event->socket->RestartWithAuth(username_, password_); |
136 } | 150 } |
137 void SetAuthInfo(const string16& username, | 151 void SetAuthInfo(const string16& username, |
(...skipping 10 matching lines...) Expand all Loading... |
148 } | 162 } |
149 | 163 |
150 private: | 164 private: |
151 std::vector<SocketStreamEvent> events_; | 165 std::vector<SocketStreamEvent> events_; |
152 base::Callback<int(SocketStreamEvent*)> on_start_open_connection_; | 166 base::Callback<int(SocketStreamEvent*)> on_start_open_connection_; |
153 base::Callback<void(SocketStreamEvent*)> on_connected_; | 167 base::Callback<void(SocketStreamEvent*)> on_connected_; |
154 base::Callback<void(SocketStreamEvent*)> on_sent_data_; | 168 base::Callback<void(SocketStreamEvent*)> on_sent_data_; |
155 base::Callback<void(SocketStreamEvent*)> on_received_data_; | 169 base::Callback<void(SocketStreamEvent*)> on_received_data_; |
156 base::Callback<void(SocketStreamEvent*)> on_close_; | 170 base::Callback<void(SocketStreamEvent*)> on_close_; |
157 base::Callback<void(SocketStreamEvent*)> on_auth_required_; | 171 base::Callback<void(SocketStreamEvent*)> on_auth_required_; |
| 172 base::Callback<void(SocketStreamEvent*)> on_error_; |
158 net::CompletionCallback* callback_; | 173 net::CompletionCallback* callback_; |
159 net::CompletionCallback* connection_callback_; | 174 net::CompletionCallback* connection_callback_; |
160 | 175 |
161 string16 username_; | 176 string16 username_; |
162 string16 password_; | 177 string16 password_; |
163 | 178 |
164 DISALLOW_COPY_AND_ASSIGN(SocketStreamEventRecorder); | 179 DISALLOW_COPY_AND_ASSIGN(SocketStreamEventRecorder); |
165 }; | 180 }; |
166 | 181 |
167 namespace net { | 182 namespace net { |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 GetMockClientSocketFactory(); | 312 GetMockClientSocketFactory(); |
298 mock_socket_factory->AddSocketDataProvider(data_provider.get()); | 313 mock_socket_factory->AddSocketDataProvider(data_provider.get()); |
299 | 314 |
300 socket_stream->SetClientSocketFactory(mock_socket_factory); | 315 socket_stream->SetClientSocketFactory(mock_socket_factory); |
301 | 316 |
302 socket_stream->Connect(); | 317 socket_stream->Connect(); |
303 | 318 |
304 callback.WaitForResult(); | 319 callback.WaitForResult(); |
305 | 320 |
306 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 321 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
307 ASSERT_EQ(7U, events.size()); | 322 ASSERT_EQ(8U, events.size()); |
308 | 323 |
309 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 324 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
310 events[0].event_type); | 325 events[0].event_type); |
311 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 326 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
312 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[2].event_type); | 327 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[2].event_type); |
313 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[3].event_type); | 328 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[3].event_type); |
314 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[4].event_type); | 329 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[4].event_type); |
315 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[5].event_type); | 330 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[5].event_type); |
316 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[6].event_type); | 331 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[6].event_type); |
| 332 EXPECT_EQ(net::ERR_CONNECTION_CLOSED, events[6].error_code); |
| 333 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[7].event_type); |
317 } | 334 } |
318 | 335 |
319 TEST_F(SocketStreamTest, BasicAuthProxy) { | 336 TEST_F(SocketStreamTest, BasicAuthProxy) { |
320 MockClientSocketFactory mock_socket_factory; | 337 MockClientSocketFactory mock_socket_factory; |
321 MockWrite data_writes1[] = { | 338 MockWrite data_writes1[] = { |
322 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" | 339 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" |
323 "Host: example.com\r\n" | 340 "Host: example.com\r\n" |
324 "Proxy-Connection: keep-alive\r\n\r\n"), | 341 "Proxy-Connection: keep-alive\r\n\r\n"), |
325 }; | 342 }; |
326 MockRead data_reads1[] = { | 343 MockRead data_reads1[] = { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 socket_stream->set_context(new TestURLRequestContext("myproxy:70")); | 385 socket_stream->set_context(new TestURLRequestContext("myproxy:70")); |
369 MockHostResolver host_resolver; | 386 MockHostResolver host_resolver; |
370 socket_stream->SetHostResolver(&host_resolver); | 387 socket_stream->SetHostResolver(&host_resolver); |
371 socket_stream->SetClientSocketFactory(&mock_socket_factory); | 388 socket_stream->SetClientSocketFactory(&mock_socket_factory); |
372 | 389 |
373 socket_stream->Connect(); | 390 socket_stream->Connect(); |
374 | 391 |
375 callback.WaitForResult(); | 392 callback.WaitForResult(); |
376 | 393 |
377 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 394 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
378 ASSERT_EQ(4U, events.size()); | 395 ASSERT_EQ(5U, events.size()); |
379 | 396 |
380 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 397 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
381 events[0].event_type); | 398 events[0].event_type); |
382 EXPECT_EQ(SocketStreamEvent::EVENT_AUTH_REQUIRED, events[1].event_type); | 399 EXPECT_EQ(SocketStreamEvent::EVENT_AUTH_REQUIRED, events[1].event_type); |
383 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[2].event_type); | 400 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[2].event_type); |
384 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); | 401 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[3].event_type); |
| 402 EXPECT_EQ(net::ERR_ABORTED, events[3].error_code); |
| 403 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[4].event_type); |
385 | 404 |
386 // TODO(eroman): Add back NetLogTest here... | 405 // TODO(eroman): Add back NetLogTest here... |
387 } | 406 } |
388 | 407 |
389 TEST_F(SocketStreamTest, IOPending) { | 408 TEST_F(SocketStreamTest, IOPending) { |
390 TestCompletionCallback callback; | 409 TestCompletionCallback callback; |
391 | 410 |
392 scoped_ptr<SocketStreamEventRecorder> delegate( | 411 scoped_ptr<SocketStreamEventRecorder> delegate( |
393 new SocketStreamEventRecorder(&callback)); | 412 new SocketStreamEventRecorder(&callback)); |
394 delegate->SetOnConnected(base::Bind( | 413 delegate->SetOnConnected(base::Bind( |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 | 452 |
434 socket_stream->Connect(); | 453 socket_stream->Connect(); |
435 io_callback_.WaitForResult(); | 454 io_callback_.WaitForResult(); |
436 EXPECT_EQ(net::SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, | 455 EXPECT_EQ(net::SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, |
437 socket_stream->next_state_); | 456 socket_stream->next_state_); |
438 delegate->CompleteConnection(net::OK); | 457 delegate->CompleteConnection(net::OK); |
439 | 458 |
440 EXPECT_EQ(net::OK, callback.WaitForResult()); | 459 EXPECT_EQ(net::OK, callback.WaitForResult()); |
441 | 460 |
442 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 461 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
443 ASSERT_EQ(7U, events.size()); | 462 ASSERT_EQ(8U, events.size()); |
444 | 463 |
445 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 464 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
446 events[0].event_type); | 465 events[0].event_type); |
447 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 466 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
448 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[2].event_type); | 467 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[2].event_type); |
449 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[3].event_type); | 468 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[3].event_type); |
450 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[4].event_type); | 469 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[4].event_type); |
451 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[5].event_type); | 470 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[5].event_type); |
452 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[6].event_type); | 471 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[6].event_type); |
| 472 EXPECT_EQ(net::ERR_CONNECTION_CLOSED, events[6].error_code); |
| 473 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[7].event_type); |
453 } | 474 } |
454 | 475 |
455 TEST_F(SocketStreamTest, SwitchToSpdy) { | 476 TEST_F(SocketStreamTest, SwitchToSpdy) { |
456 TestCompletionCallback callback; | 477 TestCompletionCallback callback; |
457 | 478 |
458 scoped_ptr<SocketStreamEventRecorder> delegate( | 479 scoped_ptr<SocketStreamEventRecorder> delegate( |
459 new SocketStreamEventRecorder(&callback)); | 480 new SocketStreamEventRecorder(&callback)); |
460 delegate->SetOnStartOpenConnection(base::Bind( | 481 delegate->SetOnStartOpenConnection(base::Bind( |
461 &SocketStreamTest::DoSwitchToSpdyTest, base::Unretained(this))); | 482 &SocketStreamTest::DoSwitchToSpdyTest, base::Unretained(this))); |
462 | 483 |
463 MockHostResolver host_resolver; | 484 MockHostResolver host_resolver; |
464 | 485 |
465 scoped_refptr<SocketStream> socket_stream( | 486 scoped_refptr<SocketStream> socket_stream( |
466 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); | 487 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); |
467 | 488 |
468 socket_stream->set_context(new TestURLRequestContext()); | 489 socket_stream->set_context(new TestURLRequestContext()); |
469 socket_stream->SetHostResolver(&host_resolver); | 490 socket_stream->SetHostResolver(&host_resolver); |
470 | 491 |
471 socket_stream->Connect(); | 492 socket_stream->Connect(); |
472 | 493 |
473 EXPECT_EQ(net::OK, callback.WaitForResult()); | 494 EXPECT_EQ(net::ERR_PROTOCOL_SWITCHED, callback.WaitForResult()); |
474 | 495 |
475 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 496 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
476 ASSERT_EQ(2U, events.size()); | 497 ASSERT_EQ(2U, events.size()); |
477 | 498 |
478 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 499 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
479 events[0].event_type); | 500 events[0].event_type); |
480 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[1].event_type); | 501 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); |
| 502 EXPECT_EQ(net::ERR_PROTOCOL_SWITCHED, events[1].error_code); |
481 } | 503 } |
482 | 504 |
483 TEST_F(SocketStreamTest, SwitchAfterPending) { | 505 TEST_F(SocketStreamTest, SwitchAfterPending) { |
484 TestCompletionCallback callback; | 506 TestCompletionCallback callback; |
485 | 507 |
486 scoped_ptr<SocketStreamEventRecorder> delegate( | 508 scoped_ptr<SocketStreamEventRecorder> delegate( |
487 new SocketStreamEventRecorder(&callback)); | 509 new SocketStreamEventRecorder(&callback)); |
488 delegate->SetOnStartOpenConnection(base::Bind( | 510 delegate->SetOnStartOpenConnection(base::Bind( |
489 &SocketStreamTest::DoIOPending, base::Unretained(this))); | 511 &SocketStreamTest::DoIOPending, base::Unretained(this))); |
490 | 512 |
491 MockHostResolver host_resolver; | 513 MockHostResolver host_resolver; |
492 | 514 |
493 scoped_refptr<SocketStream> socket_stream( | 515 scoped_refptr<SocketStream> socket_stream( |
494 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); | 516 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); |
495 | 517 |
496 socket_stream->set_context(new TestURLRequestContext()); | 518 socket_stream->set_context(new TestURLRequestContext()); |
497 socket_stream->SetHostResolver(&host_resolver); | 519 socket_stream->SetHostResolver(&host_resolver); |
498 | 520 |
499 socket_stream->Connect(); | 521 socket_stream->Connect(); |
500 io_callback_.WaitForResult(); | 522 io_callback_.WaitForResult(); |
501 EXPECT_EQ(net::SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, | 523 EXPECT_EQ(net::SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, |
502 socket_stream->next_state_); | 524 socket_stream->next_state_); |
503 delegate->CompleteConnection(net::ERR_PROTOCOL_SWITCHED); | 525 delegate->CompleteConnection(net::ERR_PROTOCOL_SWITCHED); |
504 | 526 |
505 int result = callback.WaitForResult(); | 527 EXPECT_EQ(net::ERR_PROTOCOL_SWITCHED, callback.WaitForResult()); |
506 | 528 |
507 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 529 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
508 ASSERT_EQ(2U, events.size()); | 530 ASSERT_EQ(2U, events.size()); |
509 | 531 |
510 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 532 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
511 events[0].event_type); | 533 events[0].event_type); |
512 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[1].event_type); | 534 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); |
513 EXPECT_EQ(net::OK, result); | 535 EXPECT_EQ(net::ERR_PROTOCOL_SWITCHED, events[1].error_code); |
514 } | 536 } |
515 | 537 |
516 } // namespace net | 538 } // namespace net |
OLD | NEW |