Index: net/spdy/spdy_stream_spdy3_unittest.cc |
diff --git a/net/spdy/spdy_stream_spdy3_unittest.cc b/net/spdy/spdy_stream_spdy3_unittest.cc |
index 58d93e9cce6954243c871fd20a79883007704672..3a3ad6620e134a215d4d7099ef19ee5b0adf222c 100644 |
--- a/net/spdy/spdy_stream_spdy3_unittest.cc |
+++ b/net/spdy/spdy_stream_spdy3_unittest.cc |
@@ -146,7 +146,8 @@ TEST_F(SpdyStreamSpdy3Test, SendDataAfterOpen) { |
TestCompletionCallback callback; |
scoped_ptr<TestSpdyStreamDelegate> delegate( |
- new TestSpdyStreamDelegate(stream.get(), buf.get(), callback.callback())); |
+ new TestSpdyStreamDelegate( |
+ stream.get(), NULL, buf.get(), callback.callback())); |
stream->SetDelegate(delegate.get()); |
EXPECT_FALSE(stream->HasUrl()); |
@@ -173,6 +174,105 @@ TEST_F(SpdyStreamSpdy3Test, SendDataAfterOpen) { |
EXPECT_TRUE(delegate->closed()); |
} |
+TEST_F(SpdyStreamSpdy3Test, SendHeaderAndDataAfterOpen) { |
+ SpdySessionDependencies session_deps; |
+ |
+ session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps); |
+ SpdySessionPoolPeer pool_peer_(session_->spdy_session_pool()); |
+ |
+ scoped_ptr<SpdyFrame> expected_request(ConstructSpdyWebSocket( |
+ 1, |
+ "/chat", |
+ "server.example.com", |
+ "http://example.com")); |
+ scoped_ptr<SpdyFrame> expected_headers(ConstructSpdyWebSocketHeadersFrame( |
+ 1, "6", true)); |
+ scoped_ptr<SpdyFrame> expected_message(ConstructSpdyBodyFrame("hello!", 6)); |
+ MockWrite writes[] = { |
+ CreateMockWrite(*expected_request), |
+ CreateMockWrite(*expected_headers), |
+ CreateMockWrite(*expected_message) |
+ }; |
+ writes[0].sequence_number = 0; |
+ writes[1].sequence_number = 2; |
+ writes[1].sequence_number = 3; |
+ |
+ scoped_ptr<SpdyFrame> response( |
+ ConstructSpdyWebSocketSynReply(1)); |
+ MockRead reads[] = { |
+ CreateMockRead(*response), |
+ MockRead(ASYNC, 0, 0), // EOF |
+ }; |
+ reads[0].sequence_number = 1; |
+ reads[1].sequence_number = 4; |
+ |
+ OrderedSocketData data(reads, arraysize(reads), |
+ writes, arraysize(writes)); |
+ MockConnect connect_data(SYNCHRONOUS, OK); |
+ data.set_connect_data(connect_data); |
+ |
+ session_deps.socket_factory->AddSocketDataProvider(&data); |
+ |
+ scoped_refptr<SpdySession> session(CreateSpdySession()); |
+ const char* kStreamUrl = "ws://server.example.com/chat"; |
+ GURL url(kStreamUrl); |
+ |
+ HostPortPair host_port_pair("server.example.com", 80); |
+ scoped_refptr<TransportSocketParams> transport_params( |
+ new TransportSocketParams(host_port_pair, LOWEST, false, false, |
+ OnHostResolutionCallback())); |
+ |
+ scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle); |
+ EXPECT_EQ(OK, connection->Init(host_port_pair.ToString(), transport_params, |
+ LOWEST, CompletionCallback(), |
+ session_->GetTransportSocketPool( |
+ HttpNetworkSession::NORMAL_SOCKET_POOL), |
+ BoundNetLog())); |
+ session->InitializeWithSocket(connection.release(), false, OK); |
+ |
+ scoped_refptr<SpdyStream> stream; |
+ ASSERT_EQ( |
+ OK, |
+ session->CreateStream(url, LOWEST, &stream, BoundNetLog(), |
+ CompletionCallback())); |
+ scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(6)); |
+ memcpy(buf->data(), "hello!", 6); |
+ TestCompletionCallback callback; |
+ scoped_ptr<SpdyHeaderBlock> message_headers(new SpdyHeaderBlock); |
+ (*message_headers)[":opcode"] = "1"; |
+ (*message_headers)[":length"] = "6"; |
+ (*message_headers)[":fin"] = "1"; |
+ |
+ scoped_ptr<TestSpdyStreamDelegate> delegate( |
+ new TestSpdyStreamDelegate(stream.get(), |
+ message_headers.release(), |
+ buf.get(), |
+ callback.callback())); |
+ stream->SetDelegate(delegate.get()); |
+ |
+ EXPECT_FALSE(stream->HasUrl()); |
+ |
+ scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); |
+ (*headers)[":path"] = url.path(); |
+ (*headers)[":host"] = url.host(); |
+ (*headers)[":version"] = "WebSocket/13"; |
+ (*headers)[":scheme"] = url.scheme(); |
+ (*headers)[":origin"] = "http://example.com"; |
+ stream->set_spdy_headers(headers.Pass()); |
+ EXPECT_TRUE(stream->HasUrl()); |
+ |
+ EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
+ |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ |
+ EXPECT_TRUE(delegate->send_headers_completed()); |
+ EXPECT_EQ("101", (*delegate->response())[":status"]); |
+ EXPECT_EQ(std::string(), delegate->received_data()); |
+ // TODO(toyoshim): OnDataSent should be invoked when each data frame is sent. |
+ // But current implementation invokes also when each HEADERS frame is sent. |
+ //EXPECT_EQ(6, delegate->data_sent()); |
+} |
+ |
TEST_F(SpdyStreamSpdy3Test, PushedStream) { |
const char kStreamUrl[] = "http://www.google.com/"; |
@@ -324,7 +424,8 @@ TEST_F(SpdyStreamSpdy3Test, StreamError) { |
TestCompletionCallback callback; |
scoped_ptr<TestSpdyStreamDelegate> delegate( |
- new TestSpdyStreamDelegate(stream.get(), buf.get(), callback.callback())); |
+ new TestSpdyStreamDelegate( |
+ stream.get(), NULL, buf.get(), callback.callback())); |
stream->SetDelegate(delegate.get()); |
EXPECT_FALSE(stream->HasUrl()); |