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 |