Index: net/spdy/spdy_stream_unittest.cc |
=================================================================== |
--- net/spdy/spdy_stream_unittest.cc (revision 124866) |
+++ net/spdy/spdy_stream_unittest.cc (working copy) |
@@ -1,405 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/memory/ref_counted.h" |
-#include "net/base/completion_callback.h" |
-#include "net/base/net_log_unittest.h" |
-#include "net/spdy/spdy_stream.h" |
-#include "net/spdy/spdy_http_utils.h" |
-#include "net/spdy/spdy_session.h" |
-#include "net/spdy/spdy_test_util.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-// TODO(ukai): factor out common part with spdy_http_stream_unittest.cc |
-// |
-namespace net { |
- |
-namespace { |
- |
-class TestSpdyStreamDelegate : public SpdyStream::Delegate { |
- public: |
- TestSpdyStreamDelegate(SpdyStream* stream, |
- IOBufferWithSize* buf, |
- const CompletionCallback& callback) |
- : stream_(stream), |
- buf_(buf), |
- callback_(callback), |
- send_headers_completed_(false), |
- response_(new spdy::SpdyHeaderBlock), |
- data_sent_(0), |
- closed_(false) {} |
- virtual ~TestSpdyStreamDelegate() {} |
- |
- virtual bool OnSendHeadersComplete(int status) { |
- send_headers_completed_ = true; |
- return true; |
- } |
- virtual int OnSendBody() { |
- ADD_FAILURE() << "OnSendBody should not be called"; |
- return ERR_UNEXPECTED; |
- } |
- virtual int OnSendBodyComplete(int /*status*/, bool* /*eof*/) { |
- ADD_FAILURE() << "OnSendBodyComplete should not be called"; |
- return ERR_UNEXPECTED; |
- } |
- |
- virtual int OnResponseReceived(const spdy::SpdyHeaderBlock& response, |
- base::Time response_time, |
- int status) { |
- EXPECT_TRUE(send_headers_completed_); |
- *response_ = response; |
- if (buf_) { |
- EXPECT_EQ(ERR_IO_PENDING, |
- stream_->WriteStreamData(buf_.get(), buf_->size(), |
- spdy::DATA_FLAG_NONE)); |
- } |
- return status; |
- } |
- virtual void OnDataReceived(const char* buffer, int bytes) { |
- received_data_ += std::string(buffer, bytes); |
- } |
- virtual void OnDataSent(int length) { |
- data_sent_ += length; |
- } |
- virtual void OnClose(int status) { |
- closed_ = true; |
- CompletionCallback callback = callback_; |
- callback_.Reset(); |
- callback.Run(OK); |
- } |
- virtual void set_chunk_callback(net::ChunkCallback *) {} |
- |
- bool send_headers_completed() const { return send_headers_completed_; } |
- const linked_ptr<spdy::SpdyHeaderBlock>& response() const { |
- return response_; |
- } |
- const std::string& received_data() const { return received_data_; } |
- int data_sent() const { return data_sent_; } |
- bool closed() const { return closed_; } |
- |
- private: |
- SpdyStream* stream_; |
- scoped_refptr<IOBufferWithSize> buf_; |
- CompletionCallback callback_; |
- bool send_headers_completed_; |
- linked_ptr<spdy::SpdyHeaderBlock> response_; |
- std::string received_data_; |
- int data_sent_; |
- bool closed_; |
-}; |
- |
-spdy::SpdyFrame* ConstructSpdyBodyFrame(const char* data, int length) { |
- spdy::SpdyFramer framer; |
- return framer.CreateDataFrame(1, data, length, spdy::DATA_FLAG_NONE); |
-} |
- |
-} // anonymous namespace |
- |
-class SpdyStreamTest : public testing::Test { |
- protected: |
- SpdyStreamTest() { |
- } |
- |
- scoped_refptr<SpdySession> CreateSpdySession() { |
- spdy::SpdyFramer::set_enable_compression_default(false); |
- HostPortPair host_port_pair("www.google.com", 80); |
- HostPortProxyPair pair(host_port_pair, ProxyServer::Direct()); |
- scoped_refptr<SpdySession> session( |
- session_->spdy_session_pool()->Get(pair, BoundNetLog())); |
- return session; |
- } |
- |
- virtual void TearDown() { |
- MessageLoop::current()->RunAllPending(); |
- } |
- |
- scoped_refptr<HttpNetworkSession> session_; |
-}; |
- |
-TEST_F(SpdyStreamTest, SendDataAfterOpen) { |
- SpdySessionDependencies session_deps; |
- |
- session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps); |
- SpdySessionPoolPeer pool_peer_(session_->spdy_session_pool()); |
- |
- const SpdyHeaderInfo kSynStartHeader = { |
- spdy::SYN_STREAM, |
- 1, |
- 0, |
- net::ConvertRequestPriorityToSpdyPriority(LOWEST), |
- spdy::CONTROL_FLAG_NONE, |
- false, |
- spdy::INVALID, |
- NULL, |
- 0, |
- spdy::DATA_FLAG_NONE |
- }; |
- static const char* const kGetHeaders[] = { |
- "method", |
- "GET", |
- "scheme", |
- "http", |
- "host", |
- "www.google.com", |
- "path", |
- "/", |
- "version", |
- "HTTP/1.1", |
- }; |
- scoped_ptr<spdy::SpdyFrame> req( |
- ConstructSpdyPacket( |
- kSynStartHeader, NULL, 0, kGetHeaders, arraysize(kGetHeaders) / 2)); |
- scoped_ptr<spdy::SpdyFrame> msg( |
- ConstructSpdyBodyFrame("\0hello!\xff", 8)); |
- MockWrite writes[] = { |
- CreateMockWrite(*req), |
- CreateMockWrite(*msg), |
- }; |
- writes[0].sequence_number = 0; |
- writes[1].sequence_number = 2; |
- |
- scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
- scoped_ptr<spdy::SpdyFrame> echo( |
- ConstructSpdyBodyFrame("\0hello!\xff", 8)); |
- MockRead reads[] = { |
- CreateMockRead(*resp), |
- CreateMockRead(*echo), |
- MockRead(ASYNC, 0, 0), // EOF |
- }; |
- reads[0].sequence_number = 1; |
- reads[1].sequence_number = 3; |
- reads[2].sequence_number = 4; |
- |
- scoped_ptr<OrderedSocketData> data( |
- new OrderedSocketData(reads, arraysize(reads), |
- writes, arraysize(writes))); |
- MockConnect connect_data(SYNCHRONOUS, OK); |
- data->set_connect_data(connect_data); |
- |
- session_deps.socket_factory->AddSocketDataProvider(data.get()); |
- SpdySession::SetSSLMode(false); |
- |
- scoped_refptr<SpdySession> session(CreateSpdySession()); |
- const char* kStreamUrl = "http://www.google.com/"; |
- GURL url(kStreamUrl); |
- |
- HostPortPair host_port_pair("www.google.com", 80); |
- scoped_refptr<TransportSocketParams> transport_params( |
- new TransportSocketParams(host_port_pair, LOWEST, false, false)); |
- |
- scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle); |
- EXPECT_EQ(OK, connection->Init(host_port_pair.ToString(), transport_params, |
- LOWEST, CompletionCallback(), |
- session_->GetTransportSocketPool(), |
- 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(8)); |
- memcpy(buf->data(), "\0hello!\xff", 8); |
- TestCompletionCallback callback; |
- |
- scoped_ptr<TestSpdyStreamDelegate> delegate( |
- new TestSpdyStreamDelegate(stream.get(), buf.get(), callback.callback())); |
- stream->SetDelegate(delegate.get()); |
- |
- EXPECT_FALSE(stream->HasUrl()); |
- |
- linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock); |
- (*headers)["method"] = "GET"; |
- (*headers)["scheme"] = url.scheme(); |
- (*headers)["host"] = url.host(); |
- (*headers)["path"] = url.path(); |
- (*headers)["version"] = "HTTP/1.1"; |
- stream->set_spdy_headers(headers); |
- EXPECT_TRUE(stream->HasUrl()); |
- EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
- |
- EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
- |
- EXPECT_EQ(OK, callback.WaitForResult()); |
- |
- EXPECT_TRUE(delegate->send_headers_completed()); |
- EXPECT_EQ("200", (*delegate->response())["status"]); |
- EXPECT_EQ("HTTP/1.1", (*delegate->response())["version"]); |
- EXPECT_EQ(std::string("\0hello!\xff", 8), delegate->received_data()); |
- EXPECT_EQ(8, delegate->data_sent()); |
- EXPECT_TRUE(delegate->closed()); |
-} |
- |
-TEST_F(SpdyStreamTest, PushedStream) { |
- const char kStreamUrl[] = "http://www.google.com/"; |
- |
- SpdySessionDependencies session_deps; |
- session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps); |
- SpdySessionPoolPeer pool_peer_(session_->spdy_session_pool()); |
- scoped_refptr<SpdySession> spdy_session(CreateSpdySession()); |
- BoundNetLog net_log; |
- |
- // Conjure up a stream. |
- scoped_refptr<SpdyStream> stream = new SpdyStream(spdy_session, |
- 2, |
- true, |
- net_log); |
- EXPECT_FALSE(stream->response_received()); |
- EXPECT_FALSE(stream->HasUrl()); |
- |
- // Set a couple of headers. |
- spdy::SpdyHeaderBlock response; |
- response["url"] = kStreamUrl; |
- stream->OnResponseReceived(response); |
- |
- // Send some basic headers. |
- spdy::SpdyHeaderBlock headers; |
- response["status"] = "200"; |
- response["version"] = "OK"; |
- stream->OnHeaders(headers); |
- |
- stream->set_response_received(); |
- EXPECT_TRUE(stream->response_received()); |
- EXPECT_TRUE(stream->HasUrl()); |
- EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
-} |
- |
-TEST_F(SpdyStreamTest, StreamError) { |
- SpdySessionDependencies session_deps; |
- |
- session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps); |
- SpdySessionPoolPeer pool_peer_(session_->spdy_session_pool()); |
- |
- const SpdyHeaderInfo kSynStartHeader = { |
- spdy::SYN_STREAM, |
- 1, |
- 0, |
- net::ConvertRequestPriorityToSpdyPriority(LOWEST), |
- spdy::CONTROL_FLAG_NONE, |
- false, |
- spdy::INVALID, |
- NULL, |
- 0, |
- spdy::DATA_FLAG_NONE |
- }; |
- static const char* const kGetHeaders[] = { |
- "method", |
- "GET", |
- "scheme", |
- "http", |
- "host", |
- "www.google.com", |
- "path", |
- "/", |
- "version", |
- "HTTP/1.1", |
- }; |
- scoped_ptr<spdy::SpdyFrame> req( |
- ConstructSpdyPacket( |
- kSynStartHeader, NULL, 0, kGetHeaders, arraysize(kGetHeaders) / 2)); |
- scoped_ptr<spdy::SpdyFrame> msg( |
- ConstructSpdyBodyFrame("\0hello!\xff", 8)); |
- MockWrite writes[] = { |
- CreateMockWrite(*req), |
- CreateMockWrite(*msg), |
- }; |
- writes[0].sequence_number = 0; |
- writes[1].sequence_number = 2; |
- |
- scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
- scoped_ptr<spdy::SpdyFrame> echo( |
- ConstructSpdyBodyFrame("\0hello!\xff", 8)); |
- MockRead reads[] = { |
- CreateMockRead(*resp), |
- CreateMockRead(*echo), |
- MockRead(ASYNC, 0, 0), // EOF |
- }; |
- reads[0].sequence_number = 1; |
- reads[1].sequence_number = 3; |
- reads[2].sequence_number = 4; |
- |
- net::CapturingBoundNetLog log(net::CapturingNetLog::kUnbounded); |
- |
- scoped_ptr<OrderedSocketData> data( |
- new OrderedSocketData(reads, arraysize(reads), |
- writes, arraysize(writes))); |
- MockConnect connect_data(SYNCHRONOUS, OK); |
- data->set_connect_data(connect_data); |
- |
- session_deps.socket_factory->AddSocketDataProvider(data.get()); |
- SpdySession::SetSSLMode(false); |
- |
- scoped_refptr<SpdySession> session(CreateSpdySession()); |
- const char* kStreamUrl = "http://www.google.com/"; |
- GURL url(kStreamUrl); |
- |
- HostPortPair host_port_pair("www.google.com", 80); |
- scoped_refptr<TransportSocketParams> transport_params( |
- new TransportSocketParams(host_port_pair, LOWEST, false, false)); |
- |
- scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle); |
- EXPECT_EQ(OK, connection->Init(host_port_pair.ToString(), transport_params, |
- LOWEST, CompletionCallback(), |
- session_->GetTransportSocketPool(), |
- log.bound())); |
- session->InitializeWithSocket(connection.release(), false, OK); |
- |
- scoped_refptr<SpdyStream> stream; |
- ASSERT_EQ( |
- OK, |
- session->CreateStream(url, LOWEST, &stream, log.bound(), |
- CompletionCallback())); |
- scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(8)); |
- memcpy(buf->data(), "\0hello!\xff", 8); |
- TestCompletionCallback callback; |
- |
- scoped_ptr<TestSpdyStreamDelegate> delegate( |
- new TestSpdyStreamDelegate(stream.get(), buf.get(), callback.callback())); |
- stream->SetDelegate(delegate.get()); |
- |
- EXPECT_FALSE(stream->HasUrl()); |
- |
- linked_ptr<spdy::SpdyHeaderBlock> headers(new spdy::SpdyHeaderBlock); |
- (*headers)["method"] = "GET"; |
- (*headers)["scheme"] = url.scheme(); |
- (*headers)["host"] = url.host(); |
- (*headers)["path"] = url.path(); |
- (*headers)["version"] = "HTTP/1.1"; |
- stream->set_spdy_headers(headers); |
- EXPECT_TRUE(stream->HasUrl()); |
- EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
- |
- EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
- |
- const spdy::SpdyStreamId stream_id = stream->stream_id(); |
- |
- EXPECT_EQ(OK, callback.WaitForResult()); |
- |
- EXPECT_TRUE(delegate->send_headers_completed()); |
- EXPECT_EQ("200", (*delegate->response())["status"]); |
- EXPECT_EQ("HTTP/1.1", (*delegate->response())["version"]); |
- EXPECT_EQ(std::string("\0hello!\xff", 8), delegate->received_data()); |
- EXPECT_EQ(8, delegate->data_sent()); |
- EXPECT_TRUE(delegate->closed()); |
- |
- // Check that the NetLog was filled reasonably. |
- net::CapturingNetLog::EntryList entries; |
- log.GetEntries(&entries); |
- EXPECT_LT(0u, entries.size()); |
- |
- // Check that we logged SPDY_STREAM_ERROR correctly. |
- int pos = net::ExpectLogContainsSomewhere( |
- entries, 0, |
- net::NetLog::TYPE_SPDY_STREAM_ERROR, |
- net::NetLog::PHASE_NONE); |
- |
- CapturingNetLog::Entry entry = entries[pos]; |
- NetLogSpdyStreamErrorParameter* request_params = |
- static_cast<NetLogSpdyStreamErrorParameter*>( |
- entry.extra_parameters.get()); |
- EXPECT_EQ(stream_id, request_params->stream_id()); |
-} |
- |
-} // namespace net |