| Index: net/quic/quic_headers_stream_test.cc
|
| diff --git a/net/quic/quic_headers_stream_test.cc b/net/quic/quic_headers_stream_test.cc
|
| deleted file mode 100644
|
| index 9d684ac4c76f38bf2563442e731af513a43d4092..0000000000000000000000000000000000000000
|
| --- a/net/quic/quic_headers_stream_test.cc
|
| +++ /dev/null
|
| @@ -1,467 +0,0 @@
|
| -// Copyright 2013 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 "net/quic/quic_headers_stream.h"
|
| -
|
| -#include "net/quic/quic_utils.h"
|
| -#include "net/quic/spdy_utils.h"
|
| -#include "net/quic/test_tools/quic_connection_peer.h"
|
| -#include "net/quic/test_tools/quic_session_peer.h"
|
| -#include "net/quic/test_tools/quic_test_utils.h"
|
| -#include "net/quic/test_tools/reliable_quic_stream_peer.h"
|
| -#include "net/spdy/spdy_protocol.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using base::StringPiece;
|
| -using std::ostream;
|
| -using std::string;
|
| -using std::vector;
|
| -using testing::Invoke;
|
| -using testing::StrictMock;
|
| -using testing::WithArgs;
|
| -using testing::_;
|
| -
|
| -namespace net {
|
| -namespace test {
|
| -namespace {
|
| -
|
| -class MockVisitor : public SpdyFramerVisitorInterface {
|
| - public:
|
| - MOCK_METHOD1(OnError, void(SpdyFramer* framer));
|
| - MOCK_METHOD3(OnDataFrameHeader, void(SpdyStreamId stream_id,
|
| - size_t length,
|
| - bool fin));
|
| - MOCK_METHOD4(OnStreamFrameData, void(SpdyStreamId stream_id,
|
| - const char* data,
|
| - size_t len,
|
| - bool fin));
|
| - MOCK_METHOD3(OnControlFrameHeaderData, bool(SpdyStreamId stream_id,
|
| - const char* header_data,
|
| - size_t len));
|
| - MOCK_METHOD5(OnSynStream, void(SpdyStreamId stream_id,
|
| - SpdyStreamId associated_stream_id,
|
| - SpdyPriority priority,
|
| - bool fin,
|
| - bool unidirectional));
|
| - MOCK_METHOD2(OnSynReply, void(SpdyStreamId stream_id, bool fin));
|
| - MOCK_METHOD2(OnRstStream, void(SpdyStreamId stream_id,
|
| - SpdyRstStreamStatus status));
|
| - MOCK_METHOD1(OnSettings, void(bool clear_persisted));
|
| - MOCK_METHOD3(OnSetting, void(SpdySettingsIds id, uint8 flags, uint32 value));
|
| - MOCK_METHOD0(OnSettingsAck, void());
|
| - MOCK_METHOD0(OnSettingsEnd, void());
|
| - MOCK_METHOD2(OnPing, void(SpdyPingId unique_id, bool is_ack));
|
| - MOCK_METHOD2(OnGoAway, void(SpdyStreamId last_accepted_stream_id,
|
| - SpdyGoAwayStatus status));
|
| - MOCK_METHOD5(OnHeaders, void(SpdyStreamId stream_id, bool has_priority,
|
| - SpdyPriority priority, bool fin, bool end));
|
| - MOCK_METHOD2(OnWindowUpdate, void(SpdyStreamId stream_id,
|
| - uint32 delta_window_size));
|
| - MOCK_METHOD2(OnCredentialFrameData, bool(const char* credential_data,
|
| - size_t len));
|
| - MOCK_METHOD1(OnBlocked, void(SpdyStreamId stream_id));
|
| - MOCK_METHOD3(OnPushPromise, void(SpdyStreamId stream_id,
|
| - SpdyStreamId promised_stream_id,
|
| - bool end));
|
| - MOCK_METHOD2(OnContinuation, void(SpdyStreamId stream_id, bool end));
|
| - MOCK_METHOD6(OnAltSvc, void(SpdyStreamId stream_id,
|
| - uint32 max_age,
|
| - uint16 port,
|
| - StringPiece protocol_id,
|
| - StringPiece host,
|
| - StringPiece origin));
|
| - MOCK_METHOD2(OnUnknownFrame, bool(SpdyStreamId stream_id, int frame_type));
|
| -};
|
| -
|
| -// Run all tests with each version, and client or server
|
| -struct TestParams {
|
| - TestParams(QuicVersion version, bool is_server)
|
| - : version(version), is_server(is_server) {}
|
| -
|
| - friend ostream& operator<<(ostream& os, const TestParams& p) {
|
| - os << "{ version: " << QuicVersionToString(p.version);
|
| - os << ", is_server: " << p.is_server << " }";
|
| - return os;
|
| - }
|
| -
|
| - QuicVersion version;
|
| - bool is_server;
|
| -};
|
| -
|
| -// Constructs various test permutations.
|
| -vector<TestParams> GetTestParams() {
|
| - vector<TestParams> params;
|
| - QuicVersionVector all_supported_versions = QuicSupportedVersions();
|
| - for (const QuicVersion version : all_supported_versions) {
|
| - params.push_back(TestParams(version, false));
|
| - params.push_back(TestParams(version, true));
|
| - }
|
| - return params;
|
| -}
|
| -
|
| -class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> {
|
| - public:
|
| - QuicHeadersStreamTest()
|
| - : connection_(new StrictMock<MockConnection>(is_server(), GetVersion())),
|
| - session_(connection_),
|
| - headers_stream_(QuicSessionPeer::GetHeadersStream(&session_)),
|
| - body_("hello world"),
|
| - framer_(version() > QUIC_VERSION_23 ? SPDY4 : SPDY3) {
|
| - headers_[":version"] = "HTTP/1.1";
|
| - headers_[":status"] = "200 Ok";
|
| - headers_["content-length"] = "11";
|
| - framer_.set_visitor(&visitor_);
|
| - EXPECT_EQ(version(), session_.connection()->version());
|
| - EXPECT_TRUE(headers_stream_ != nullptr);
|
| - VLOG(1) << GetParam();
|
| - }
|
| -
|
| - QuicConsumedData SaveIov(const IOVector& data) {
|
| - const iovec* iov = data.iovec();
|
| - int count = data.Capacity();
|
| - for (int i = 0 ; i < count; ++i) {
|
| - saved_data_.append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len);
|
| - }
|
| - return QuicConsumedData(saved_data_.length(), false);
|
| - }
|
| -
|
| - bool SaveHeaderData(const char* data, int len) {
|
| - saved_header_data_.append(data, len);
|
| - return true;
|
| - }
|
| -
|
| - void SaveHeaderDataStringPiece(StringPiece data) {
|
| - saved_header_data_.append(data.data(), data.length());
|
| - }
|
| -
|
| - void WriteHeadersAndExpectSynStream(QuicStreamId stream_id,
|
| - bool fin,
|
| - QuicPriority priority) {
|
| - WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM);
|
| - }
|
| -
|
| - void WriteHeadersAndExpectSynReply(QuicStreamId stream_id,
|
| - bool fin) {
|
| - WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY);
|
| - }
|
| -
|
| - void WriteHeadersAndCheckData(QuicStreamId stream_id,
|
| - bool fin,
|
| - QuicPriority priority,
|
| - SpdyFrameType type) {
|
| - // Write the headers and capture the outgoing data
|
| - EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, _, nullptr))
|
| - .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov)));
|
| - headers_stream_->WriteHeaders(stream_id, headers_, fin, priority, nullptr);
|
| -
|
| - // Parse the outgoing data and check that it matches was was written.
|
| - if (type == SYN_STREAM) {
|
| - if (version() > QUIC_VERSION_23) {
|
| - EXPECT_CALL(visitor_, OnHeaders(stream_id, kHasPriority, priority, fin,
|
| - kFrameComplete));
|
| - } else {
|
| - EXPECT_CALL(visitor_,
|
| - OnSynStream(stream_id, kNoAssociatedStream,
|
| - /*priority=*/0, fin, kNotUnidirectional));
|
| - }
|
| - } else {
|
| - if (version() > QUIC_VERSION_23) {
|
| - EXPECT_CALL(visitor_, OnHeaders(stream_id, !kHasPriority,
|
| - /*priority=*/0, fin, kFrameComplete));
|
| - } else {
|
| - EXPECT_CALL(visitor_, OnSynReply(stream_id, fin));
|
| - }
|
| - }
|
| - EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _))
|
| - .WillRepeatedly(WithArgs<1, 2>(
|
| - Invoke(this, &QuicHeadersStreamTest::SaveHeaderData)));
|
| - if (fin) {
|
| - EXPECT_CALL(visitor_, OnStreamFrameData(stream_id, nullptr, 0, true));
|
| - }
|
| - framer_.ProcessInput(saved_data_.data(), saved_data_.length());
|
| - EXPECT_FALSE(framer_.HasError())
|
| - << SpdyFramer::ErrorCodeToString(framer_.error_code());
|
| -
|
| - CheckHeaders();
|
| - saved_data_.clear();
|
| - }
|
| -
|
| - void CheckHeaders() {
|
| - SpdyHeaderBlock headers;
|
| - EXPECT_EQ(saved_header_data_.length(),
|
| - framer_.ParseHeaderBlockInBuffer(saved_header_data_.data(),
|
| - saved_header_data_.length(),
|
| - &headers));
|
| - EXPECT_EQ(headers_, headers);
|
| - saved_header_data_.clear();
|
| - }
|
| -
|
| - bool is_server() { return GetParam().is_server; }
|
| -
|
| - QuicVersion version() { return GetParam().version; }
|
| -
|
| - QuicVersionVector GetVersion() {
|
| - QuicVersionVector versions;
|
| - versions.push_back(version());
|
| - return versions;
|
| - }
|
| -
|
| - void CloseConnection() {
|
| - QuicConnectionPeer::CloseConnection(connection_);
|
| - }
|
| -
|
| - static const bool kFrameComplete = true;
|
| - static const bool kHasPriority = true;
|
| - static const bool kNotUnidirectional = false;
|
| - static const bool kNoAssociatedStream = false;
|
| -
|
| - StrictMock<MockConnection>* connection_;
|
| - StrictMock<MockSession> session_;
|
| - QuicHeadersStream* headers_stream_;
|
| - SpdyHeaderBlock headers_;
|
| - string body_;
|
| - string saved_data_;
|
| - string saved_header_data_;
|
| - SpdyFramer framer_;
|
| - StrictMock<MockVisitor> visitor_;
|
| -};
|
| -
|
| -INSTANTIATE_TEST_CASE_P(Tests,
|
| - QuicHeadersStreamTest,
|
| - ::testing::ValuesIn(GetTestParams()));
|
| -
|
| -TEST_P(QuicHeadersStreamTest, StreamId) {
|
| - EXPECT_EQ(3u, headers_stream_->id());
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, EffectivePriority) {
|
| - EXPECT_EQ(0u, headers_stream_->EffectivePriority());
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, WriteHeaders) {
|
| - for (QuicStreamId stream_id = kClientDataStreamId1;
|
| - stream_id < kClientDataStreamId3; stream_id += 2) {
|
| - for (int count = 0; count < 2; ++count) {
|
| - bool fin = (count == 0);
|
| - if (is_server()) {
|
| - WriteHeadersAndExpectSynReply(stream_id, fin);
|
| - } else {
|
| - for (QuicPriority priority = 0; priority < 7; ++priority) {
|
| - // TODO(rch): implement priorities correctly.
|
| - WriteHeadersAndExpectSynStream(stream_id, fin, 0);
|
| - }
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, ProcessRawData) {
|
| - for (QuicStreamId stream_id = kClientDataStreamId1;
|
| - stream_id < kClientDataStreamId3; stream_id += 2) {
|
| - for (int count = 0; count < 2; ++count) {
|
| - bool fin = (count == 0);
|
| - for (QuicPriority priority = 0; priority < 7; ++priority) {
|
| - // Replace with "WriteHeadersAndSaveData"
|
| - scoped_ptr<SpdySerializedFrame> frame;
|
| - if (is_server()) {
|
| - if (version() > QUIC_VERSION_23) {
|
| - SpdyHeadersIR headers_frame(stream_id);
|
| - headers_frame.set_name_value_block(headers_);
|
| - headers_frame.set_fin(fin);
|
| - headers_frame.set_has_priority(true);
|
| - frame.reset(framer_.SerializeFrame(headers_frame));
|
| - } else {
|
| - SpdySynStreamIR syn_stream(stream_id);
|
| - syn_stream.set_name_value_block(headers_);
|
| - syn_stream.set_fin(fin);
|
| - frame.reset(framer_.SerializeSynStream(syn_stream));
|
| - }
|
| - EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0));
|
| - } else {
|
| - if (version() > QUIC_VERSION_23) {
|
| - SpdyHeadersIR headers_frame(stream_id);
|
| - headers_frame.set_name_value_block(headers_);
|
| - headers_frame.set_fin(fin);
|
| - frame.reset(framer_.SerializeFrame(headers_frame));
|
| - } else {
|
| - SpdySynReplyIR syn_reply(stream_id);
|
| - syn_reply.set_name_value_block(headers_);
|
| - syn_reply.set_fin(fin);
|
| - frame.reset(framer_.SerializeSynReply(syn_reply));
|
| - }
|
| - }
|
| - EXPECT_CALL(session_, OnStreamHeaders(stream_id, _))
|
| - .WillRepeatedly(WithArgs<1>(
|
| - Invoke(this,
|
| - &QuicHeadersStreamTest::SaveHeaderDataStringPiece)));
|
| - EXPECT_CALL(session_,
|
| - OnStreamHeadersComplete(stream_id, fin, frame->size()));
|
| - headers_stream_->ProcessRawData(frame->data(), frame->size());
|
| - CheckHeaders();
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, ProcessLargeRawData) {
|
| - // We want to create a frame that is more than the SPDY Framer's max control
|
| - // frame size, which is 16K, but less than the HPACK decoders max decode
|
| - // buffer size, which is 32K.
|
| - headers_["key0"] = string(1 << 13, '.');
|
| - headers_["key1"] = string(1 << 13, '.');
|
| - headers_["key2"] = string(1 << 13, '.');
|
| - for (QuicStreamId stream_id = kClientDataStreamId1;
|
| - stream_id < kClientDataStreamId3; stream_id += 2) {
|
| - for (int count = 0; count < 2; ++count) {
|
| - bool fin = (count == 0);
|
| - for (QuicPriority priority = 0; priority < 7; ++priority) {
|
| - // Replace with "WriteHeadersAndSaveData"
|
| - scoped_ptr<SpdySerializedFrame> frame;
|
| - if (is_server()) {
|
| - if (version() > QUIC_VERSION_23) {
|
| - SpdyHeadersIR headers_frame(stream_id);
|
| - headers_frame.set_name_value_block(headers_);
|
| - headers_frame.set_fin(fin);
|
| - headers_frame.set_has_priority(true);
|
| - frame.reset(framer_.SerializeFrame(headers_frame));
|
| - } else {
|
| - SpdySynStreamIR syn_stream(stream_id);
|
| - syn_stream.set_name_value_block(headers_);
|
| - syn_stream.set_fin(fin);
|
| - frame.reset(framer_.SerializeSynStream(syn_stream));
|
| - }
|
| - EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0));
|
| - } else {
|
| - if (version() > QUIC_VERSION_23) {
|
| - SpdyHeadersIR headers_frame(stream_id);
|
| - headers_frame.set_name_value_block(headers_);
|
| - headers_frame.set_fin(fin);
|
| - frame.reset(framer_.SerializeFrame(headers_frame));
|
| - } else {
|
| - SpdySynReplyIR syn_reply(stream_id);
|
| - syn_reply.set_name_value_block(headers_);
|
| - syn_reply.set_fin(fin);
|
| - frame.reset(framer_.SerializeSynReply(syn_reply));
|
| - }
|
| - }
|
| - EXPECT_CALL(session_, OnStreamHeaders(stream_id, _))
|
| - .WillRepeatedly(WithArgs<1>(Invoke(
|
| - this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece)));
|
| - EXPECT_CALL(session_,
|
| - OnStreamHeadersComplete(stream_id, fin, frame->size()));
|
| - headers_stream_->ProcessRawData(frame->data(), frame->size());
|
| - CheckHeaders();
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, ProcessBadData) {
|
| - const char kBadData[] = "blah blah blah";
|
| - EXPECT_CALL(*connection_, SendConnectionCloseWithDetails(
|
| - QUIC_INVALID_HEADERS_STREAM_DATA, _))
|
| - .Times(::testing::AnyNumber());
|
| - headers_stream_->ProcessRawData(kBadData, strlen(kBadData));
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, ProcessSpdyDataFrame) {
|
| - SpdyDataIR data(2, "");
|
| - scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
|
| - EXPECT_CALL(*connection_,
|
| - SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
|
| - "SPDY DATA frame received."))
|
| - .WillOnce(InvokeWithoutArgs(this,
|
| - &QuicHeadersStreamTest::CloseConnection));
|
| - headers_stream_->ProcessRawData(frame->data(), frame->size());
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, ProcessSpdyRstStreamFrame) {
|
| - SpdyRstStreamIR data(2, RST_STREAM_PROTOCOL_ERROR, "");
|
| - scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
|
| - EXPECT_CALL(*connection_,
|
| - SendConnectionCloseWithDetails(
|
| - QUIC_INVALID_HEADERS_STREAM_DATA,
|
| - "SPDY RST_STREAM frame received."))
|
| - .WillOnce(InvokeWithoutArgs(this,
|
| - &QuicHeadersStreamTest::CloseConnection));
|
| - headers_stream_->ProcessRawData(frame->data(), frame->size());
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, ProcessSpdySettingsFrame) {
|
| - SpdySettingsIR data;
|
| - if (version() > QUIC_VERSION_23) {
|
| - data.AddSetting(SETTINGS_HEADER_TABLE_SIZE, true, true, 0);
|
| - } else {
|
| - data.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, true, true, 0);
|
| - }
|
| - scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
|
| - EXPECT_CALL(*connection_,
|
| - SendConnectionCloseWithDetails(
|
| - QUIC_INVALID_HEADERS_STREAM_DATA,
|
| - "SPDY SETTINGS frame received."))
|
| - .WillOnce(InvokeWithoutArgs(this,
|
| - &QuicHeadersStreamTest::CloseConnection));
|
| - headers_stream_->ProcessRawData(frame->data(), frame->size());
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, ProcessSpdyPingFrame) {
|
| - SpdyPingIR data(1);
|
| - scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
|
| - EXPECT_CALL(*connection_,
|
| - SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
|
| - "SPDY PING frame received."))
|
| - .WillOnce(InvokeWithoutArgs(this,
|
| - &QuicHeadersStreamTest::CloseConnection));
|
| - headers_stream_->ProcessRawData(frame->data(), frame->size());
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, ProcessSpdyGoAwayFrame) {
|
| - SpdyGoAwayIR data(1, GOAWAY_PROTOCOL_ERROR, "go away");
|
| - scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
|
| - EXPECT_CALL(*connection_,
|
| - SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
|
| - "SPDY GOAWAY frame received."))
|
| - .WillOnce(InvokeWithoutArgs(this,
|
| - &QuicHeadersStreamTest::CloseConnection));
|
| - headers_stream_->ProcessRawData(frame->data(), frame->size());
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, ProcessSpdyHeadersFrame) {
|
| - if (version() > QUIC_VERSION_23) {
|
| - // HEADERS frames are an error when using SPDY/3, but
|
| - // when using SPDY/4 they're the "normal" way of sending headers
|
| - // so we test their handling in the ProcessRawData test.
|
| - return;
|
| - }
|
| - SpdyHeadersIR data(1);
|
| - scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
|
| - EXPECT_CALL(*connection_,
|
| - SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
|
| - "SPDY HEADERS frame received."))
|
| - .WillOnce(InvokeWithoutArgs(this,
|
| - &QuicHeadersStreamTest::CloseConnection));
|
| - headers_stream_->ProcessRawData(frame->data(), frame->size());
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, ProcessSpdyWindowUpdateFrame) {
|
| - SpdyWindowUpdateIR data(1, 1);
|
| - scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data));
|
| - EXPECT_CALL(*connection_,
|
| - SendConnectionCloseWithDetails(
|
| - QUIC_INVALID_HEADERS_STREAM_DATA,
|
| - "SPDY WINDOW_UPDATE frame received."))
|
| - .WillOnce(InvokeWithoutArgs(this,
|
| - &QuicHeadersStreamTest::CloseConnection));
|
| - headers_stream_->ProcessRawData(frame->data(), frame->size());
|
| -}
|
| -
|
| -TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) {
|
| - EXPECT_TRUE(headers_stream_->flow_controller()->IsEnabled());
|
| - EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl(
|
| - headers_stream_));
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace test
|
| -} // namespace net
|
|
|