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/spdy/spdy_websocket_stream.h" | 5 #include "net/spdy/spdy_websocket_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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 virtual ~SpdyWebSocketStreamEventRecorder() {} | 56 virtual ~SpdyWebSocketStreamEventRecorder() {} |
57 | 57 |
58 typedef base::Callback<void(SpdyWebSocketStreamEvent*)> StreamEventCallback; | 58 typedef base::Callback<void(SpdyWebSocketStreamEvent*)> StreamEventCallback; |
59 | 59 |
60 void SetOnCreated(const StreamEventCallback& callback) { | 60 void SetOnCreated(const StreamEventCallback& callback) { |
61 on_created_ = callback; | 61 on_created_ = callback; |
62 } | 62 } |
63 void SetOnSentHeaders(const StreamEventCallback& callback) { | 63 void SetOnSentHeaders(const StreamEventCallback& callback) { |
64 on_sent_headers_ = callback; | 64 on_sent_headers_ = callback; |
65 } | 65 } |
66 void SetOnReceivedHeader( | 66 void SetOnReceivedHeader(const StreamEventCallback& callback) { |
67 const StreamEventCallback& callback) { | |
68 on_received_header_ = callback; | 67 on_received_header_ = callback; |
69 } | 68 } |
70 void SetOnSentData(const StreamEventCallback& callback) { | 69 void SetOnSentData(const StreamEventCallback& callback) { |
71 on_sent_data_ = callback; | 70 on_sent_data_ = callback; |
72 } | 71 } |
73 void SetOnReceivedData( | 72 void SetOnReceivedData(const StreamEventCallback& callback) { |
74 const StreamEventCallback& callback) { | |
75 on_received_data_ = callback; | 73 on_received_data_ = callback; |
76 } | 74 } |
77 void SetOnClose(const StreamEventCallback& callback) { | 75 void SetOnClose(const StreamEventCallback& callback) { |
78 on_close_ = callback; | 76 on_close_ = callback; |
79 } | 77 } |
80 | 78 |
81 virtual void OnCreatedSpdyStream(int result) { | 79 virtual void OnCreatedSpdyStream(int result) { |
82 events_.push_back( | 80 events_.push_back( |
83 SpdyWebSocketStreamEvent(SpdyWebSocketStreamEvent::EVENT_CREATED, | 81 SpdyWebSocketStreamEvent(SpdyWebSocketStreamEvent::EVENT_CREATED, |
84 SpdyHeaderBlock(), | 82 SpdyHeaderBlock(), |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 SETTINGS_FLAG_PERSISTED, spdy_settings_value_to_set_); | 201 SETTINGS_FLAG_PERSISTED, spdy_settings_value_to_set_); |
204 } | 202 } |
205 | 203 |
206 virtual void TearDown() { | 204 virtual void TearDown() { |
207 MessageLoop::current()->RunAllPending(); | 205 MessageLoop::current()->RunAllPending(); |
208 } | 206 } |
209 | 207 |
210 void Prepare(SpdyStreamId stream_id) { | 208 void Prepare(SpdyStreamId stream_id) { |
211 stream_id_ = stream_id; | 209 stream_id_ = stream_id; |
212 | 210 |
213 const char* const request_headers[] = { | 211 request_frame_.reset(ConstructSpdyWebSocketSynStream( |
214 "url", "ws://example.com/echo", | 212 stream_id_, |
215 "origin", "http://example.com/wsdemo", | 213 "/echo", |
216 }; | 214 "example.com", |
| 215 "http://example.com/wsdemo")); |
217 | 216 |
218 int request_header_count = arraysize(request_headers) / 2; | 217 response_frame_.reset(ConstructSpdyWebSocketSynReply(stream_id_)); |
219 | |
220 const char* const response_headers[] = { | |
221 "sec-websocket-location", "ws://example.com/echo", | |
222 "sec-websocket-origin", "http://example.com/wsdemo", | |
223 }; | |
224 | |
225 int response_header_count = arraysize(response_headers) / 2; | |
226 | |
227 request_frame_.reset(ConstructSpdyWebSocketHandshakeRequestFrame( | |
228 request_headers, | |
229 request_header_count, | |
230 stream_id_, | |
231 HIGHEST)); | |
232 response_frame_.reset(ConstructSpdyWebSocketHandshakeResponseFrame( | |
233 response_headers, | |
234 response_header_count, | |
235 stream_id_, | |
236 HIGHEST)); | |
237 | 218 |
238 message_frame_.reset(ConstructSpdyWebSocketDataFrame( | 219 message_frame_.reset(ConstructSpdyWebSocketDataFrame( |
239 kMessageFrame, | 220 kMessageFrame, |
240 kMessageFrameLength, | 221 kMessageFrameLength, |
241 stream_id_, | 222 stream_id_, |
242 false)); | 223 false)); |
243 | 224 |
244 closing_frame_.reset(ConstructSpdyWebSocketDataFrame( | 225 closing_frame_.reset(ConstructSpdyWebSocketDataFrame( |
245 kClosingFrame, | 226 kClosingFrame, |
246 kClosingFrameLength, | 227 kClosingFrameLength, |
247 stream_id_, | 228 stream_id_, |
248 false)); | 229 false)); |
249 } | 230 } |
| 231 |
250 int InitSession(MockRead* reads, size_t reads_count, | 232 int InitSession(MockRead* reads, size_t reads_count, |
251 MockWrite* writes, size_t writes_count, | 233 MockWrite* writes, size_t writes_count, |
252 bool throttling) { | 234 bool throttling) { |
253 data_.reset(new OrderedSocketData(reads, reads_count, | 235 data_.reset(new OrderedSocketData(reads, reads_count, |
254 writes, writes_count)); | 236 writes, writes_count)); |
255 session_deps_.socket_factory->AddSocketDataProvider(data_.get()); | 237 session_deps_.socket_factory->AddSocketDataProvider(data_.get()); |
256 http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 238 http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
257 SpdySessionPool* spdy_session_pool(http_session_->spdy_session_pool()); | 239 SpdySessionPool* spdy_session_pool(http_session_->spdy_session_pool()); |
258 | 240 |
259 if (throttling) { | 241 if (throttling) { |
(...skipping 15 matching lines...) Expand all Loading... |
275 scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle); | 257 scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle); |
276 EXPECT_EQ(ERR_IO_PENDING, | 258 EXPECT_EQ(ERR_IO_PENDING, |
277 connection->Init(host_port_pair_.ToString(), transport_params_, | 259 connection->Init(host_port_pair_.ToString(), transport_params_, |
278 MEDIUM, callback.callback(), | 260 MEDIUM, callback.callback(), |
279 http_session_->GetTransportSocketPool( | 261 http_session_->GetTransportSocketPool( |
280 HttpNetworkSession::NORMAL_SOCKET_POOL), | 262 HttpNetworkSession::NORMAL_SOCKET_POOL), |
281 BoundNetLog())); | 263 BoundNetLog())); |
282 EXPECT_EQ(OK, callback.WaitForResult()); | 264 EXPECT_EQ(OK, callback.WaitForResult()); |
283 return session_->InitializeWithSocket(connection.release(), false, OK); | 265 return session_->InitializeWithSocket(connection.release(), false, OK); |
284 } | 266 } |
| 267 |
285 void SendRequest() { | 268 void SendRequest() { |
286 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 269 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); |
287 (*headers)["url"] = "ws://example.com/echo"; | 270 (*headers)[":path"] = "/echo"; |
288 (*headers)["origin"] = "http://example.com/wsdemo"; | 271 (*headers)[":host"] = "example.com"; |
| 272 (*headers)[":version"] = "WebSocket/13"; |
| 273 (*headers)[":scheme"] = "ws"; |
| 274 (*headers)[":origin"] = "http://example.com/wsdemo"; |
289 | 275 |
290 websocket_stream_->SendRequest(headers.Pass()); | 276 websocket_stream_->SendRequest(headers.Pass()); |
291 } | 277 } |
292 | 278 |
293 SpdySettingsIds spdy_settings_id_to_set_; | 279 SpdySettingsIds spdy_settings_id_to_set_; |
294 SpdySettingsFlags spdy_settings_flags_to_set_; | 280 SpdySettingsFlags spdy_settings_flags_to_set_; |
295 uint32 spdy_settings_value_to_set_; | 281 uint32 spdy_settings_value_to_set_; |
296 SettingsMap spdy_settings_to_send_; | 282 SettingsMap spdy_settings_to_send_; |
297 SpdySessionDependencies session_deps_; | 283 SpdySessionDependencies session_deps_; |
298 scoped_ptr<OrderedSocketData> data_; | 284 scoped_ptr<OrderedSocketData> data_; |
(...skipping 14 matching lines...) Expand all Loading... |
313 | 299 |
314 static const char kMessageFrame[]; | 300 static const char kMessageFrame[]; |
315 static const char kClosingFrame[]; | 301 static const char kClosingFrame[]; |
316 static const size_t kMessageFrameLength; | 302 static const size_t kMessageFrameLength; |
317 static const size_t kClosingFrameLength; | 303 static const size_t kClosingFrameLength; |
318 | 304 |
319 private: | 305 private: |
320 SpdyTestStateHelper spdy_state_; | 306 SpdyTestStateHelper spdy_state_; |
321 }; | 307 }; |
322 | 308 |
323 const char SpdyWebSocketStreamSpdy3Test::kMessageFrame[] = "\0hello\xff"; | 309 // TODO(toyoshim): Replace old framing data to new one, then use HEADERS and |
324 const char SpdyWebSocketStreamSpdy3Test::kClosingFrame[] = "\xff\0"; | 310 // data frames. |
| 311 const char SpdyWebSocketStreamSpdy3Test::kMessageFrame[] = "\x81\x05hello"; |
| 312 const char SpdyWebSocketStreamSpdy3Test::kClosingFrame[] = "\x88\0"; |
325 const size_t SpdyWebSocketStreamSpdy3Test::kMessageFrameLength = | 313 const size_t SpdyWebSocketStreamSpdy3Test::kMessageFrameLength = |
326 arraysize(SpdyWebSocketStreamSpdy3Test::kMessageFrame) - 1; | 314 arraysize(SpdyWebSocketStreamSpdy3Test::kMessageFrame) - 1; |
327 const size_t SpdyWebSocketStreamSpdy3Test::kClosingFrameLength = | 315 const size_t SpdyWebSocketStreamSpdy3Test::kClosingFrameLength = |
328 arraysize(SpdyWebSocketStreamSpdy3Test::kClosingFrame) - 1; | 316 arraysize(SpdyWebSocketStreamSpdy3Test::kClosingFrame) - 1; |
329 | 317 |
330 TEST_F(SpdyWebSocketStreamSpdy3Test, Basic) { | 318 TEST_F(SpdyWebSocketStreamSpdy3Test, Basic) { |
331 Prepare(1); | 319 Prepare(1); |
332 MockWrite writes[] = { | 320 MockWrite writes[] = { |
333 CreateMockWrite(*request_frame_.get(), 1), | 321 CreateMockWrite(*request_frame_.get(), 1), |
334 CreateMockWrite(*message_frame_.get(), 3), | 322 CreateMockWrite(*message_frame_.get(), 3), |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
623 EXPECT_EQ(OK, events[7].result); | 611 EXPECT_EQ(OK, events[7].result); |
624 | 612 |
625 // EOF close SPDY session. | 613 // EOF close SPDY session. |
626 EXPECT_TRUE(!http_session_->spdy_session_pool()->HasSession( | 614 EXPECT_TRUE(!http_session_->spdy_session_pool()->HasSession( |
627 host_port_proxy_pair_)); | 615 host_port_proxy_pair_)); |
628 EXPECT_TRUE(data()->at_read_eof()); | 616 EXPECT_TRUE(data()->at_read_eof()); |
629 EXPECT_TRUE(data()->at_write_eof()); | 617 EXPECT_TRUE(data()->at_write_eof()); |
630 } | 618 } |
631 | 619 |
632 } // namespace net | 620 } // namespace net |
OLD | NEW |