| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 #include "testing/platform_test.h" | 24 #include "testing/platform_test.h" |
| 25 | 25 |
| 26 using base::ASCIIToUTF16; | 26 using base::ASCIIToUTF16; |
| 27 | 27 |
| 28 namespace net { | 28 namespace net { |
| 29 | 29 |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 struct SocketStreamEvent { | 32 struct SocketStreamEvent { |
| 33 enum EventType { | 33 enum EventType { |
| 34 EVENT_START_OPEN_CONNECTION, EVENT_CONNECTED, EVENT_SENT_DATA, | 34 EVENT_START_OPEN_CONNECTION, |
| 35 EVENT_RECEIVED_DATA, EVENT_CLOSE, EVENT_AUTH_REQUIRED, EVENT_ERROR, | 35 EVENT_CONNECTED, |
| 36 EVENT_SENT_DATA, |
| 37 EVENT_RECEIVED_DATA, |
| 38 EVENT_CLOSE, |
| 39 EVENT_AUTH_REQUIRED, |
| 40 EVENT_ERROR, |
| 36 }; | 41 }; |
| 37 | 42 |
| 38 SocketStreamEvent(EventType type, | 43 SocketStreamEvent(EventType type, |
| 39 SocketStream* socket_stream, | 44 SocketStream* socket_stream, |
| 40 int num, | 45 int num, |
| 41 const std::string& str, | 46 const std::string& str, |
| 42 AuthChallengeInfo* auth_challenge_info, | 47 AuthChallengeInfo* auth_challenge_info, |
| 43 int error) | 48 int error) |
| 44 : event_type(type), socket(socket_stream), number(num), data(str), | 49 : event_type(type), |
| 45 auth_info(auth_challenge_info), error_code(error) {} | 50 socket(socket_stream), |
| 51 number(num), |
| 52 data(str), |
| 53 auth_info(auth_challenge_info), |
| 54 error_code(error) {} |
| 46 | 55 |
| 47 EventType event_type; | 56 EventType event_type; |
| 48 SocketStream* socket; | 57 SocketStream* socket; |
| 49 int number; | 58 int number; |
| 50 std::string data; | 59 std::string data; |
| 51 scoped_refptr<AuthChallengeInfo> auth_info; | 60 scoped_refptr<AuthChallengeInfo> auth_info; |
| 52 int error_code; | 61 int error_code; |
| 53 }; | 62 }; |
| 54 | 63 |
| 55 class SocketStreamEventRecorder : public SocketStream::Delegate { | 64 class SocketStreamEventRecorder : public SocketStream::Delegate { |
| 56 public: | 65 public: |
| 57 // |callback| will be run when the OnClose() or OnError() method is called. | 66 // |callback| will be run when the OnClose() or OnError() method is called. |
| 58 // For OnClose(), |callback| is called with OK. For OnError(), it's called | 67 // For OnClose(), |callback| is called with OK. For OnError(), it's called |
| 59 // with the error code. | 68 // with the error code. |
| 60 explicit SocketStreamEventRecorder(const CompletionCallback& callback) | 69 explicit SocketStreamEventRecorder(const CompletionCallback& callback) |
| 61 : callback_(callback) {} | 70 : callback_(callback) {} |
| 62 virtual ~SocketStreamEventRecorder() {} | 71 virtual ~SocketStreamEventRecorder() {} |
| 63 | 72 |
| 64 void SetOnStartOpenConnection( | 73 void SetOnStartOpenConnection( |
| 65 const base::Callback<int(SocketStreamEvent*)>& callback) { | 74 const base::Callback<int(SocketStreamEvent*)>& callback) { |
| 66 on_start_open_connection_ = callback; | 75 on_start_open_connection_ = callback; |
| 67 } | 76 } |
| 68 void SetOnConnected( | 77 void SetOnConnected( |
| 69 const base::Callback<void(SocketStreamEvent*)>& callback) { | 78 const base::Callback<void(SocketStreamEvent*)>& callback) { |
| 70 on_connected_ = callback; | 79 on_connected_ = callback; |
| 71 } | 80 } |
| 72 void SetOnSentData( | 81 void SetOnSentData(const base::Callback<void(SocketStreamEvent*)>& callback) { |
| 73 const base::Callback<void(SocketStreamEvent*)>& callback) { | |
| 74 on_sent_data_ = callback; | 82 on_sent_data_ = callback; |
| 75 } | 83 } |
| 76 void SetOnReceivedData( | 84 void SetOnReceivedData( |
| 77 const base::Callback<void(SocketStreamEvent*)>& callback) { | 85 const base::Callback<void(SocketStreamEvent*)>& callback) { |
| 78 on_received_data_ = callback; | 86 on_received_data_ = callback; |
| 79 } | 87 } |
| 80 void SetOnClose(const base::Callback<void(SocketStreamEvent*)>& callback) { | 88 void SetOnClose(const base::Callback<void(SocketStreamEvent*)>& callback) { |
| 81 on_close_ = callback; | 89 on_close_ = callback; |
| 82 } | 90 } |
| 83 void SetOnAuthRequired( | 91 void SetOnAuthRequired( |
| 84 const base::Callback<void(SocketStreamEvent*)>& callback) { | 92 const base::Callback<void(SocketStreamEvent*)>& callback) { |
| 85 on_auth_required_ = callback; | 93 on_auth_required_ = callback; |
| 86 } | 94 } |
| 87 void SetOnError(const base::Callback<void(SocketStreamEvent*)>& callback) { | 95 void SetOnError(const base::Callback<void(SocketStreamEvent*)>& callback) { |
| 88 on_error_ = callback; | 96 on_error_ = callback; |
| 89 } | 97 } |
| 90 | 98 |
| 91 virtual int OnStartOpenConnection( | 99 virtual int OnStartOpenConnection( |
| 92 SocketStream* socket, | 100 SocketStream* socket, |
| 93 const CompletionCallback& callback) OVERRIDE { | 101 const CompletionCallback& callback) OVERRIDE { |
| 94 connection_callback_ = callback; | 102 connection_callback_ = callback; |
| 95 events_.push_back( | 103 events_.push_back( |
| 96 SocketStreamEvent(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 104 SocketStreamEvent(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 97 socket, 0, std::string(), NULL, OK)); | 105 socket, |
| 106 0, |
| 107 std::string(), |
| 108 NULL, |
| 109 OK)); |
| 98 if (!on_start_open_connection_.is_null()) | 110 if (!on_start_open_connection_.is_null()) |
| 99 return on_start_open_connection_.Run(&events_.back()); | 111 return on_start_open_connection_.Run(&events_.back()); |
| 100 return OK; | 112 return OK; |
| 101 } | 113 } |
| 102 virtual void OnConnected(SocketStream* socket, | 114 virtual void OnConnected(SocketStream* socket, |
| 103 int num_pending_send_allowed) OVERRIDE { | 115 int num_pending_send_allowed) OVERRIDE { |
| 104 events_.push_back( | 116 events_.push_back(SocketStreamEvent(SocketStreamEvent::EVENT_CONNECTED, |
| 105 SocketStreamEvent(SocketStreamEvent::EVENT_CONNECTED, | 117 socket, |
| 106 socket, num_pending_send_allowed, std::string(), | 118 num_pending_send_allowed, |
| 107 NULL, OK)); | 119 std::string(), |
| 120 NULL, |
| 121 OK)); |
| 108 if (!on_connected_.is_null()) | 122 if (!on_connected_.is_null()) |
| 109 on_connected_.Run(&events_.back()); | 123 on_connected_.Run(&events_.back()); |
| 110 } | 124 } |
| 111 virtual void OnSentData(SocketStream* socket, | 125 virtual void OnSentData(SocketStream* socket, int amount_sent) OVERRIDE { |
| 112 int amount_sent) OVERRIDE { | 126 events_.push_back(SocketStreamEvent(SocketStreamEvent::EVENT_SENT_DATA, |
| 113 events_.push_back( | 127 socket, |
| 114 SocketStreamEvent(SocketStreamEvent::EVENT_SENT_DATA, socket, | 128 amount_sent, |
| 115 amount_sent, std::string(), NULL, OK)); | 129 std::string(), |
| 130 NULL, |
| 131 OK)); |
| 116 if (!on_sent_data_.is_null()) | 132 if (!on_sent_data_.is_null()) |
| 117 on_sent_data_.Run(&events_.back()); | 133 on_sent_data_.Run(&events_.back()); |
| 118 } | 134 } |
| 119 virtual void OnReceivedData(SocketStream* socket, | 135 virtual void OnReceivedData(SocketStream* socket, |
| 120 const char* data, int len) OVERRIDE { | 136 const char* data, |
| 121 events_.push_back( | 137 int len) OVERRIDE { |
| 122 SocketStreamEvent(SocketStreamEvent::EVENT_RECEIVED_DATA, socket, len, | 138 events_.push_back(SocketStreamEvent(SocketStreamEvent::EVENT_RECEIVED_DATA, |
| 123 std::string(data, len), NULL, OK)); | 139 socket, |
| 140 len, |
| 141 std::string(data, len), |
| 142 NULL, |
| 143 OK)); |
| 124 if (!on_received_data_.is_null()) | 144 if (!on_received_data_.is_null()) |
| 125 on_received_data_.Run(&events_.back()); | 145 on_received_data_.Run(&events_.back()); |
| 126 } | 146 } |
| 127 virtual void OnClose(SocketStream* socket) OVERRIDE { | 147 virtual void OnClose(SocketStream* socket) OVERRIDE { |
| 128 events_.push_back( | 148 events_.push_back(SocketStreamEvent( |
| 129 SocketStreamEvent(SocketStreamEvent::EVENT_CLOSE, socket, 0, | 149 SocketStreamEvent::EVENT_CLOSE, socket, 0, std::string(), NULL, OK)); |
| 130 std::string(), NULL, OK)); | |
| 131 if (!on_close_.is_null()) | 150 if (!on_close_.is_null()) |
| 132 on_close_.Run(&events_.back()); | 151 on_close_.Run(&events_.back()); |
| 133 if (!callback_.is_null()) | 152 if (!callback_.is_null()) |
| 134 callback_.Run(OK); | 153 callback_.Run(OK); |
| 135 } | 154 } |
| 136 virtual void OnAuthRequired(SocketStream* socket, | 155 virtual void OnAuthRequired(SocketStream* socket, |
| 137 AuthChallengeInfo* auth_info) OVERRIDE { | 156 AuthChallengeInfo* auth_info) OVERRIDE { |
| 138 events_.push_back( | 157 events_.push_back(SocketStreamEvent(SocketStreamEvent::EVENT_AUTH_REQUIRED, |
| 139 SocketStreamEvent(SocketStreamEvent::EVENT_AUTH_REQUIRED, socket, 0, | 158 socket, |
| 140 std::string(), auth_info, OK)); | 159 0, |
| 160 std::string(), |
| 161 auth_info, |
| 162 OK)); |
| 141 if (!on_auth_required_.is_null()) | 163 if (!on_auth_required_.is_null()) |
| 142 on_auth_required_.Run(&events_.back()); | 164 on_auth_required_.Run(&events_.back()); |
| 143 } | 165 } |
| 144 virtual void OnError(const SocketStream* socket, int error) OVERRIDE { | 166 virtual void OnError(const SocketStream* socket, int error) OVERRIDE { |
| 145 events_.push_back( | 167 events_.push_back(SocketStreamEvent( |
| 146 SocketStreamEvent(SocketStreamEvent::EVENT_ERROR, NULL, 0, | 168 SocketStreamEvent::EVENT_ERROR, NULL, 0, std::string(), NULL, error)); |
| 147 std::string(), NULL, error)); | |
| 148 if (!on_error_.is_null()) | 169 if (!on_error_.is_null()) |
| 149 on_error_.Run(&events_.back()); | 170 on_error_.Run(&events_.back()); |
| 150 if (!callback_.is_null()) | 171 if (!callback_.is_null()) |
| 151 callback_.Run(error); | 172 callback_.Run(error); |
| 152 } | 173 } |
| 153 | 174 |
| 154 void DoClose(SocketStreamEvent* event) { | 175 void DoClose(SocketStreamEvent* event) { event->socket->Close(); } |
| 155 event->socket->Close(); | |
| 156 } | |
| 157 void DoRestartWithAuth(SocketStreamEvent* event) { | 176 void DoRestartWithAuth(SocketStreamEvent* event) { |
| 158 VLOG(1) << "RestartWithAuth username=" << credentials_.username() | 177 VLOG(1) << "RestartWithAuth username=" << credentials_.username() |
| 159 << " password=" << credentials_.password(); | 178 << " password=" << credentials_.password(); |
| 160 event->socket->RestartWithAuth(credentials_); | 179 event->socket->RestartWithAuth(credentials_); |
| 161 } | 180 } |
| 162 void SetAuthInfo(const AuthCredentials& credentials) { | 181 void SetAuthInfo(const AuthCredentials& credentials) { |
| 163 credentials_ = credentials; | 182 credentials_ = credentials; |
| 164 } | 183 } |
| 165 // Wakes up the SocketStream waiting for completion of OnStartOpenConnection() | 184 // Wakes up the SocketStream waiting for completion of OnStartOpenConnection() |
| 166 // of its delegate. | 185 // of its delegate. |
| 167 void CompleteConnection(int result) { | 186 void CompleteConnection(int result) { connection_callback_.Run(result); } |
| 168 connection_callback_.Run(result); | |
| 169 } | |
| 170 | 187 |
| 171 const std::vector<SocketStreamEvent>& GetSeenEvents() const { | 188 const std::vector<SocketStreamEvent>& GetSeenEvents() const { |
| 172 return events_; | 189 return events_; |
| 173 } | 190 } |
| 174 | 191 |
| 175 private: | 192 private: |
| 176 std::vector<SocketStreamEvent> events_; | 193 std::vector<SocketStreamEvent> events_; |
| 177 base::Callback<int(SocketStreamEvent*)> on_start_open_connection_; | 194 base::Callback<int(SocketStreamEvent*)> on_start_open_connection_; |
| 178 base::Callback<void(SocketStreamEvent*)> on_connected_; | 195 base::Callback<void(SocketStreamEvent*)> on_connected_; |
| 179 base::Callback<void(SocketStreamEvent*)> on_sent_data_; | 196 base::Callback<void(SocketStreamEvent*)> on_sent_data_; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 207 callback.Run(OK); | 224 callback.Run(OK); |
| 208 } | 225 } |
| 209 | 226 |
| 210 // This can't be passed in the constructor because this object needs to be | 227 // This can't be passed in the constructor because this object needs to be |
| 211 // created before SocketStream. | 228 // created before SocketStream. |
| 212 void set_socket_stream(const scoped_refptr<SocketStream>& socket_stream) { | 229 void set_socket_stream(const scoped_refptr<SocketStream>& socket_stream) { |
| 213 socket_stream_ = socket_stream; | 230 socket_stream_ = socket_stream; |
| 214 EXPECT_EQ(socket_stream_->delegate(), this); | 231 EXPECT_EQ(socket_stream_->delegate(), this); |
| 215 } | 232 } |
| 216 | 233 |
| 217 virtual void OnConnected(SocketStream* socket, int max_pending_send_allowed) | 234 virtual void OnConnected(SocketStream* socket, |
| 218 OVERRIDE { | 235 int max_pending_send_allowed) OVERRIDE { |
| 219 ADD_FAILURE() << "OnConnected() should not be called"; | 236 ADD_FAILURE() << "OnConnected() should not be called"; |
| 220 } | 237 } |
| 221 virtual void OnSentData(SocketStream* socket, int amount_sent) OVERRIDE { | 238 virtual void OnSentData(SocketStream* socket, int amount_sent) OVERRIDE { |
| 222 ADD_FAILURE() << "OnSentData() should not be called"; | 239 ADD_FAILURE() << "OnSentData() should not be called"; |
| 223 } | 240 } |
| 224 virtual void OnReceivedData(SocketStream* socket, const char* data, int len) | 241 virtual void OnReceivedData(SocketStream* socket, |
| 225 OVERRIDE { | 242 const char* data, |
| 243 int len) OVERRIDE { |
| 226 ADD_FAILURE() << "OnReceivedData() should not be called"; | 244 ADD_FAILURE() << "OnReceivedData() should not be called"; |
| 227 } | 245 } |
| 228 virtual void OnClose(SocketStream* socket) OVERRIDE { | 246 virtual void OnClose(SocketStream* socket) OVERRIDE { |
| 229 ADD_FAILURE() << "OnClose() should not be called"; | 247 ADD_FAILURE() << "OnClose() should not be called"; |
| 230 } | 248 } |
| 231 | 249 |
| 232 private: | 250 private: |
| 233 scoped_refptr<SocketStream> socket_stream_; | 251 scoped_refptr<SocketStream> socket_stream_; |
| 234 const CompletionCallback callback_; | 252 const CompletionCallback callback_; |
| 235 | 253 |
| 236 DISALLOW_COPY_AND_ASSIGN(SelfDeletingDelegate); | 254 DISALLOW_COPY_AND_ASSIGN(SelfDeletingDelegate); |
| 237 }; | 255 }; |
| 238 | 256 |
| 239 class TestURLRequestContextWithProxy : public TestURLRequestContext { | 257 class TestURLRequestContextWithProxy : public TestURLRequestContext { |
| 240 public: | 258 public: |
| 241 explicit TestURLRequestContextWithProxy(const std::string& proxy) | 259 explicit TestURLRequestContextWithProxy(const std::string& proxy) |
| 242 : TestURLRequestContext(true) { | 260 : TestURLRequestContext(true) { |
| 243 context_storage_.set_proxy_service(ProxyService::CreateFixed(proxy)); | 261 context_storage_.set_proxy_service(ProxyService::CreateFixed(proxy)); |
| 244 Init(); | 262 Init(); |
| 245 } | 263 } |
| 246 virtual ~TestURLRequestContextWithProxy() {} | 264 virtual ~TestURLRequestContextWithProxy() {} |
| 247 }; | 265 }; |
| 248 | 266 |
| 249 class TestSocketStreamNetworkDelegate : public TestNetworkDelegate { | 267 class TestSocketStreamNetworkDelegate : public TestNetworkDelegate { |
| 250 public: | 268 public: |
| 251 TestSocketStreamNetworkDelegate() | 269 TestSocketStreamNetworkDelegate() : before_connect_result_(OK) {} |
| 252 : before_connect_result_(OK) {} | |
| 253 virtual ~TestSocketStreamNetworkDelegate() {} | 270 virtual ~TestSocketStreamNetworkDelegate() {} |
| 254 | 271 |
| 255 virtual int OnBeforeSocketStreamConnect( | 272 virtual int OnBeforeSocketStreamConnect( |
| 256 SocketStream* stream, | 273 SocketStream* stream, |
| 257 const CompletionCallback& callback) OVERRIDE { | 274 const CompletionCallback& callback) OVERRIDE { |
| 258 return before_connect_result_; | 275 return before_connect_result_; |
| 259 } | 276 } |
| 260 | 277 |
| 261 void SetBeforeConnectResult(int result) { | 278 void SetBeforeConnectResult(int result) { before_connect_result_ = result; } |
| 262 before_connect_result_ = result; | |
| 263 } | |
| 264 | 279 |
| 265 private: | 280 private: |
| 266 int before_connect_result_; | 281 int before_connect_result_; |
| 267 }; | 282 }; |
| 268 | 283 |
| 269 } // namespace | 284 } // namespace |
| 270 | 285 |
| 271 class SocketStreamTest : public PlatformTest { | 286 class SocketStreamTest : public PlatformTest { |
| 272 public: | 287 public: |
| 273 virtual ~SocketStreamTest() {} | 288 virtual ~SocketStreamTest() {} |
| 274 virtual void SetUp() { | 289 virtual void SetUp() { |
| 275 mock_socket_factory_.reset(); | 290 mock_socket_factory_.reset(); |
| 276 handshake_request_ = kWebSocketHandshakeRequest; | 291 handshake_request_ = kWebSocketHandshakeRequest; |
| 277 handshake_response_ = kWebSocketHandshakeResponse; | 292 handshake_response_ = kWebSocketHandshakeResponse; |
| 278 } | 293 } |
| 279 virtual void TearDown() { | 294 virtual void TearDown() { mock_socket_factory_.reset(); } |
| 280 mock_socket_factory_.reset(); | |
| 281 } | |
| 282 | 295 |
| 283 virtual void SetWebSocketHandshakeMessage( | 296 virtual void SetWebSocketHandshakeMessage(const char* request, |
| 284 const char* request, const char* response) { | 297 const char* response) { |
| 285 handshake_request_ = request; | 298 handshake_request_ = request; |
| 286 handshake_response_ = response; | 299 handshake_response_ = response; |
| 287 } | 300 } |
| 288 virtual void AddWebSocketMessage(const std::string& message) { | 301 virtual void AddWebSocketMessage(const std::string& message) { |
| 289 messages_.push_back(message); | 302 messages_.push_back(message); |
| 290 } | 303 } |
| 291 | 304 |
| 292 virtual MockClientSocketFactory* GetMockClientSocketFactory() { | 305 virtual MockClientSocketFactory* GetMockClientSocketFactory() { |
| 293 mock_socket_factory_.reset(new MockClientSocketFactory); | 306 mock_socket_factory_.reset(new MockClientSocketFactory); |
| 294 return mock_socket_factory_.get(); | 307 return mock_socket_factory_.get(); |
| 295 } | 308 } |
| 296 | 309 |
| 297 // Functions for SocketStreamEventRecorder to handle calls to the | 310 // Functions for SocketStreamEventRecorder to handle calls to the |
| 298 // SocketStream::Delegate methods from the SocketStream. | 311 // SocketStream::Delegate methods from the SocketStream. |
| 299 | 312 |
| 300 virtual void DoSendWebSocketHandshake(SocketStreamEvent* event) { | 313 virtual void DoSendWebSocketHandshake(SocketStreamEvent* event) { |
| 301 event->socket->SendData( | 314 event->socket->SendData(handshake_request_.data(), |
| 302 handshake_request_.data(), handshake_request_.size()); | 315 handshake_request_.size()); |
| 303 } | 316 } |
| 304 | 317 |
| 305 virtual void DoCloseFlushPendingWriteTest(SocketStreamEvent* event) { | 318 virtual void DoCloseFlushPendingWriteTest(SocketStreamEvent* event) { |
| 306 // handshake response received. | 319 // handshake response received. |
| 307 for (size_t i = 0; i < messages_.size(); i++) { | 320 for (size_t i = 0; i < messages_.size(); i++) { |
| 308 std::vector<char> frame; | 321 std::vector<char> frame; |
| 309 frame.push_back('\0'); | 322 frame.push_back('\0'); |
| 310 frame.insert(frame.end(), messages_[i].begin(), messages_[i].end()); | 323 frame.insert(frame.end(), messages_[i].begin(), messages_[i].end()); |
| 311 frame.push_back('\xff'); | 324 frame.push_back('\xff'); |
| 312 EXPECT_TRUE(event->socket->SendData(&frame[0], frame.size())); | 325 EXPECT_TRUE(event->socket->SendData(&frame[0], frame.size())); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 "8jKS'y:G*Co,Wxa-"; | 400 "8jKS'y:G*Co,Wxa-"; |
| 388 | 401 |
| 389 TEST_F(SocketStreamTest, CloseFlushPendingWrite) { | 402 TEST_F(SocketStreamTest, CloseFlushPendingWrite) { |
| 390 TestCompletionCallback test_callback; | 403 TestCompletionCallback test_callback; |
| 391 | 404 |
| 392 scoped_ptr<SocketStreamEventRecorder> delegate( | 405 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 393 new SocketStreamEventRecorder(test_callback.callback())); | 406 new SocketStreamEventRecorder(test_callback.callback())); |
| 394 delegate->SetOnConnected(base::Bind( | 407 delegate->SetOnConnected(base::Bind( |
| 395 &SocketStreamTest::DoSendWebSocketHandshake, base::Unretained(this))); | 408 &SocketStreamTest::DoSendWebSocketHandshake, base::Unretained(this))); |
| 396 delegate->SetOnReceivedData(base::Bind( | 409 delegate->SetOnReceivedData(base::Bind( |
| 397 &SocketStreamTest::DoCloseFlushPendingWriteTest, | 410 &SocketStreamTest::DoCloseFlushPendingWriteTest, base::Unretained(this))); |
| 398 base::Unretained(this))); | |
| 399 | 411 |
| 400 TestURLRequestContext context; | 412 TestURLRequestContext context; |
| 401 | 413 |
| 402 scoped_refptr<SocketStream> socket_stream( | 414 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 403 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 415 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 404 &context, NULL)); | |
| 405 | 416 |
| 406 MockWrite data_writes[] = { | 417 MockWrite data_writes[] = { |
| 407 MockWrite(SocketStreamTest::kWebSocketHandshakeRequest), | 418 MockWrite(SocketStreamTest::kWebSocketHandshakeRequest), |
| 408 MockWrite(ASYNC, "\0message1\xff", 10), | 419 MockWrite(ASYNC, "\0message1\xff", 10), |
| 409 MockWrite(ASYNC, "\0message2\xff", 10) | 420 MockWrite(ASYNC, "\0message2\xff", 10)}; |
| 410 }; | |
| 411 MockRead data_reads[] = { | 421 MockRead data_reads[] = { |
| 412 MockRead(SocketStreamTest::kWebSocketHandshakeResponse), | 422 MockRead(SocketStreamTest::kWebSocketHandshakeResponse), |
| 413 // Server doesn't close the connection after handshake. | 423 // Server doesn't close the connection after handshake. |
| 414 MockRead(ASYNC, ERR_IO_PENDING) | 424 MockRead(ASYNC, ERR_IO_PENDING)}; |
| 415 }; | |
| 416 AddWebSocketMessage("message1"); | 425 AddWebSocketMessage("message1"); |
| 417 AddWebSocketMessage("message2"); | 426 AddWebSocketMessage("message2"); |
| 418 | 427 |
| 419 DelayedSocketData data_provider( | 428 DelayedSocketData data_provider(1, |
| 420 1, data_reads, arraysize(data_reads), | 429 data_reads, |
| 421 data_writes, arraysize(data_writes)); | 430 arraysize(data_reads), |
| 431 data_writes, |
| 432 arraysize(data_writes)); |
| 422 | 433 |
| 423 MockClientSocketFactory* mock_socket_factory = | 434 MockClientSocketFactory* mock_socket_factory = GetMockClientSocketFactory(); |
| 424 GetMockClientSocketFactory(); | |
| 425 mock_socket_factory->AddSocketDataProvider(&data_provider); | 435 mock_socket_factory->AddSocketDataProvider(&data_provider); |
| 426 | 436 |
| 427 socket_stream->SetClientSocketFactory(mock_socket_factory); | 437 socket_stream->SetClientSocketFactory(mock_socket_factory); |
| 428 | 438 |
| 429 socket_stream->Connect(); | 439 socket_stream->Connect(); |
| 430 | 440 |
| 431 test_callback.WaitForResult(); | 441 test_callback.WaitForResult(); |
| 432 | 442 |
| 433 EXPECT_TRUE(data_provider.at_read_eof()); | 443 EXPECT_TRUE(data_provider.at_read_eof()); |
| 434 EXPECT_TRUE(data_provider.at_write_eof()); | 444 EXPECT_TRUE(data_provider.at_write_eof()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 447 } | 457 } |
| 448 | 458 |
| 449 TEST_F(SocketStreamTest, ResolveFailure) { | 459 TEST_F(SocketStreamTest, ResolveFailure) { |
| 450 TestCompletionCallback test_callback; | 460 TestCompletionCallback test_callback; |
| 451 | 461 |
| 452 scoped_ptr<SocketStreamEventRecorder> delegate( | 462 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 453 new SocketStreamEventRecorder(test_callback.callback())); | 463 new SocketStreamEventRecorder(test_callback.callback())); |
| 454 | 464 |
| 455 // Make resolver fail. | 465 // Make resolver fail. |
| 456 TestURLRequestContext context; | 466 TestURLRequestContext context; |
| 457 scoped_ptr<MockHostResolver> mock_host_resolver( | 467 scoped_ptr<MockHostResolver> mock_host_resolver(new MockHostResolver()); |
| 458 new MockHostResolver()); | |
| 459 mock_host_resolver->rules()->AddSimulatedFailure("example.com"); | 468 mock_host_resolver->rules()->AddSimulatedFailure("example.com"); |
| 460 context.set_host_resolver(mock_host_resolver.get()); | 469 context.set_host_resolver(mock_host_resolver.get()); |
| 461 | 470 |
| 462 scoped_refptr<SocketStream> socket_stream( | 471 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 463 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 472 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 464 &context, NULL)); | |
| 465 | 473 |
| 466 // No read/write on socket is expected. | 474 // No read/write on socket is expected. |
| 467 StaticSocketDataProvider data_provider(NULL, 0, NULL, 0); | 475 StaticSocketDataProvider data_provider(NULL, 0, NULL, 0); |
| 468 MockClientSocketFactory* mock_socket_factory = | 476 MockClientSocketFactory* mock_socket_factory = GetMockClientSocketFactory(); |
| 469 GetMockClientSocketFactory(); | |
| 470 mock_socket_factory->AddSocketDataProvider(&data_provider); | 477 mock_socket_factory->AddSocketDataProvider(&data_provider); |
| 471 socket_stream->SetClientSocketFactory(mock_socket_factory); | 478 socket_stream->SetClientSocketFactory(mock_socket_factory); |
| 472 | 479 |
| 473 socket_stream->Connect(); | 480 socket_stream->Connect(); |
| 474 | 481 |
| 475 test_callback.WaitForResult(); | 482 test_callback.WaitForResult(); |
| 476 | 483 |
| 477 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 484 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 478 ASSERT_EQ(2U, events.size()); | 485 ASSERT_EQ(2U, events.size()); |
| 479 | 486 |
| 480 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[0].event_type); | 487 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[0].event_type); |
| 481 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[1].event_type); | 488 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[1].event_type); |
| 482 } | 489 } |
| 483 | 490 |
| 484 TEST_F(SocketStreamTest, ExceedMaxPendingSendAllowed) { | 491 TEST_F(SocketStreamTest, ExceedMaxPendingSendAllowed) { |
| 485 TestCompletionCallback test_callback; | 492 TestCompletionCallback test_callback; |
| 486 | 493 |
| 487 scoped_ptr<SocketStreamEventRecorder> delegate( | 494 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 488 new SocketStreamEventRecorder(test_callback.callback())); | 495 new SocketStreamEventRecorder(test_callback.callback())); |
| 489 delegate->SetOnConnected(base::Bind( | 496 delegate->SetOnConnected(base::Bind( |
| 490 &SocketStreamTest::DoFailByTooBigDataAndClose, base::Unretained(this))); | 497 &SocketStreamTest::DoFailByTooBigDataAndClose, base::Unretained(this))); |
| 491 | 498 |
| 492 TestURLRequestContext context; | 499 TestURLRequestContext context; |
| 493 | 500 |
| 494 scoped_refptr<SocketStream> socket_stream( | 501 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 495 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 502 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 496 &context, NULL)); | |
| 497 | 503 |
| 498 DelayedSocketData data_provider(1, NULL, 0, NULL, 0); | 504 DelayedSocketData data_provider(1, NULL, 0, NULL, 0); |
| 499 | 505 |
| 500 MockClientSocketFactory* mock_socket_factory = | 506 MockClientSocketFactory* mock_socket_factory = GetMockClientSocketFactory(); |
| 501 GetMockClientSocketFactory(); | |
| 502 mock_socket_factory->AddSocketDataProvider(&data_provider); | 507 mock_socket_factory->AddSocketDataProvider(&data_provider); |
| 503 | 508 |
| 504 socket_stream->SetClientSocketFactory(mock_socket_factory); | 509 socket_stream->SetClientSocketFactory(mock_socket_factory); |
| 505 | 510 |
| 506 socket_stream->Connect(); | 511 socket_stream->Connect(); |
| 507 | 512 |
| 508 test_callback.WaitForResult(); | 513 test_callback.WaitForResult(); |
| 509 | 514 |
| 510 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 515 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 511 ASSERT_EQ(4U, events.size()); | 516 ASSERT_EQ(4U, events.size()); |
| 512 | 517 |
| 513 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 518 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 514 events[0].event_type); | 519 events[0].event_type); |
| 515 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 520 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
| 516 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[2].event_type); | 521 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[2].event_type); |
| 517 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); | 522 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); |
| 518 } | 523 } |
| 519 | 524 |
| 520 TEST_F(SocketStreamTest, BasicAuthProxy) { | 525 TEST_F(SocketStreamTest, BasicAuthProxy) { |
| 521 MockClientSocketFactory mock_socket_factory; | 526 MockClientSocketFactory mock_socket_factory; |
| 522 MockWrite data_writes1[] = { | 527 MockWrite data_writes1[] = { |
| 523 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" | 528 MockWrite( |
| 524 "Host: example.com\r\n" | 529 "CONNECT example.com:80 HTTP/1.1\r\n" |
| 525 "Proxy-Connection: keep-alive\r\n\r\n"), | 530 "Host: example.com\r\n" |
| 531 "Proxy-Connection: keep-alive\r\n\r\n"), |
| 526 }; | 532 }; |
| 527 MockRead data_reads1[] = { | 533 MockRead data_reads1[] = { |
| 528 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | 534 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), |
| 529 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 535 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
| 530 MockRead("\r\n"), | 536 MockRead("\r\n"), |
| 531 }; | 537 }; |
| 532 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 538 StaticSocketDataProvider data1(data_reads1, |
| 533 data_writes1, arraysize(data_writes1)); | 539 arraysize(data_reads1), |
| 540 data_writes1, |
| 541 arraysize(data_writes1)); |
| 534 mock_socket_factory.AddSocketDataProvider(&data1); | 542 mock_socket_factory.AddSocketDataProvider(&data1); |
| 535 | 543 |
| 536 MockWrite data_writes2[] = { | 544 MockWrite data_writes2[] = { |
| 537 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" | 545 MockWrite( |
| 538 "Host: example.com\r\n" | 546 "CONNECT example.com:80 HTTP/1.1\r\n" |
| 539 "Proxy-Connection: keep-alive\r\n" | 547 "Host: example.com\r\n" |
| 540 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 548 "Proxy-Connection: keep-alive\r\n" |
| 549 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
| 541 }; | 550 }; |
| 542 MockRead data_reads2[] = { | 551 MockRead data_reads2[] = { |
| 543 MockRead("HTTP/1.1 200 Connection Established\r\n"), | 552 MockRead("HTTP/1.1 200 Connection Established\r\n"), |
| 544 MockRead("Proxy-agent: Apache/2.2.8\r\n"), | 553 MockRead("Proxy-agent: Apache/2.2.8\r\n"), MockRead("\r\n"), |
| 545 MockRead("\r\n"), | 554 // SocketStream::DoClose is run asynchronously. Socket can be read after |
| 546 // SocketStream::DoClose is run asynchronously. Socket can be read after | 555 // "\r\n". We have to give ERR_IO_PENDING to SocketStream then to |
| 547 // "\r\n". We have to give ERR_IO_PENDING to SocketStream then to indicate | 556 // indicate |
| 548 // server doesn't close the connection. | 557 // server doesn't close the connection. |
| 549 MockRead(ASYNC, ERR_IO_PENDING) | 558 MockRead(ASYNC, ERR_IO_PENDING)}; |
| 550 }; | 559 StaticSocketDataProvider data2(data_reads2, |
| 551 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 560 arraysize(data_reads2), |
| 552 data_writes2, arraysize(data_writes2)); | 561 data_writes2, |
| 562 arraysize(data_writes2)); |
| 553 mock_socket_factory.AddSocketDataProvider(&data2); | 563 mock_socket_factory.AddSocketDataProvider(&data2); |
| 554 | 564 |
| 555 TestCompletionCallback test_callback; | 565 TestCompletionCallback test_callback; |
| 556 | 566 |
| 557 scoped_ptr<SocketStreamEventRecorder> delegate( | 567 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 558 new SocketStreamEventRecorder(test_callback.callback())); | 568 new SocketStreamEventRecorder(test_callback.callback())); |
| 559 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, | 569 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, |
| 560 base::Unretained(delegate.get()))); | 570 base::Unretained(delegate.get()))); |
| 561 delegate->SetAuthInfo(AuthCredentials(ASCIIToUTF16("foo"), | 571 delegate->SetAuthInfo( |
| 562 ASCIIToUTF16("bar"))); | 572 AuthCredentials(ASCIIToUTF16("foo"), ASCIIToUTF16("bar"))); |
| 563 delegate->SetOnAuthRequired(base::Bind( | 573 delegate->SetOnAuthRequired( |
| 564 &SocketStreamEventRecorder::DoRestartWithAuth, | 574 base::Bind(&SocketStreamEventRecorder::DoRestartWithAuth, |
| 565 base::Unretained(delegate.get()))); | 575 base::Unretained(delegate.get()))); |
| 566 | 576 |
| 567 TestURLRequestContextWithProxy context("myproxy:70"); | 577 TestURLRequestContextWithProxy context("myproxy:70"); |
| 568 | 578 |
| 569 scoped_refptr<SocketStream> socket_stream( | 579 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 570 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 580 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 571 &context, NULL)); | |
| 572 | 581 |
| 573 socket_stream->SetClientSocketFactory(&mock_socket_factory); | 582 socket_stream->SetClientSocketFactory(&mock_socket_factory); |
| 574 | 583 |
| 575 socket_stream->Connect(); | 584 socket_stream->Connect(); |
| 576 | 585 |
| 577 test_callback.WaitForResult(); | 586 test_callback.WaitForResult(); |
| 578 | 587 |
| 579 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 588 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 580 ASSERT_EQ(5U, events.size()); | 589 ASSERT_EQ(5U, events.size()); |
| 581 | 590 |
| 582 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 591 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 583 events[0].event_type); | 592 events[0].event_type); |
| 584 EXPECT_EQ(SocketStreamEvent::EVENT_AUTH_REQUIRED, events[1].event_type); | 593 EXPECT_EQ(SocketStreamEvent::EVENT_AUTH_REQUIRED, events[1].event_type); |
| 585 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[2].event_type); | 594 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[2].event_type); |
| 586 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[3].event_type); | 595 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[3].event_type); |
| 587 EXPECT_EQ(ERR_ABORTED, events[3].error_code); | 596 EXPECT_EQ(ERR_ABORTED, events[3].error_code); |
| 588 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[4].event_type); | 597 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[4].event_type); |
| 589 | 598 |
| 590 // TODO(eroman): Add back NetLogTest here... | 599 // TODO(eroman): Add back NetLogTest here... |
| 591 } | 600 } |
| 592 | 601 |
| 593 TEST_F(SocketStreamTest, BasicAuthProxyWithAuthCache) { | 602 TEST_F(SocketStreamTest, BasicAuthProxyWithAuthCache) { |
| 594 MockClientSocketFactory mock_socket_factory; | 603 MockClientSocketFactory mock_socket_factory; |
| 595 MockWrite data_writes[] = { | 604 MockWrite data_writes[] = { |
| 596 // WebSocket(SocketStream) always uses CONNECT when it is configured to use | 605 // WebSocket(SocketStream) always uses CONNECT when it is configured to |
| 597 // proxy so the port may not be 443. | 606 // use |
| 598 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" | 607 // proxy so the port may not be 443. |
| 599 "Host: example.com\r\n" | 608 MockWrite( |
| 600 "Proxy-Connection: keep-alive\r\n" | 609 "CONNECT example.com:80 HTTP/1.1\r\n" |
| 601 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 610 "Host: example.com\r\n" |
| 611 "Proxy-Connection: keep-alive\r\n" |
| 612 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
| 602 }; | 613 }; |
| 603 MockRead data_reads[] = { | 614 MockRead data_reads[] = {MockRead("HTTP/1.1 200 Connection Established\r\n"), |
| 604 MockRead("HTTP/1.1 200 Connection Established\r\n"), | 615 MockRead("Proxy-agent: Apache/2.2.8\r\n"), |
| 605 MockRead("Proxy-agent: Apache/2.2.8\r\n"), | 616 MockRead("\r\n"), MockRead(ASYNC, ERR_IO_PENDING)}; |
| 606 MockRead("\r\n"), | 617 StaticSocketDataProvider data( |
| 607 MockRead(ASYNC, ERR_IO_PENDING) | 618 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
| 608 }; | |
| 609 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | |
| 610 data_writes, arraysize(data_writes)); | |
| 611 mock_socket_factory.AddSocketDataProvider(&data); | 619 mock_socket_factory.AddSocketDataProvider(&data); |
| 612 | 620 |
| 613 TestCompletionCallback test_callback; | 621 TestCompletionCallback test_callback; |
| 614 scoped_ptr<SocketStreamEventRecorder> delegate( | 622 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 615 new SocketStreamEventRecorder(test_callback.callback())); | 623 new SocketStreamEventRecorder(test_callback.callback())); |
| 616 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, | 624 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, |
| 617 base::Unretained(delegate.get()))); | 625 base::Unretained(delegate.get()))); |
| 618 | 626 |
| 619 TestURLRequestContextWithProxy context("myproxy:70"); | 627 TestURLRequestContextWithProxy context("myproxy:70"); |
| 620 HttpAuthCache* auth_cache = | 628 HttpAuthCache* auth_cache = |
| 621 context.http_transaction_factory()->GetSession()->http_auth_cache(); | 629 context.http_transaction_factory()->GetSession()->http_auth_cache(); |
| 622 auth_cache->Add(GURL("http://myproxy:70"), | 630 auth_cache->Add(GURL("http://myproxy:70"), |
| 623 "MyRealm1", | 631 "MyRealm1", |
| 624 HttpAuth::AUTH_SCHEME_BASIC, | 632 HttpAuth::AUTH_SCHEME_BASIC, |
| 625 "Basic realm=MyRealm1", | 633 "Basic realm=MyRealm1", |
| 626 AuthCredentials(ASCIIToUTF16("foo"), | 634 AuthCredentials(ASCIIToUTF16("foo"), ASCIIToUTF16("bar")), |
| 627 ASCIIToUTF16("bar")), | |
| 628 "/"); | 635 "/"); |
| 629 | 636 |
| 630 scoped_refptr<SocketStream> socket_stream( | 637 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 631 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 638 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 632 &context, NULL)); | |
| 633 | 639 |
| 634 socket_stream->SetClientSocketFactory(&mock_socket_factory); | 640 socket_stream->SetClientSocketFactory(&mock_socket_factory); |
| 635 | 641 |
| 636 socket_stream->Connect(); | 642 socket_stream->Connect(); |
| 637 | 643 |
| 638 test_callback.WaitForResult(); | 644 test_callback.WaitForResult(); |
| 639 | 645 |
| 640 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 646 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 641 ASSERT_EQ(4U, events.size()); | 647 ASSERT_EQ(4U, events.size()); |
| 642 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 648 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 643 events[0].event_type); | 649 events[0].event_type); |
| 644 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 650 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
| 645 EXPECT_EQ(ERR_ABORTED, events[2].error_code); | 651 EXPECT_EQ(ERR_ABORTED, events[2].error_code); |
| 646 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); | 652 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); |
| 647 } | 653 } |
| 648 | 654 |
| 649 TEST_F(SocketStreamTest, WSSBasicAuthProxyWithAuthCache) { | 655 TEST_F(SocketStreamTest, WSSBasicAuthProxyWithAuthCache) { |
| 650 MockClientSocketFactory mock_socket_factory; | 656 MockClientSocketFactory mock_socket_factory; |
| 651 MockWrite data_writes1[] = { | 657 MockWrite data_writes1[] = { |
| 652 MockWrite("CONNECT example.com:443 HTTP/1.1\r\n" | 658 MockWrite( |
| 653 "Host: example.com\r\n" | 659 "CONNECT example.com:443 HTTP/1.1\r\n" |
| 654 "Proxy-Connection: keep-alive\r\n" | 660 "Host: example.com\r\n" |
| 655 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 661 "Proxy-Connection: keep-alive\r\n" |
| 662 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
| 656 }; | 663 }; |
| 657 MockRead data_reads1[] = { | 664 MockRead data_reads1[] = {MockRead("HTTP/1.1 200 Connection Established\r\n"), |
| 658 MockRead("HTTP/1.1 200 Connection Established\r\n"), | 665 MockRead("Proxy-agent: Apache/2.2.8\r\n"), |
| 659 MockRead("Proxy-agent: Apache/2.2.8\r\n"), | 666 MockRead("\r\n"), MockRead(ASYNC, ERR_IO_PENDING)}; |
| 660 MockRead("\r\n"), | 667 StaticSocketDataProvider data1(data_reads1, |
| 661 MockRead(ASYNC, ERR_IO_PENDING) | 668 arraysize(data_reads1), |
| 662 }; | 669 data_writes1, |
| 663 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1), | 670 arraysize(data_writes1)); |
| 664 data_writes1, arraysize(data_writes1)); | |
| 665 mock_socket_factory.AddSocketDataProvider(&data1); | 671 mock_socket_factory.AddSocketDataProvider(&data1); |
| 666 | 672 |
| 667 SSLSocketDataProvider data2(ASYNC, OK); | 673 SSLSocketDataProvider data2(ASYNC, OK); |
| 668 mock_socket_factory.AddSSLSocketDataProvider(&data2); | 674 mock_socket_factory.AddSSLSocketDataProvider(&data2); |
| 669 | 675 |
| 670 TestCompletionCallback test_callback; | 676 TestCompletionCallback test_callback; |
| 671 scoped_ptr<SocketStreamEventRecorder> delegate( | 677 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 672 new SocketStreamEventRecorder(test_callback.callback())); | 678 new SocketStreamEventRecorder(test_callback.callback())); |
| 673 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, | 679 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, |
| 674 base::Unretained(delegate.get()))); | 680 base::Unretained(delegate.get()))); |
| 675 | 681 |
| 676 TestURLRequestContextWithProxy context("myproxy:70"); | 682 TestURLRequestContextWithProxy context("myproxy:70"); |
| 677 HttpAuthCache* auth_cache = | 683 HttpAuthCache* auth_cache = |
| 678 context.http_transaction_factory()->GetSession()->http_auth_cache(); | 684 context.http_transaction_factory()->GetSession()->http_auth_cache(); |
| 679 auth_cache->Add(GURL("http://myproxy:70"), | 685 auth_cache->Add(GURL("http://myproxy:70"), |
| 680 "MyRealm1", | 686 "MyRealm1", |
| 681 HttpAuth::AUTH_SCHEME_BASIC, | 687 HttpAuth::AUTH_SCHEME_BASIC, |
| 682 "Basic realm=MyRealm1", | 688 "Basic realm=MyRealm1", |
| 683 AuthCredentials(ASCIIToUTF16("foo"), | 689 AuthCredentials(ASCIIToUTF16("foo"), ASCIIToUTF16("bar")), |
| 684 ASCIIToUTF16("bar")), | |
| 685 "/"); | 690 "/"); |
| 686 | 691 |
| 687 scoped_refptr<SocketStream> socket_stream( | 692 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 688 new SocketStream(GURL("wss://example.com/demo"), delegate.get(), | 693 GURL("wss://example.com/demo"), delegate.get(), &context, NULL)); |
| 689 &context, NULL)); | |
| 690 | 694 |
| 691 socket_stream->SetClientSocketFactory(&mock_socket_factory); | 695 socket_stream->SetClientSocketFactory(&mock_socket_factory); |
| 692 | 696 |
| 693 socket_stream->Connect(); | 697 socket_stream->Connect(); |
| 694 | 698 |
| 695 test_callback.WaitForResult(); | 699 test_callback.WaitForResult(); |
| 696 | 700 |
| 697 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 701 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 698 ASSERT_EQ(4U, events.size()); | 702 ASSERT_EQ(4U, events.size()); |
| 699 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 703 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 700 events[0].event_type); | 704 events[0].event_type); |
| 701 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 705 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
| 702 EXPECT_EQ(ERR_ABORTED, events[2].error_code); | 706 EXPECT_EQ(ERR_ABORTED, events[2].error_code); |
| 703 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); | 707 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); |
| 704 } | 708 } |
| 705 | 709 |
| 706 TEST_F(SocketStreamTest, IOPending) { | 710 TEST_F(SocketStreamTest, IOPending) { |
| 707 TestCompletionCallback test_callback; | 711 TestCompletionCallback test_callback; |
| 708 | 712 |
| 709 scoped_ptr<SocketStreamEventRecorder> delegate( | 713 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 710 new SocketStreamEventRecorder(test_callback.callback())); | 714 new SocketStreamEventRecorder(test_callback.callback())); |
| 711 delegate->SetOnStartOpenConnection(base::Bind( | 715 delegate->SetOnStartOpenConnection( |
| 712 &SocketStreamTest::DoIOPending, base::Unretained(this))); | 716 base::Bind(&SocketStreamTest::DoIOPending, base::Unretained(this))); |
| 713 delegate->SetOnConnected(base::Bind( | 717 delegate->SetOnConnected(base::Bind( |
| 714 &SocketStreamTest::DoSendWebSocketHandshake, base::Unretained(this))); | 718 &SocketStreamTest::DoSendWebSocketHandshake, base::Unretained(this))); |
| 715 delegate->SetOnReceivedData(base::Bind( | 719 delegate->SetOnReceivedData(base::Bind( |
| 716 &SocketStreamTest::DoCloseFlushPendingWriteTest, | 720 &SocketStreamTest::DoCloseFlushPendingWriteTest, base::Unretained(this))); |
| 717 base::Unretained(this))); | |
| 718 | 721 |
| 719 TestURLRequestContext context; | 722 TestURLRequestContext context; |
| 720 | 723 |
| 721 scoped_refptr<SocketStream> socket_stream( | 724 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 722 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 725 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 723 &context, NULL)); | |
| 724 | 726 |
| 725 MockWrite data_writes[] = { | 727 MockWrite data_writes[] = { |
| 726 MockWrite(SocketStreamTest::kWebSocketHandshakeRequest), | 728 MockWrite(SocketStreamTest::kWebSocketHandshakeRequest), |
| 727 MockWrite(ASYNC, "\0message1\xff", 10), | 729 MockWrite(ASYNC, "\0message1\xff", 10), |
| 728 MockWrite(ASYNC, "\0message2\xff", 10) | 730 MockWrite(ASYNC, "\0message2\xff", 10)}; |
| 729 }; | |
| 730 MockRead data_reads[] = { | 731 MockRead data_reads[] = { |
| 731 MockRead(SocketStreamTest::kWebSocketHandshakeResponse), | 732 MockRead(SocketStreamTest::kWebSocketHandshakeResponse), |
| 732 // Server doesn't close the connection after handshake. | 733 // Server doesn't close the connection after handshake. |
| 733 MockRead(ASYNC, ERR_IO_PENDING) | 734 MockRead(ASYNC, ERR_IO_PENDING)}; |
| 734 }; | |
| 735 AddWebSocketMessage("message1"); | 735 AddWebSocketMessage("message1"); |
| 736 AddWebSocketMessage("message2"); | 736 AddWebSocketMessage("message2"); |
| 737 | 737 |
| 738 DelayedSocketData data_provider( | 738 DelayedSocketData data_provider(1, |
| 739 1, data_reads, arraysize(data_reads), | 739 data_reads, |
| 740 data_writes, arraysize(data_writes)); | 740 arraysize(data_reads), |
| 741 data_writes, |
| 742 arraysize(data_writes)); |
| 741 | 743 |
| 742 MockClientSocketFactory* mock_socket_factory = | 744 MockClientSocketFactory* mock_socket_factory = GetMockClientSocketFactory(); |
| 743 GetMockClientSocketFactory(); | |
| 744 mock_socket_factory->AddSocketDataProvider(&data_provider); | 745 mock_socket_factory->AddSocketDataProvider(&data_provider); |
| 745 | 746 |
| 746 socket_stream->SetClientSocketFactory(mock_socket_factory); | 747 socket_stream->SetClientSocketFactory(mock_socket_factory); |
| 747 | 748 |
| 748 socket_stream->Connect(); | 749 socket_stream->Connect(); |
| 749 io_test_callback_.WaitForResult(); | 750 io_test_callback_.WaitForResult(); |
| 750 EXPECT_EQ(SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, | 751 EXPECT_EQ(SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, |
| 751 socket_stream->next_state_); | 752 socket_stream->next_state_); |
| 752 delegate->CompleteConnection(OK); | 753 delegate->CompleteConnection(OK); |
| 753 | 754 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 772 TEST_F(SocketStreamTest, SwitchToSpdy) { | 773 TEST_F(SocketStreamTest, SwitchToSpdy) { |
| 773 TestCompletionCallback test_callback; | 774 TestCompletionCallback test_callback; |
| 774 | 775 |
| 775 scoped_ptr<SocketStreamEventRecorder> delegate( | 776 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 776 new SocketStreamEventRecorder(test_callback.callback())); | 777 new SocketStreamEventRecorder(test_callback.callback())); |
| 777 delegate->SetOnStartOpenConnection(base::Bind( | 778 delegate->SetOnStartOpenConnection(base::Bind( |
| 778 &SocketStreamTest::DoSwitchToSpdyTest, base::Unretained(this))); | 779 &SocketStreamTest::DoSwitchToSpdyTest, base::Unretained(this))); |
| 779 | 780 |
| 780 TestURLRequestContext context; | 781 TestURLRequestContext context; |
| 781 | 782 |
| 782 scoped_refptr<SocketStream> socket_stream( | 783 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 783 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 784 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 784 &context, NULL)); | |
| 785 | 785 |
| 786 socket_stream->Connect(); | 786 socket_stream->Connect(); |
| 787 | 787 |
| 788 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, test_callback.WaitForResult()); | 788 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, test_callback.WaitForResult()); |
| 789 | 789 |
| 790 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 790 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 791 ASSERT_EQ(2U, events.size()); | 791 ASSERT_EQ(2U, events.size()); |
| 792 | 792 |
| 793 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 793 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 794 events[0].event_type); | 794 events[0].event_type); |
| 795 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); | 795 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); |
| 796 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, events[1].error_code); | 796 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, events[1].error_code); |
| 797 } | 797 } |
| 798 | 798 |
| 799 TEST_F(SocketStreamTest, SwitchAfterPending) { | 799 TEST_F(SocketStreamTest, SwitchAfterPending) { |
| 800 TestCompletionCallback test_callback; | 800 TestCompletionCallback test_callback; |
| 801 | 801 |
| 802 scoped_ptr<SocketStreamEventRecorder> delegate( | 802 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 803 new SocketStreamEventRecorder(test_callback.callback())); | 803 new SocketStreamEventRecorder(test_callback.callback())); |
| 804 delegate->SetOnStartOpenConnection(base::Bind( | 804 delegate->SetOnStartOpenConnection( |
| 805 &SocketStreamTest::DoIOPending, base::Unretained(this))); | 805 base::Bind(&SocketStreamTest::DoIOPending, base::Unretained(this))); |
| 806 | 806 |
| 807 TestURLRequestContext context; | 807 TestURLRequestContext context; |
| 808 | 808 |
| 809 scoped_refptr<SocketStream> socket_stream( | 809 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 810 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 810 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 811 &context, NULL)); | |
| 812 | 811 |
| 813 socket_stream->Connect(); | 812 socket_stream->Connect(); |
| 814 io_test_callback_.WaitForResult(); | 813 io_test_callback_.WaitForResult(); |
| 815 | 814 |
| 816 EXPECT_EQ(SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, | 815 EXPECT_EQ(SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, |
| 817 socket_stream->next_state_); | 816 socket_stream->next_state_); |
| 818 delegate->CompleteConnection(ERR_PROTOCOL_SWITCHED); | 817 delegate->CompleteConnection(ERR_PROTOCOL_SWITCHED); |
| 819 | 818 |
| 820 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, test_callback.WaitForResult()); | 819 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, test_callback.WaitForResult()); |
| 821 | 820 |
| 822 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 821 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 823 ASSERT_EQ(2U, events.size()); | 822 ASSERT_EQ(2U, events.size()); |
| 824 | 823 |
| 825 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 824 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 826 events[0].event_type); | 825 events[0].event_type); |
| 827 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); | 826 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); |
| 828 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, events[1].error_code); | 827 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, events[1].error_code); |
| 829 } | 828 } |
| 830 | 829 |
| 831 // Test a connection though a secure proxy. | 830 // Test a connection though a secure proxy. |
| 832 TEST_F(SocketStreamTest, SecureProxyConnectError) { | 831 TEST_F(SocketStreamTest, SecureProxyConnectError) { |
| 833 MockClientSocketFactory mock_socket_factory; | 832 MockClientSocketFactory mock_socket_factory; |
| 834 MockWrite data_writes[] = { | 833 MockWrite data_writes[] = {MockWrite( |
| 835 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" | 834 "CONNECT example.com:80 HTTP/1.1\r\n" |
| 836 "Host: example.com\r\n" | 835 "Host: example.com\r\n" |
| 837 "Proxy-Connection: keep-alive\r\n\r\n") | 836 "Proxy-Connection: keep-alive\r\n\r\n")}; |
| 838 }; | |
| 839 MockRead data_reads[] = { | 837 MockRead data_reads[] = { |
| 840 MockRead("HTTP/1.1 200 Connection Established\r\n"), | 838 MockRead("HTTP/1.1 200 Connection Established\r\n"), |
| 841 MockRead("Proxy-agent: Apache/2.2.8\r\n"), | 839 MockRead("Proxy-agent: Apache/2.2.8\r\n"), MockRead("\r\n"), |
| 842 MockRead("\r\n"), | 840 // SocketStream::DoClose is run asynchronously. Socket can be read after |
| 843 // SocketStream::DoClose is run asynchronously. Socket can be read after | 841 // "\r\n". We have to give ERR_IO_PENDING to SocketStream then to |
| 844 // "\r\n". We have to give ERR_IO_PENDING to SocketStream then to indicate | 842 // indicate |
| 845 // server doesn't close the connection. | 843 // server doesn't close the connection. |
| 846 MockRead(ASYNC, ERR_IO_PENDING) | 844 MockRead(ASYNC, ERR_IO_PENDING)}; |
| 847 }; | 845 StaticSocketDataProvider data( |
| 848 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 846 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
| 849 data_writes, arraysize(data_writes)); | |
| 850 mock_socket_factory.AddSocketDataProvider(&data); | 847 mock_socket_factory.AddSocketDataProvider(&data); |
| 851 SSLSocketDataProvider ssl(SYNCHRONOUS, ERR_SSL_PROTOCOL_ERROR); | 848 SSLSocketDataProvider ssl(SYNCHRONOUS, ERR_SSL_PROTOCOL_ERROR); |
| 852 mock_socket_factory.AddSSLSocketDataProvider(&ssl); | 849 mock_socket_factory.AddSSLSocketDataProvider(&ssl); |
| 853 | 850 |
| 854 TestCompletionCallback test_callback; | 851 TestCompletionCallback test_callback; |
| 855 TestURLRequestContextWithProxy context("https://myproxy:70"); | 852 TestURLRequestContextWithProxy context("https://myproxy:70"); |
| 856 | 853 |
| 857 scoped_ptr<SocketStreamEventRecorder> delegate( | 854 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 858 new SocketStreamEventRecorder(test_callback.callback())); | 855 new SocketStreamEventRecorder(test_callback.callback())); |
| 859 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, | 856 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, |
| 860 base::Unretained(delegate.get()))); | 857 base::Unretained(delegate.get()))); |
| 861 | 858 |
| 862 scoped_refptr<SocketStream> socket_stream( | 859 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 863 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 860 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 864 &context, NULL)); | |
| 865 | 861 |
| 866 socket_stream->SetClientSocketFactory(&mock_socket_factory); | 862 socket_stream->SetClientSocketFactory(&mock_socket_factory); |
| 867 | 863 |
| 868 socket_stream->Connect(); | 864 socket_stream->Connect(); |
| 869 | 865 |
| 870 test_callback.WaitForResult(); | 866 test_callback.WaitForResult(); |
| 871 | 867 |
| 872 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 868 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 873 ASSERT_EQ(3U, events.size()); | 869 ASSERT_EQ(3U, events.size()); |
| 874 | 870 |
| 875 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 871 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 876 events[0].event_type); | 872 events[0].event_type); |
| 877 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); | 873 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); |
| 878 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, events[1].error_code); | 874 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, events[1].error_code); |
| 879 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[2].event_type); | 875 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[2].event_type); |
| 880 } | 876 } |
| 881 | 877 |
| 882 // Test a connection though a secure proxy. | 878 // Test a connection though a secure proxy. |
| 883 TEST_F(SocketStreamTest, SecureProxyConnect) { | 879 TEST_F(SocketStreamTest, SecureProxyConnect) { |
| 884 MockClientSocketFactory mock_socket_factory; | 880 MockClientSocketFactory mock_socket_factory; |
| 885 MockWrite data_writes[] = { | 881 MockWrite data_writes[] = {MockWrite( |
| 886 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" | 882 "CONNECT example.com:80 HTTP/1.1\r\n" |
| 887 "Host: example.com\r\n" | 883 "Host: example.com\r\n" |
| 888 "Proxy-Connection: keep-alive\r\n\r\n") | 884 "Proxy-Connection: keep-alive\r\n\r\n")}; |
| 889 }; | |
| 890 MockRead data_reads[] = { | 885 MockRead data_reads[] = { |
| 891 MockRead("HTTP/1.1 200 Connection Established\r\n"), | 886 MockRead("HTTP/1.1 200 Connection Established\r\n"), |
| 892 MockRead("Proxy-agent: Apache/2.2.8\r\n"), | 887 MockRead("Proxy-agent: Apache/2.2.8\r\n"), MockRead("\r\n"), |
| 893 MockRead("\r\n"), | 888 // SocketStream::DoClose is run asynchronously. Socket can be read after |
| 894 // SocketStream::DoClose is run asynchronously. Socket can be read after | 889 // "\r\n". We have to give ERR_IO_PENDING to SocketStream then to |
| 895 // "\r\n". We have to give ERR_IO_PENDING to SocketStream then to indicate | 890 // indicate |
| 896 // server doesn't close the connection. | 891 // server doesn't close the connection. |
| 897 MockRead(ASYNC, ERR_IO_PENDING) | 892 MockRead(ASYNC, ERR_IO_PENDING)}; |
| 898 }; | 893 StaticSocketDataProvider data( |
| 899 StaticSocketDataProvider data(data_reads, arraysize(data_reads), | 894 data_reads, arraysize(data_reads), data_writes, arraysize(data_writes)); |
| 900 data_writes, arraysize(data_writes)); | |
| 901 mock_socket_factory.AddSocketDataProvider(&data); | 895 mock_socket_factory.AddSocketDataProvider(&data); |
| 902 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 896 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| 903 mock_socket_factory.AddSSLSocketDataProvider(&ssl); | 897 mock_socket_factory.AddSSLSocketDataProvider(&ssl); |
| 904 | 898 |
| 905 TestCompletionCallback test_callback; | 899 TestCompletionCallback test_callback; |
| 906 TestURLRequestContextWithProxy context("https://myproxy:70"); | 900 TestURLRequestContextWithProxy context("https://myproxy:70"); |
| 907 | 901 |
| 908 scoped_ptr<SocketStreamEventRecorder> delegate( | 902 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 909 new SocketStreamEventRecorder(test_callback.callback())); | 903 new SocketStreamEventRecorder(test_callback.callback())); |
| 910 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, | 904 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, |
| 911 base::Unretained(delegate.get()))); | 905 base::Unretained(delegate.get()))); |
| 912 | 906 |
| 913 scoped_refptr<SocketStream> socket_stream( | 907 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 914 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 908 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 915 &context, NULL)); | |
| 916 | 909 |
| 917 socket_stream->SetClientSocketFactory(&mock_socket_factory); | 910 socket_stream->SetClientSocketFactory(&mock_socket_factory); |
| 918 | 911 |
| 919 socket_stream->Connect(); | 912 socket_stream->Connect(); |
| 920 | 913 |
| 921 test_callback.WaitForResult(); | 914 test_callback.WaitForResult(); |
| 922 | 915 |
| 923 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 916 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 924 ASSERT_EQ(4U, events.size()); | 917 ASSERT_EQ(4U, events.size()); |
| 925 | 918 |
| 926 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 919 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 927 events[0].event_type); | 920 events[0].event_type); |
| 928 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 921 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
| 929 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[2].event_type); | 922 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[2].event_type); |
| 930 EXPECT_EQ(ERR_ABORTED, events[2].error_code); | 923 EXPECT_EQ(ERR_ABORTED, events[2].error_code); |
| 931 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); | 924 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); |
| 932 } | 925 } |
| 933 | 926 |
| 934 TEST_F(SocketStreamTest, BeforeConnectFailed) { | 927 TEST_F(SocketStreamTest, BeforeConnectFailed) { |
| 935 TestCompletionCallback test_callback; | 928 TestCompletionCallback test_callback; |
| 936 | 929 |
| 937 scoped_ptr<SocketStreamEventRecorder> delegate( | 930 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 938 new SocketStreamEventRecorder(test_callback.callback())); | 931 new SocketStreamEventRecorder(test_callback.callback())); |
| 939 | 932 |
| 940 TestURLRequestContext context; | 933 TestURLRequestContext context; |
| 941 TestSocketStreamNetworkDelegate network_delegate; | 934 TestSocketStreamNetworkDelegate network_delegate; |
| 942 network_delegate.SetBeforeConnectResult(ERR_ACCESS_DENIED); | 935 network_delegate.SetBeforeConnectResult(ERR_ACCESS_DENIED); |
| 943 context.set_network_delegate(&network_delegate); | 936 context.set_network_delegate(&network_delegate); |
| 944 | 937 |
| 945 scoped_refptr<SocketStream> socket_stream( | 938 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 946 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 939 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 947 &context, NULL)); | |
| 948 | 940 |
| 949 socket_stream->Connect(); | 941 socket_stream->Connect(); |
| 950 | 942 |
| 951 test_callback.WaitForResult(); | 943 test_callback.WaitForResult(); |
| 952 | 944 |
| 953 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 945 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 954 ASSERT_EQ(2U, events.size()); | 946 ASSERT_EQ(2U, events.size()); |
| 955 | 947 |
| 956 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[0].event_type); | 948 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[0].event_type); |
| 957 EXPECT_EQ(ERR_ACCESS_DENIED, events[0].error_code); | 949 EXPECT_EQ(ERR_ACCESS_DENIED, events[0].error_code); |
| 958 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[1].event_type); | 950 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[1].event_type); |
| 959 } | 951 } |
| 960 | 952 |
| 961 // Check that a connect failure, followed by the delegate calling DetachDelegate | 953 // Check that a connect failure, followed by the delegate calling DetachDelegate |
| 962 // and deleting itself in the OnError callback, is handled correctly. | 954 // and deleting itself in the OnError callback, is handled correctly. |
| 963 TEST_F(SocketStreamTest, OnErrorDetachDelegate) { | 955 TEST_F(SocketStreamTest, OnErrorDetachDelegate) { |
| 964 MockClientSocketFactory mock_socket_factory; | 956 MockClientSocketFactory mock_socket_factory; |
| 965 TestCompletionCallback test_callback; | 957 TestCompletionCallback test_callback; |
| 966 | 958 |
| 967 // SelfDeletingDelegate is self-owning; we just need a pointer to it to | 959 // SelfDeletingDelegate is self-owning; we just need a pointer to it to |
| 968 // connect it and the SocketStream. | 960 // connect it and the SocketStream. |
| 969 SelfDeletingDelegate* delegate = | 961 SelfDeletingDelegate* delegate = |
| 970 new SelfDeletingDelegate(test_callback.callback()); | 962 new SelfDeletingDelegate(test_callback.callback()); |
| 971 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); | 963 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
| 972 StaticSocketDataProvider data; | 964 StaticSocketDataProvider data; |
| 973 data.set_connect_data(mock_connect); | 965 data.set_connect_data(mock_connect); |
| 974 mock_socket_factory.AddSocketDataProvider(&data); | 966 mock_socket_factory.AddSocketDataProvider(&data); |
| 975 | 967 |
| 976 TestURLRequestContext context; | 968 TestURLRequestContext context; |
| 977 scoped_refptr<SocketStream> socket_stream( | 969 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 978 new SocketStream(GURL("ws://localhost:9998/echo"), delegate, | 970 GURL("ws://localhost:9998/echo"), delegate, &context, NULL)); |
| 979 &context, NULL)); | |
| 980 socket_stream->SetClientSocketFactory(&mock_socket_factory); | 971 socket_stream->SetClientSocketFactory(&mock_socket_factory); |
| 981 delegate->set_socket_stream(socket_stream); | 972 delegate->set_socket_stream(socket_stream); |
| 982 // The delegate pointer will become invalid during the test. Set it to NULL to | 973 // The delegate pointer will become invalid during the test. Set it to NULL to |
| 983 // avoid holding a dangling pointer. | 974 // avoid holding a dangling pointer. |
| 984 delegate = NULL; | 975 delegate = NULL; |
| 985 | 976 |
| 986 socket_stream->Connect(); | 977 socket_stream->Connect(); |
| 987 | 978 |
| 988 EXPECT_EQ(OK, test_callback.WaitForResult()); | 979 EXPECT_EQ(OK, test_callback.WaitForResult()); |
| 989 } | 980 } |
| 990 | 981 |
| 991 TEST_F(SocketStreamTest, NullContextSocketStreamShouldNotCrash) { | 982 TEST_F(SocketStreamTest, NullContextSocketStreamShouldNotCrash) { |
| 992 TestCompletionCallback test_callback; | 983 TestCompletionCallback test_callback; |
| 993 | 984 |
| 994 scoped_ptr<SocketStreamEventRecorder> delegate( | 985 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 995 new SocketStreamEventRecorder(test_callback.callback())); | 986 new SocketStreamEventRecorder(test_callback.callback())); |
| 996 TestURLRequestContext context; | 987 TestURLRequestContext context; |
| 997 scoped_refptr<SocketStream> socket_stream( | 988 scoped_refptr<SocketStream> socket_stream(new SocketStream( |
| 998 new SocketStream(GURL("ws://example.com/demo"), delegate.get(), | 989 GURL("ws://example.com/demo"), delegate.get(), &context, NULL)); |
| 999 &context, NULL)); | 990 delegate->SetOnStartOpenConnection( |
| 1000 delegate->SetOnStartOpenConnection(base::Bind( | 991 base::Bind(&SocketStreamTest::DoIOPending, base::Unretained(this))); |
| 1001 &SocketStreamTest::DoIOPending, base::Unretained(this))); | |
| 1002 delegate->SetOnConnected(base::Bind( | 992 delegate->SetOnConnected(base::Bind( |
| 1003 &SocketStreamTest::DoSendWebSocketHandshake, base::Unretained(this))); | 993 &SocketStreamTest::DoSendWebSocketHandshake, base::Unretained(this))); |
| 1004 delegate->SetOnReceivedData(base::Bind( | 994 delegate->SetOnReceivedData(base::Bind( |
| 1005 &SocketStreamTest::DoCloseFlushPendingWriteTestWithSetContextNull, | 995 &SocketStreamTest::DoCloseFlushPendingWriteTestWithSetContextNull, |
| 1006 base::Unretained(this))); | 996 base::Unretained(this))); |
| 1007 | 997 |
| 1008 MockWrite data_writes[] = { | 998 MockWrite data_writes[] = { |
| 1009 MockWrite(SocketStreamTest::kWebSocketHandshakeRequest), | 999 MockWrite(SocketStreamTest::kWebSocketHandshakeRequest), |
| 1010 }; | 1000 }; |
| 1011 MockRead data_reads[] = { | 1001 MockRead data_reads[] = { |
| 1012 MockRead(SocketStreamTest::kWebSocketHandshakeResponse), | 1002 MockRead(SocketStreamTest::kWebSocketHandshakeResponse), |
| 1013 }; | 1003 }; |
| 1014 AddWebSocketMessage("message1"); | 1004 AddWebSocketMessage("message1"); |
| 1015 AddWebSocketMessage("message2"); | 1005 AddWebSocketMessage("message2"); |
| 1016 | 1006 |
| 1017 DelayedSocketData data_provider( | 1007 DelayedSocketData data_provider(1, |
| 1018 1, data_reads, arraysize(data_reads), | 1008 data_reads, |
| 1019 data_writes, arraysize(data_writes)); | 1009 arraysize(data_reads), |
| 1010 data_writes, |
| 1011 arraysize(data_writes)); |
| 1020 | 1012 |
| 1021 MockClientSocketFactory* mock_socket_factory = GetMockClientSocketFactory(); | 1013 MockClientSocketFactory* mock_socket_factory = GetMockClientSocketFactory(); |
| 1022 mock_socket_factory->AddSocketDataProvider(&data_provider); | 1014 mock_socket_factory->AddSocketDataProvider(&data_provider); |
| 1023 socket_stream->SetClientSocketFactory(mock_socket_factory); | 1015 socket_stream->SetClientSocketFactory(mock_socket_factory); |
| 1024 | 1016 |
| 1025 socket_stream->Connect(); | 1017 socket_stream->Connect(); |
| 1026 io_test_callback_.WaitForResult(); | 1018 io_test_callback_.WaitForResult(); |
| 1027 delegate->CompleteConnection(OK); | 1019 delegate->CompleteConnection(OK); |
| 1028 EXPECT_EQ(OK, test_callback.WaitForResult()); | 1020 EXPECT_EQ(OK, test_callback.WaitForResult()); |
| 1029 | 1021 |
| 1030 EXPECT_TRUE(data_provider.at_read_eof()); | 1022 EXPECT_TRUE(data_provider.at_read_eof()); |
| 1031 EXPECT_TRUE(data_provider.at_write_eof()); | 1023 EXPECT_TRUE(data_provider.at_write_eof()); |
| 1032 | 1024 |
| 1033 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 1025 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 1034 ASSERT_EQ(5U, events.size()); | 1026 ASSERT_EQ(5U, events.size()); |
| 1035 | 1027 |
| 1036 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 1028 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 1037 events[0].event_type); | 1029 events[0].event_type); |
| 1038 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 1030 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
| 1039 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[2].event_type); | 1031 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[2].event_type); |
| 1040 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[3].event_type); | 1032 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[3].event_type); |
| 1041 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[4].event_type); | 1033 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[4].event_type); |
| 1042 } | 1034 } |
| 1043 | 1035 |
| 1044 } // namespace net | 1036 } // namespace net |
| OLD | NEW |