| Index: net/quic/reliable_quic_stream_test.cc
|
| diff --git a/net/quic/reliable_quic_stream_test.cc b/net/quic/reliable_quic_stream_test.cc
|
| index a8bd5c917d50641645f3de2ba748ae47986575ee..60414ae09fd94b7fd2dcc3bd0fd048bad12324b2 100644
|
| --- a/net/quic/reliable_quic_stream_test.cc
|
| +++ b/net/quic/reliable_quic_stream_test.cc
|
| @@ -43,13 +43,15 @@ class TestStream : public ReliableQuicStream {
|
| : ReliableQuicStream(id, session),
|
| should_process_data_(should_process_data) {}
|
|
|
| - virtual uint32 ProcessData(const char* data, uint32 data_len) OVERRIDE {
|
| + virtual uint32 ProcessRawData(const char* data, uint32 data_len) OVERRIDE {
|
| EXPECT_NE(0u, data_len);
|
| DVLOG(1) << "ProcessData data_len: " << data_len;
|
| data_ += string(data, data_len);
|
| return should_process_data_ ? data_len : 0;
|
| }
|
|
|
| + virtual QuicPriority EffectivePriority() const OVERRIDE { return 0; }
|
| +
|
| using ReliableQuicStream::WriteOrBufferData;
|
| using ReliableQuicStream::CloseReadSide;
|
| using ReliableQuicStream::CloseWriteSide;
|
| @@ -226,340 +228,6 @@ TEST_F(ReliableQuicStreamTest, ConnectionCloseAfterStreamClose) {
|
| EXPECT_EQ(QUIC_NO_ERROR, stream_->connection_error());
|
| }
|
|
|
| -TEST_F(ReliableQuicStreamTest, ProcessHeaders) {
|
| - Initialize(kShouldProcessData);
|
| -
|
| - string compressed_headers = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers));
|
| -
|
| - stream_->OnStreamFrame(frame);
|
| - EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_), stream_->data());
|
| - EXPECT_EQ(static_cast<QuicPriority>(kHighestPriority),
|
| - stream_->EffectivePriority());
|
| -}
|
| -
|
| -TEST_F(ReliableQuicStreamTest, ProcessHeadersWithInvalidHeaderId) {
|
| - Initialize(kShouldProcessData);
|
| -
|
| - string compressed_headers = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - compressed_headers[4] = '\xFF'; // Illegal header id.
|
| - QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers));
|
| -
|
| - EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_HEADER_ID));
|
| - stream_->OnStreamFrame(frame);
|
| -}
|
| -
|
| -TEST_F(ReliableQuicStreamTest, ProcessHeadersWithInvalidPriority) {
|
| - Initialize(kShouldProcessData);
|
| -
|
| - string compressed_headers = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - compressed_headers[0] = '\xFF'; // Illegal priority.
|
| - QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers));
|
| -
|
| - EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_PRIORITY));
|
| - stream_->OnStreamFrame(frame);
|
| -}
|
| -
|
| -TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBody) {
|
| - Initialize(kShouldProcessData);
|
| -
|
| - string compressed_headers = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - string body = "this is the body";
|
| - string data = compressed_headers + body;
|
| - QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
|
| -
|
| - stream_->OnStreamFrame(frame);
|
| - EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_) + body,
|
| - stream_->data());
|
| -}
|
| -
|
| -TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBodyFragments) {
|
| - Initialize(kShouldProcessData);
|
| -
|
| - string compressed_headers = compressor_->CompressHeadersWithPriority(
|
| - kLowestPriority, headers_);
|
| - string body = "this is the body";
|
| - string data = compressed_headers + body;
|
| -
|
| - for (size_t fragment_size = 1; fragment_size < data.size(); ++fragment_size) {
|
| - Initialize(kShouldProcessData);
|
| - for (size_t offset = 0; offset < data.size(); offset += fragment_size) {
|
| - size_t remaining_data = data.length() - offset;
|
| - StringPiece fragment(data.data() + offset,
|
| - min(fragment_size, remaining_data));
|
| - QuicStreamFrame frame(kStreamId, false, offset, MakeIOVector(fragment));
|
| -
|
| - stream_->OnStreamFrame(frame);
|
| - }
|
| - ASSERT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_) + body,
|
| - stream_->data()) << "fragment_size: " << fragment_size;
|
| - }
|
| -
|
| - for (size_t split_point = 1; split_point < data.size() - 1; ++split_point) {
|
| - Initialize(kShouldProcessData);
|
| -
|
| - StringPiece fragment1(data.data(), split_point);
|
| - QuicStreamFrame frame1(kStreamId, false, 0, MakeIOVector(fragment1));
|
| - stream_->OnStreamFrame(frame1);
|
| -
|
| - StringPiece fragment2(data.data() + split_point, data.size() - split_point);
|
| - QuicStreamFrame frame2(
|
| - kStreamId, false, split_point, MakeIOVector(fragment2));
|
| - stream_->OnStreamFrame(frame2);
|
| -
|
| - ASSERT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_) + body,
|
| - stream_->data()) << "split_point: " << split_point;
|
| - }
|
| - EXPECT_EQ(static_cast<QuicPriority>(kLowestPriority),
|
| - stream_->EffectivePriority());
|
| -}
|
| -
|
| -TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBodyReadv) {
|
| - Initialize(!kShouldProcessData);
|
| -
|
| - string compressed_headers = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - string body = "this is the body";
|
| - string data = compressed_headers + body;
|
| - QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
|
| - string uncompressed_headers =
|
| - SpdyUtils::SerializeUncompressedHeaders(headers_);
|
| - string uncompressed_data = uncompressed_headers + body;
|
| -
|
| - stream_->OnStreamFrame(frame);
|
| - EXPECT_EQ(uncompressed_headers, stream_->data());
|
| -
|
| - char buffer[2048];
|
| - ASSERT_LT(data.length(), arraysize(buffer));
|
| - struct iovec vec;
|
| - vec.iov_base = buffer;
|
| - vec.iov_len = arraysize(buffer);
|
| -
|
| - size_t bytes_read = stream_->Readv(&vec, 1);
|
| - EXPECT_EQ(uncompressed_headers.length(), bytes_read);
|
| - EXPECT_EQ(uncompressed_headers, string(buffer, bytes_read));
|
| -
|
| - bytes_read = stream_->Readv(&vec, 1);
|
| - EXPECT_EQ(body.length(), bytes_read);
|
| - EXPECT_EQ(body, string(buffer, bytes_read));
|
| -}
|
| -
|
| -TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBodyIncrementalReadv) {
|
| - Initialize(!kShouldProcessData);
|
| -
|
| - string compressed_headers = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - string body = "this is the body";
|
| - string data = compressed_headers + body;
|
| - QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
|
| - string uncompressed_headers =
|
| - SpdyUtils::SerializeUncompressedHeaders(headers_);
|
| - string uncompressed_data = uncompressed_headers + body;
|
| -
|
| - stream_->OnStreamFrame(frame);
|
| - EXPECT_EQ(uncompressed_headers, stream_->data());
|
| -
|
| - char buffer[1];
|
| - struct iovec vec;
|
| - vec.iov_base = buffer;
|
| - vec.iov_len = arraysize(buffer);
|
| - for (size_t i = 0; i < uncompressed_data.length(); ++i) {
|
| - size_t bytes_read = stream_->Readv(&vec, 1);
|
| - ASSERT_EQ(1u, bytes_read);
|
| - EXPECT_EQ(uncompressed_data.data()[i], buffer[0]);
|
| - }
|
| -}
|
| -
|
| -TEST_F(ReliableQuicStreamTest, ProcessHeadersUsingReadvWithMultipleIovecs) {
|
| - Initialize(!kShouldProcessData);
|
| -
|
| - string compressed_headers = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - string body = "this is the body";
|
| - string data = compressed_headers + body;
|
| - QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
|
| - string uncompressed_headers =
|
| - SpdyUtils::SerializeUncompressedHeaders(headers_);
|
| - string uncompressed_data = uncompressed_headers + body;
|
| -
|
| - stream_->OnStreamFrame(frame);
|
| - EXPECT_EQ(uncompressed_headers, stream_->data());
|
| -
|
| - char buffer1[1];
|
| - char buffer2[1];
|
| - struct iovec vec[2];
|
| - vec[0].iov_base = buffer1;
|
| - vec[0].iov_len = arraysize(buffer1);
|
| - vec[1].iov_base = buffer2;
|
| - vec[1].iov_len = arraysize(buffer2);
|
| - for (size_t i = 0; i < uncompressed_data.length(); i += 2) {
|
| - size_t bytes_read = stream_->Readv(vec, 2);
|
| - ASSERT_EQ(2u, bytes_read) << i;
|
| - ASSERT_EQ(uncompressed_data.data()[i], buffer1[0]) << i;
|
| - ASSERT_EQ(uncompressed_data.data()[i + 1], buffer2[0]) << i;
|
| - }
|
| -}
|
| -
|
| -TEST_F(ReliableQuicStreamTest, ProcessCorruptHeadersEarly) {
|
| - Initialize(kShouldProcessData);
|
| -
|
| - string compressed_headers1 = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - QuicStreamFrame frame1(
|
| - stream_->id(), false, 0, MakeIOVector(compressed_headers1));
|
| - string decompressed_headers1 =
|
| - SpdyUtils::SerializeUncompressedHeaders(headers_);
|
| -
|
| - headers_["content-type"] = "text/plain";
|
| - string compressed_headers2 = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - // Corrupt the compressed data.
|
| - compressed_headers2[compressed_headers2.length() - 1] ^= 0xA1;
|
| - QuicStreamFrame frame2(
|
| - stream2_->id(), false, 0, MakeIOVector(compressed_headers2));
|
| - string decompressed_headers2 =
|
| - SpdyUtils::SerializeUncompressedHeaders(headers_);
|
| -
|
| - // Deliver frame2 to stream2 out of order. The decompressor is not
|
| - // available yet, so no data will be processed. The compressed data
|
| - // will be buffered until OnDecompressorAvailable() is called
|
| - // to process it.
|
| - stream2_->OnStreamFrame(frame2);
|
| - EXPECT_EQ("", stream2_->data());
|
| -
|
| - // Now deliver frame1 to stream1. The decompressor is available so
|
| - // the data will be processed, and the decompressor will become
|
| - // available for stream2.
|
| - stream_->OnStreamFrame(frame1);
|
| - EXPECT_EQ(decompressed_headers1, stream_->data());
|
| -
|
| - // Verify that the decompressor is available, and inform stream2
|
| - // that it can now decompress the buffered compressed data. Since
|
| - // the compressed data is corrupt, the stream will shutdown the session.
|
| - EXPECT_EQ(2u, session_->decompressor()->current_header_id());
|
| - EXPECT_CALL(*connection_, SendConnectionClose(QUIC_DECOMPRESSION_FAILURE));
|
| - stream2_->OnDecompressorAvailable();
|
| - EXPECT_EQ("", stream2_->data());
|
| -}
|
| -
|
| -TEST_F(ReliableQuicStreamTest, ProcessPartialHeadersEarly) {
|
| - Initialize(kShouldProcessData);
|
| -
|
| - string compressed_headers1 = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - QuicStreamFrame frame1(
|
| - stream_->id(), false, 0, MakeIOVector(compressed_headers1));
|
| - string decompressed_headers1 =
|
| - SpdyUtils::SerializeUncompressedHeaders(headers_);
|
| -
|
| - headers_["content-type"] = "text/plain";
|
| - string compressed_headers2 = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - string partial_compressed_headers =
|
| - compressed_headers2.substr(0, compressed_headers2.length() / 2);
|
| - QuicStreamFrame frame2(
|
| - stream2_->id(), false, 0, MakeIOVector(partial_compressed_headers));
|
| - string decompressed_headers2 =
|
| - SpdyUtils::SerializeUncompressedHeaders(headers_);
|
| -
|
| - // Deliver frame2 to stream2 out of order. The decompressor is not
|
| - // available yet, so no data will be processed. The compressed data
|
| - // will be buffered until OnDecompressorAvailable() is called
|
| - // to process it.
|
| - stream2_->OnStreamFrame(frame2);
|
| - EXPECT_EQ("", stream2_->data());
|
| -
|
| - // Now deliver frame1 to stream1. The decompressor is available so
|
| - // the data will be processed, and the decompressor will become
|
| - // available for stream2.
|
| - stream_->OnStreamFrame(frame1);
|
| - EXPECT_EQ(decompressed_headers1, stream_->data());
|
| -
|
| - // Verify that the decompressor is available, and inform stream2
|
| - // that it can now decompress the buffered compressed data. Since
|
| - // the compressed data is incomplete it will not be passed to
|
| - // the stream.
|
| - EXPECT_EQ(2u, session_->decompressor()->current_header_id());
|
| - stream2_->OnDecompressorAvailable();
|
| - EXPECT_EQ("", stream2_->data());
|
| -
|
| - // Now send remaining data and verify that we have now received the
|
| - // compressed headers.
|
| - string remaining_compressed_headers =
|
| - compressed_headers2.substr(partial_compressed_headers.length());
|
| -
|
| - QuicStreamFrame frame3(stream2_->id(), false,
|
| - partial_compressed_headers.length(),
|
| - MakeIOVector(remaining_compressed_headers));
|
| - stream2_->OnStreamFrame(frame3);
|
| - EXPECT_EQ(decompressed_headers2, stream2_->data());
|
| -}
|
| -
|
| -TEST_F(ReliableQuicStreamTest, ProcessHeadersEarly) {
|
| - Initialize(kShouldProcessData);
|
| -
|
| - string compressed_headers1 = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - QuicStreamFrame frame1(
|
| - stream_->id(), false, 0, MakeIOVector(compressed_headers1));
|
| - string decompressed_headers1 =
|
| - SpdyUtils::SerializeUncompressedHeaders(headers_);
|
| -
|
| - headers_["content-type"] = "text/plain";
|
| - string compressed_headers2 = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - QuicStreamFrame frame2(
|
| - stream2_->id(), false, 0, MakeIOVector(compressed_headers2));
|
| - string decompressed_headers2 =
|
| - SpdyUtils::SerializeUncompressedHeaders(headers_);
|
| -
|
| - // Deliver frame2 to stream2 out of order. The decompressor is not
|
| - // available yet, so no data will be processed. The compressed data
|
| - // will be buffered until OnDecompressorAvailable() is called
|
| - // to process it.
|
| - stream2_->OnStreamFrame(frame2);
|
| - EXPECT_EQ("", stream2_->data());
|
| -
|
| - // Now deliver frame1 to stream1. The decompressor is available so
|
| - // the data will be processed, and the decompressor will become
|
| - // available for stream2.
|
| - stream_->OnStreamFrame(frame1);
|
| - EXPECT_EQ(decompressed_headers1, stream_->data());
|
| -
|
| - // Verify that the decompressor is available, and inform stream2
|
| - // that it can now decompress the buffered compressed data.
|
| - EXPECT_EQ(2u, session_->decompressor()->current_header_id());
|
| - stream2_->OnDecompressorAvailable();
|
| - EXPECT_EQ(decompressed_headers2, stream2_->data());
|
| -}
|
| -
|
| -TEST_F(ReliableQuicStreamTest, ProcessHeadersDelay) {
|
| - Initialize(!kShouldProcessData);
|
| -
|
| - string compressed_headers = compressor_->CompressHeadersWithPriority(
|
| - kHighestPriority, headers_);
|
| - QuicStreamFrame frame1(
|
| - stream_->id(), false, 0, MakeIOVector(compressed_headers));
|
| - string decompressed_headers =
|
| - SpdyUtils::SerializeUncompressedHeaders(headers_);
|
| -
|
| - // Send the headers to the stream and verify they were decompressed.
|
| - stream_->OnStreamFrame(frame1);
|
| - EXPECT_EQ(2u, session_->decompressor()->current_header_id());
|
| -
|
| - // Verify that we are now able to handle the body data,
|
| - // even though the stream has not processed the headers.
|
| - EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_HEADER_ID))
|
| - .Times(0);
|
| - QuicStreamFrame frame2(stream_->id(), false, compressed_headers.length(),
|
| - MakeIOVector("body data"));
|
| - stream_->OnStreamFrame(frame2);
|
| -}
|
| -
|
| } // namespace
|
| } // namespace test
|
| } // namespace net
|
|
|