Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(194)

Unified Diff: net/spdy/spdy_stream_spdy3_unittest.cc

Issue 10810069: SPDY: Add WriteHeaders interface to SpdySession and SpdyStream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: spdy3 Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());

Powered by Google App Engine
This is Rietveld 408576698