| Index: net/quic/quic_stream_sequencer_test.cc
|
| diff --git a/net/quic/quic_stream_sequencer_test.cc b/net/quic/quic_stream_sequencer_test.cc
|
| index 0b7d8fe45e79550ae9c3a0fd0223fce5e4806f98..0d9e82bf443762f4cb11fcb3b5675db5c9cadd56 100644
|
| --- a/net/quic/quic_stream_sequencer_test.cc
|
| +++ b/net/quic/quic_stream_sequencer_test.cc
|
| @@ -19,6 +19,7 @@
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| using base::StringPiece;
|
| +using std::map;
|
| using std::min;
|
| using std::pair;
|
| using std::vector;
|
| @@ -379,6 +380,66 @@ TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) {
|
| }
|
| }
|
|
|
| +TEST_F(QuicStreamSequencerTest, FrameOverlapsBufferedData) {
|
| + // Ensure that FrameOverlapsBufferedData returns appropriate responses when
|
| + // there is existing data buffered.
|
| +
|
| + map<QuicStreamOffset, string>* buffered_frames =
|
| + QuicStreamSequencerPeer::GetBufferedFrames(sequencer_.get());
|
| +
|
| + const int kBufferedOffset = 10;
|
| + const int kBufferedDataLength = 3;
|
| + const int kNewDataLength = 3;
|
| + IOVector data = MakeIOVector(string(kNewDataLength, '.'));
|
| +
|
| + // No overlap if no buffered frames.
|
| + EXPECT_TRUE(buffered_frames_->empty());
|
| + EXPECT_FALSE(sequencer_->FrameOverlapsBufferedData(
|
| + QuicStreamFrame(1, false, kBufferedOffset - 1, data)));
|
| +
|
| + // Add a buffered frame.
|
| + buffered_frames->insert(
|
| + make_pair(kBufferedOffset, string(kBufferedDataLength, '.')));
|
| +
|
| + // New byte range partially overlaps with buffered frame, start offset
|
| + // preceeding buffered frame.
|
| + EXPECT_TRUE(sequencer_->FrameOverlapsBufferedData(
|
| + QuicStreamFrame(1, false, kBufferedOffset - 1, data)));
|
| + EXPECT_TRUE(sequencer_->FrameOverlapsBufferedData(
|
| + QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength + 1, data)));
|
| +
|
| + // New byte range partially overlaps with buffered frame, start offset
|
| + // inside existing buffered frame.
|
| + EXPECT_TRUE(sequencer_->FrameOverlapsBufferedData(
|
| + QuicStreamFrame(1, false, kBufferedOffset + 1, data)));
|
| + EXPECT_TRUE(sequencer_->FrameOverlapsBufferedData(QuicStreamFrame(
|
| + 1, false, kBufferedOffset + kBufferedDataLength - 1, data)));
|
| +
|
| + // New byte range entirely outside of buffered frames, start offset preceeding
|
| + // buffered frame.
|
| + EXPECT_FALSE(sequencer_->FrameOverlapsBufferedData(
|
| + QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data)));
|
| +
|
| + // New byte range entirely outside of buffered frames, start offset later than
|
| + // buffered frame.
|
| + EXPECT_FALSE(sequencer_->FrameOverlapsBufferedData(QuicStreamFrame(
|
| + 1, false, kBufferedOffset + kBufferedDataLength, data)));
|
| +}
|
| +
|
| +TEST_F(QuicStreamSequencerTest, DontAcceptOverlappingFrames) {
|
| + // The peer should never send us non-identical stream frames which contain
|
| + // overlapping byte ranges - if they do, we close the connection.
|
| +
|
| + QuicStreamFrame frame1(kClientDataStreamId1, false, 1, MakeIOVector("hello"));
|
| + sequencer_->OnStreamFrame(frame1);
|
| +
|
| + QuicStreamFrame frame2(kClientDataStreamId1, false, 2, MakeIOVector("hello"));
|
| + EXPECT_TRUE(sequencer_->FrameOverlapsBufferedData(frame2));
|
| + EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _))
|
| + .Times(1);
|
| + sequencer_->OnStreamFrame(frame2);
|
| +}
|
| +
|
| } // namespace
|
| } // namespace test
|
| } // namespace net
|
|
|