diff options
Diffstat (limited to 'chromium/net/tools/quic/quic_spdy_server_stream_test.cc')
-rw-r--r-- | chromium/net/tools/quic/quic_spdy_server_stream_test.cc | 146 |
1 files changed, 72 insertions, 74 deletions
diff --git a/chromium/net/tools/quic/quic_spdy_server_stream_test.cc b/chromium/net/tools/quic/quic_spdy_server_stream_test.cc index c0ec9449707..e01569ede79 100644 --- a/chromium/net/tools/quic/quic_spdy_server_stream_test.cc +++ b/chromium/net/tools/quic/quic_spdy_server_stream_test.cc @@ -8,7 +8,6 @@ #include "base/strings/string_piece.h" #include "net/quic/quic_connection.h" #include "net/quic/quic_protocol.h" -#include "net/quic/quic_spdy_compressor.h" #include "net/quic/quic_utils.h" #include "net/quic/test_tools/quic_test_utils.h" #include "net/tools/epoll_server/epoll_server.h" @@ -20,8 +19,9 @@ #include "testing/gtest/include/gtest/gtest.h" using base::StringPiece; -using net::tools::test::MockConnection; using net::test::MockSession; +using net::test::SupportedVersions; +using net::tools::test::MockConnection; using std::string; using testing::_; using testing::AnyNumber; @@ -29,7 +29,6 @@ using testing::Invoke; using testing::InvokeArgument; using testing::InSequence; using testing::Return; -using testing::StrEq; using testing::StrictMock; using testing::WithArgs; @@ -46,25 +45,35 @@ class QuicSpdyServerStreamPeer : public QuicSpdyServerStream { using QuicSpdyServerStream::SendResponse; using QuicSpdyServerStream::SendErrorResponse; - const string& body() { - return body_; + BalsaHeaders* mutable_headers() { + return &headers_; } - const BalsaHeaders& headers() { - return headers_; + static void SendResponse(QuicSpdyServerStream* stream) { + stream->SendResponse(); } - BalsaHeaders* mutable_headers() { - return &headers_; + static void SendErrorResponse(QuicSpdyServerStream* stream) { + stream->SendResponse(); + } + + static const string& body(QuicSpdyServerStream* stream) { + return stream->body_; + } + + static const BalsaHeaders& headers(QuicSpdyServerStream* stream) { + return stream->headers_; } }; namespace { -class QuicSpdyServerStreamTest : public ::testing::Test { +class QuicSpdyServerStreamTest : public ::testing::TestWithParam<QuicVersion> { public: QuicSpdyServerStreamTest() - : session_(new MockConnection(true)), + : connection_(new StrictMock<MockConnection>( + true, SupportedVersions(GetParam()))), + session_(connection_), body_("hello world") { BalsaHeaders request_headers; request_headers.SetRequestFirstlineFromStringPieces( @@ -72,35 +81,23 @@ class QuicSpdyServerStreamTest : public ::testing::Test { request_headers.ReplaceOrAppendHeader("content-length", "11"); headers_string_ = SpdyUtils::SerializeRequestHeaders(request_headers); - stream_.reset(new QuicSpdyServerStreamPeer(3, &session_)); - } - QuicConsumedData ValidateHeaders(const struct iovec* iov) { - StringPiece headers = - StringPiece(static_cast<const char*>(iov[0].iov_base), iov[0].iov_len); - headers_string_ = SpdyUtils::SerializeResponseHeaders( - response_headers_); - QuicSpdyDecompressor decompressor; - TestDecompressorVisitor visitor; - - // First the header id, then the compressed data. - EXPECT_EQ(1, headers[0]); - EXPECT_EQ(0, headers[1]); - EXPECT_EQ(0, headers[2]); - EXPECT_EQ(0, headers[3]); - EXPECT_EQ(static_cast<size_t>(headers.length() - 4), - decompressor.DecompressData(headers.substr(4), &visitor)); - - EXPECT_EQ(headers_string_, visitor.data()); - - return QuicConsumedData(headers.size(), false); + // New streams rely on having the peer's flow control receive window + // negotiated in the config. + session_.config()->SetInitialFlowControlWindowToSend( + kInitialSessionFlowControlWindowForTest); + session_.config()->SetInitialStreamFlowControlWindowToSend( + kInitialStreamFlowControlWindowForTest); + session_.config()->SetInitialSessionFlowControlWindowToSend( + kInitialSessionFlowControlWindowForTest); + stream_.reset(new QuicSpdyServerStreamPeer(3, &session_)); } static void SetUpTestCase() { QuicInMemoryCachePeer::ResetForTests(); } - virtual void SetUp() { + virtual void SetUp() OVERRIDE { QuicInMemoryCache* cache = QuicInMemoryCache::GetInstance(); BalsaHeaders request_headers, response_headers; @@ -130,8 +127,17 @@ class QuicSpdyServerStreamTest : public ::testing::Test { cache->AddResponse(request_headers, response_headers, body); } + const string& StreamBody() { + return QuicSpdyServerStreamPeer::body(stream_.get()); + } + + const BalsaHeaders& StreamHeaders() { + return QuicSpdyServerStreamPeer::headers(stream_.get()); + } + BalsaHeaders response_headers_; EpollServer eps_; + StrictMock<MockConnection>* connection_; StrictMock<MockSession> session_; scoped_ptr<QuicSpdyServerStreamPeer> stream_; string headers_string_; @@ -140,32 +146,31 @@ class QuicSpdyServerStreamTest : public ::testing::Test { QuicConsumedData ConsumeAllData( QuicStreamId id, - const struct iovec* iov, - int iov_count, + const IOVector& data, QuicStreamOffset offset, bool fin, + FecProtection /*fec_protection_*/, QuicAckNotifier::DelegateInterface* /*ack_notifier_delegate*/) { - ssize_t consumed_length = 0; - for (int i = 0; i < iov_count; ++i) { - consumed_length += iov[i].iov_len; - } - return QuicConsumedData(consumed_length, fin); + return QuicConsumedData(data.TotalBufferSize(), fin); } -TEST_F(QuicSpdyServerStreamTest, TestFraming) { +INSTANTIATE_TEST_CASE_P(Tests, QuicSpdyServerStreamTest, + ::testing::ValuesIn(QuicSupportedVersions())); + +TEST_P(QuicSpdyServerStreamTest, TestFraming) { EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). WillRepeatedly(Invoke(ConsumeAllData)); EXPECT_EQ(headers_string_.size(), stream_->ProcessData( headers_string_.c_str(), headers_string_.size())); EXPECT_EQ(body_.size(), stream_->ProcessData(body_.c_str(), body_.size())); - EXPECT_EQ(11u, stream_->headers().content_length()); - EXPECT_EQ("https://www.google.com/", stream_->headers().request_uri()); - EXPECT_EQ("POST", stream_->headers().request_method()); - EXPECT_EQ(body_, stream_->body()); + EXPECT_EQ(11u, StreamHeaders().content_length()); + EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); + EXPECT_EQ("POST", StreamHeaders().request_method()); + EXPECT_EQ(body_, StreamBody()); } -TEST_F(QuicSpdyServerStreamTest, TestFramingOnePacket) { +TEST_P(QuicSpdyServerStreamTest, TestFramingOnePacket) { EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). WillRepeatedly(Invoke(ConsumeAllData)); @@ -173,14 +178,13 @@ TEST_F(QuicSpdyServerStreamTest, TestFramingOnePacket) { EXPECT_EQ(message.size(), stream_->ProcessData( message.c_str(), message.size())); - EXPECT_EQ(11u, stream_->headers().content_length()); - EXPECT_EQ("https://www.google.com/", - stream_->headers().request_uri()); - EXPECT_EQ("POST", stream_->headers().request_method()); - EXPECT_EQ(body_, stream_->body()); + EXPECT_EQ(11u, StreamHeaders().content_length()); + EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); + EXPECT_EQ("POST", StreamHeaders().request_method()); + EXPECT_EQ(body_, StreamBody()); } -TEST_F(QuicSpdyServerStreamTest, TestFramingExtraData) { +TEST_P(QuicSpdyServerStreamTest, TestFramingExtraData) { string large_body = "hello world!!!!!!"; // We'll automatically write out an error (headers + body) @@ -192,12 +196,12 @@ TEST_F(QuicSpdyServerStreamTest, TestFramingExtraData) { // Content length is still 11. This will register as an error and we won't // accept the bytes. stream_->ProcessData(large_body.c_str(), large_body.size()); - EXPECT_EQ(11u, stream_->headers().content_length()); - EXPECT_EQ("https://www.google.com/", stream_->headers().request_uri()); - EXPECT_EQ("POST", stream_->headers().request_method()); + EXPECT_EQ(11u, StreamHeaders().content_length()); + EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); + EXPECT_EQ("POST", StreamHeaders().request_method()); } -TEST_F(QuicSpdyServerStreamTest, TestSendResponse) { +TEST_P(QuicSpdyServerStreamTest, TestSendResponse) { BalsaHeaders* request_headers = stream_->mutable_headers(); request_headers->SetRequestFirstlineFromStringPieces( "GET", @@ -209,40 +213,34 @@ TEST_F(QuicSpdyServerStreamTest, TestSendResponse) { response_headers_.ReplaceOrAppendHeader("content-length", "3"); InSequence s; - EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1) - .WillOnce(WithArgs<1>(Invoke( - this, &QuicSpdyServerStreamTest::ValidateHeaders))); - - EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1). + EXPECT_CALL(session_, + WritevData(kHeadersStreamId, _, 0, false, _, NULL)); + EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(1). WillOnce(Return(QuicConsumedData(3, true))); - stream_->SendResponse(); + QuicSpdyServerStreamPeer::SendResponse(stream_.get()); EXPECT_TRUE(stream_->read_side_closed()); EXPECT_TRUE(stream_->write_side_closed()); } -TEST_F(QuicSpdyServerStreamTest, TestSendErrorResponse) { +TEST_P(QuicSpdyServerStreamTest, TestSendErrorResponse) { response_headers_.SetResponseFirstlineFromStringPieces( "HTTP/1.1", "500", "Server Error"); response_headers_.ReplaceOrAppendHeader("content-length", "3"); InSequence s; - EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1) - .WillOnce(WithArgs<1>(Invoke( - this, &QuicSpdyServerStreamTest::ValidateHeaders))); - - EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1). + EXPECT_CALL(session_, + WritevData(kHeadersStreamId, _, 0, false, _, NULL)); + EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(1). WillOnce(Return(QuicConsumedData(3, true))); - stream_->SendErrorResponse(); + QuicSpdyServerStreamPeer::SendErrorResponse(stream_.get()); EXPECT_TRUE(stream_->read_side_closed()); EXPECT_TRUE(stream_->write_side_closed()); } -TEST_F(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { +TEST_P(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { char arr[] = { - 0x00, 0x00, 0x00, 0x05, // .... - 0x00, 0x00, 0x00, 0x05, // .... 0x3a, 0x68, 0x6f, 0x73, // :hos 0x74, 0x00, 0x00, 0x00, // t... 0x00, 0x00, 0x00, 0x00, // .... @@ -265,8 +263,8 @@ TEST_F(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { 0x54, 0x54, 0x50, 0x2f, // TTP/ 0x31, 0x2e, 0x31, // 1.1 }; - QuicStreamFrame frame( - stream_->id(), true, 0, MakeIOVector(StringPiece(arr, arraysize(arr)))); + StringPiece data(arr, arraysize(arr)); + QuicStreamFrame frame(stream_->id(), true, 0, MakeIOVector(data)); // Verify that we don't crash when we get a invalid headers in stream frame. stream_->OnStreamFrame(frame); } |