| 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 |