| 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());
|
|
|