Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(285)

Side by Side Diff: net/quic/quic_stream_sequencer_test.cc

Issue 1414573004: Introduces QuicStreamSequencerBufferInterface with one implementation. Refactor, no behavior change. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing the build file (previously missing a comma) Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_stream_sequencer.h" 5 #include "net/quic/quic_stream_sequencer.h"
6 6
7 #include <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/rand_util.h" 11 #include "base/rand_util.h"
12 #include "net/base/ip_endpoint.h" 12 #include "net/base/ip_endpoint.h"
13 #include "net/quic/quic_frame_list.h"
13 #include "net/quic/quic_utils.h" 14 #include "net/quic/quic_utils.h"
14 #include "net/quic/reliable_quic_stream.h" 15 #include "net/quic/reliable_quic_stream.h"
15 #include "net/quic/test_tools/mock_clock.h" 16 #include "net/quic/test_tools/mock_clock.h"
16 #include "net/quic/test_tools/quic_stream_sequencer_peer.h" 17 #include "net/quic/test_tools/quic_stream_sequencer_peer.h"
17 #include "net/quic/test_tools/quic_test_utils.h" 18 #include "net/quic/test_tools/quic_test_utils.h"
18 #include "net/test/gtest_util.h" 19 #include "net/test/gtest_util.h"
19 #include "testing/gmock/include/gmock/gmock.h" 20 #include "testing/gmock/include/gmock/gmock.h"
20 #include "testing/gmock_mutant.h" 21 #include "testing/gmock_mutant.h"
21 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
22 23
(...skipping 13 matching lines...) Expand all
36 namespace net { 37 namespace net {
37 namespace test { 38 namespace test {
38 39
39 class MockStream : public ReliableQuicStream { 40 class MockStream : public ReliableQuicStream {
40 public: 41 public:
41 MockStream(QuicSession* session, QuicStreamId id) 42 MockStream(QuicSession* session, QuicStreamId id)
42 : ReliableQuicStream(id, session) {} 43 : ReliableQuicStream(id, session) {}
43 44
44 MOCK_METHOD0(OnFinRead, void()); 45 MOCK_METHOD0(OnFinRead, void());
45 MOCK_METHOD0(OnDataAvailable, void()); 46 MOCK_METHOD0(OnDataAvailable, void());
46 MOCK_METHOD2(CloseConnectionWithDetails, void(QuicErrorCode error, 47 MOCK_METHOD2(CloseConnectionWithDetails,
47 const string& details)); 48 void(QuicErrorCode error, const string& details));
48 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); 49 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error));
49 MOCK_METHOD0(OnCanWrite, void()); 50 MOCK_METHOD0(OnCanWrite, void());
50 QuicPriority EffectivePriority() const override { 51 QuicPriority EffectivePriority() const override {
51 return QuicUtils::HighestPriority(); 52 return QuicUtils::HighestPriority();
52 } 53 }
53 virtual bool IsFlowControlEnabled() const { return true; } 54 virtual bool IsFlowControlEnabled() const { return true; }
54 }; 55 };
55 56
56 namespace { 57 namespace {
57 58
(...skipping 13 matching lines...) Expand all
71 72
72 protected: 73 protected:
73 QuicStreamSequencerTest() 74 QuicStreamSequencerTest()
74 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)), 75 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)),
75 session_(connection_), 76 session_(connection_),
76 stream_(&session_, 1), 77 stream_(&session_, 1),
77 sequencer_(new QuicStreamSequencer(&stream_, &clock_)) {} 78 sequencer_(new QuicStreamSequencer(&stream_, &clock_)) {}
78 79
79 bool VerifyReadableRegion(const char** expected) { 80 bool VerifyReadableRegion(const char** expected) {
80 iovec iovecs[1]; 81 iovec iovecs[1];
81 if (sequencer_->GetReadableRegion(iovecs, nullptr)) { 82 QuicTime timestamp = clock_.ApproximateNow();
83 if (sequencer_->GetReadableRegion(iovecs, &timestamp)) {
82 return (VerifyIovecs(iovecs, 1, expected, 1)); 84 return (VerifyIovecs(iovecs, 1, expected, 1));
83 } 85 }
84 return false; 86 return false;
85 } 87 }
86 88
87 bool VerifyReadableRegions(const char** expected, size_t num_expected) { 89 bool VerifyReadableRegions(const char** expected, size_t num_expected) {
88 iovec iovecs[5]; 90 iovec iovecs[5];
89 size_t num_iovecs = 91 size_t num_iovecs =
90 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs)); 92 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs));
91 return VerifyReadableRegion(expected) && 93 return VerifyReadableRegion(expected) &&
(...skipping 12 matching lines...) Expand all
104 for (size_t i = 0; i < num_expected; ++i) { 106 for (size_t i = 0; i < num_expected; ++i) {
105 if (!VerifyIovec(iovecs[i], expected[i])) { 107 if (!VerifyIovec(iovecs[i], expected[i])) {
106 return false; 108 return false;
107 } 109 }
108 } 110 }
109 return true; 111 return true;
110 } 112 }
111 113
112 bool VerifyIovec(const iovec& iovec, StringPiece expected) { 114 bool VerifyIovec(const iovec& iovec, StringPiece expected) {
113 if (iovec.iov_len != expected.length()) { 115 if (iovec.iov_len != expected.length()) {
114 LOG(ERROR) << "Invalid length: " << iovec.iov_len 116 LOG(ERROR) << "Invalid length: " << iovec.iov_len << " vs "
115 << " vs " << expected.length(); 117 << expected.length();
116 return false; 118 return false;
117 } 119 }
118 if (memcmp(iovec.iov_base, expected.data(), expected.length()) != 0) { 120 if (memcmp(iovec.iov_base, expected.data(), expected.length()) != 0) {
119 LOG(ERROR) << "Invalid data: " << static_cast<char*>(iovec.iov_base) 121 LOG(ERROR) << "Invalid data: " << static_cast<char*>(iovec.iov_base)
120 << " vs " << expected; 122 << " vs " << expected;
121 return false; 123 return false;
122 } 124 }
123 return true; 125 return true;
124 } 126 }
125 127
126 void OnFinFrame(QuicStreamOffset byte_offset, const char* data) { 128 void OnFinFrame(QuicStreamOffset byte_offset, const char* data) {
127 QuicStreamFrame frame; 129 QuicStreamFrame frame;
128 frame.stream_id = 1; 130 frame.stream_id = 1;
129 frame.offset = byte_offset; 131 frame.offset = byte_offset;
130 frame.data = StringPiece(data); 132 frame.data = StringPiece(data);
131 frame.fin = true; 133 frame.fin = true;
132 sequencer_->OnStreamFrame(frame); 134 sequencer_->OnStreamFrame(frame);
133 } 135 }
134 136
135 void OnFrame(QuicStreamOffset byte_offset, const char* data) { 137 void OnFrame(QuicStreamOffset byte_offset, const char* data) {
136 QuicStreamFrame frame; 138 QuicStreamFrame frame;
137 frame.stream_id = 1; 139 frame.stream_id = 1;
138 frame.offset = byte_offset; 140 frame.offset = byte_offset;
139 frame.data = StringPiece(data); 141 frame.data = StringPiece(data);
140 frame.fin = false; 142 frame.fin = false;
141 sequencer_->OnStreamFrame(frame); 143 sequencer_->OnStreamFrame(frame);
142 } 144 }
143 145
144 size_t NumBufferedFrames() { 146 size_t NumBufferedBytes() {
145 return QuicStreamSequencerPeer::GetNumBufferedFrames(sequencer_.get()); 147 return QuicStreamSequencerPeer::GetNumBufferedBytes(sequencer_.get());
146 }
147
148 bool FrameOverlapsBufferedData(const QuicStreamFrame& frame) {
149 return QuicStreamSequencerPeer::FrameOverlapsBufferedData(sequencer_.get(),
150 frame);
151 } 148 }
152 149
153 MockHelper helper_; 150 MockHelper helper_;
154 MockConnection* connection_; 151 MockConnection* connection_;
155 MockClock clock_; 152 MockClock clock_;
156 MockQuicSpdySession session_; 153 MockQuicSpdySession session_;
157 testing::StrictMock<MockStream> stream_; 154 testing::StrictMock<MockStream> stream_;
158 scoped_ptr<QuicStreamSequencer> sequencer_; 155 scoped_ptr<QuicStreamSequencer> sequencer_;
159 }; 156 };
160 157
161 // TODO(rch): reorder these tests so they build on each other. 158 // TODO(rch): reorder these tests so they build on each other.
162 159
163 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { 160 TEST_F(QuicStreamSequencerTest, RejectOldFrame) {
164 EXPECT_CALL(stream_, OnDataAvailable()) 161 EXPECT_CALL(stream_, OnDataAvailable())
165 .WillOnce(testing::Invoke( 162 .WillOnce(testing::Invoke(
166 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 163 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
167 164
168 OnFrame(0, "abc"); 165 OnFrame(0, "abc");
169 166
170 EXPECT_EQ(0u, NumBufferedFrames()); 167 EXPECT_EQ(0u, NumBufferedBytes());
171 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); 168 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
172 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); 169 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed());
173 // Ignore this - it matches a past packet number and we should not see it 170 // Ignore this - it matches a past packet number and we should not see it
174 // again. 171 // again.
175 OnFrame(0, "def"); 172 OnFrame(0, "def");
176 EXPECT_EQ(0u, NumBufferedFrames()); 173 EXPECT_EQ(0u, NumBufferedBytes());
177 } 174 }
178 175
179 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { 176 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) {
180 EXPECT_CALL(stream_, OnDataAvailable()); 177 EXPECT_CALL(stream_, OnDataAvailable());
181 178
182 OnFrame(0, "abc"); 179 OnFrame(0, "abc");
183 EXPECT_EQ(1u, NumBufferedFrames()); 180 EXPECT_EQ(3u, NumBufferedBytes());
184 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 181 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
185 182
186 // Ignore this - it matches a buffered frame. 183 // Ignore this - it matches a buffered frame.
187 // Right now there's no checking that the payload is consistent. 184 // Right now there's no checking that the payload is consistent.
188 OnFrame(0, "def"); 185 OnFrame(0, "def");
189 EXPECT_EQ(1u, NumBufferedFrames()); 186 EXPECT_EQ(3u, NumBufferedBytes());
190 } 187 }
191 188
192 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { 189 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) {
193 EXPECT_CALL(stream_, OnDataAvailable()) 190 EXPECT_CALL(stream_, OnDataAvailable())
194 .WillOnce(testing::Invoke( 191 .WillOnce(testing::Invoke(
195 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 192 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
196 193
197 OnFrame(0, "abc"); 194 OnFrame(0, "abc");
198 EXPECT_EQ(0u, NumBufferedFrames()); 195 EXPECT_EQ(0u, NumBufferedBytes());
199 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); 196 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
200 } 197 }
201 198
202 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { 199 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) {
203 sequencer_->SetBlockedUntilFlush(); 200 sequencer_->SetBlockedUntilFlush();
204 201
205 OnFrame(0, "abc"); 202 OnFrame(0, "abc");
206 EXPECT_EQ(1u, NumBufferedFrames()); 203 EXPECT_EQ(3u, NumBufferedBytes());
207 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 204 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
208 205
209 EXPECT_CALL(stream_, OnDataAvailable()) 206 EXPECT_CALL(stream_, OnDataAvailable())
210 .WillOnce(testing::Invoke( 207 .WillOnce(testing::Invoke(
211 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 208 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
212 sequencer_->SetUnblocked(); 209 sequencer_->SetUnblocked();
213 EXPECT_EQ(0u, NumBufferedFrames()); 210 EXPECT_EQ(0u, NumBufferedBytes());
214 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); 211 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
215 212
216 EXPECT_CALL(stream_, OnDataAvailable()) 213 EXPECT_CALL(stream_, OnDataAvailable())
217 .WillOnce(testing::Invoke( 214 .WillOnce(testing::Invoke(
218 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 215 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
219 EXPECT_FALSE(sequencer_->IsClosed()); 216 EXPECT_FALSE(sequencer_->IsClosed());
220 OnFinFrame(3, "def"); 217 OnFinFrame(3, "def");
221 EXPECT_TRUE(sequencer_->IsClosed()); 218 EXPECT_TRUE(sequencer_->IsClosed());
222 } 219 }
223 220
224 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { 221 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) {
225 sequencer_->SetBlockedUntilFlush(); 222 sequencer_->SetBlockedUntilFlush();
226 223
227 OnFinFrame(0, "abc"); 224 OnFinFrame(0, "abc");
228 EXPECT_EQ(1u, NumBufferedFrames()); 225 EXPECT_EQ(3u, NumBufferedBytes());
229 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 226 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
230 227
231 EXPECT_CALL(stream_, OnDataAvailable()) 228 EXPECT_CALL(stream_, OnDataAvailable())
232 .WillOnce(testing::Invoke( 229 .WillOnce(testing::Invoke(
233 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 230 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
234 EXPECT_FALSE(sequencer_->IsClosed()); 231 EXPECT_FALSE(sequencer_->IsClosed());
235 sequencer_->SetUnblocked(); 232 sequencer_->SetUnblocked();
236 EXPECT_TRUE(sequencer_->IsClosed()); 233 EXPECT_TRUE(sequencer_->IsClosed());
237 EXPECT_EQ(0u, NumBufferedFrames()); 234 EXPECT_EQ(0u, NumBufferedBytes());
238 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); 235 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
239 } 236 }
240 237
241 TEST_F(QuicStreamSequencerTest, EmptyFrame) { 238 TEST_F(QuicStreamSequencerTest, EmptyFrame) {
242 EXPECT_CALL(stream_, 239 EXPECT_CALL(stream_,
243 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); 240 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _));
244 OnFrame(0, ""); 241 OnFrame(0, "");
245 EXPECT_EQ(0u, NumBufferedFrames()); 242 EXPECT_EQ(0u, NumBufferedBytes());
246 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 243 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
247 } 244 }
248 245
249 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) { 246 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) {
250 EXPECT_CALL(stream_, OnDataAvailable()); 247 EXPECT_CALL(stream_, OnDataAvailable());
251 OnFinFrame(0, ""); 248 OnFinFrame(0, "");
252 EXPECT_EQ(0u, NumBufferedFrames()); 249 EXPECT_EQ(0u, NumBufferedBytes());
253 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 250 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
254 } 251 }
255 252
256 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { 253 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) {
257 EXPECT_CALL(stream_, OnDataAvailable()) 254 EXPECT_CALL(stream_, OnDataAvailable())
258 .WillOnce(testing::Invoke( 255 .WillOnce(testing::Invoke(
259 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 2))); 256 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 2)));
260 257
261 OnFrame(0, "abc"); 258 OnFrame(0, "abc");
262 EXPECT_EQ(1u, NumBufferedFrames()); 259 EXPECT_EQ(1u, NumBufferedBytes());
263 EXPECT_EQ(2u, sequencer_->num_bytes_consumed()); 260 EXPECT_EQ(2u, sequencer_->NumBytesConsumed());
264 } 261 }
265 262
266 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { 263 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) {
267 EXPECT_CALL(stream_, OnDataAvailable()); 264 EXPECT_CALL(stream_, OnDataAvailable());
268 265
269 OnFrame(0, "abc"); 266 OnFrame(0, "abc");
270 EXPECT_EQ(1u, NumBufferedFrames()); 267 EXPECT_EQ(3u, NumBufferedBytes());
271 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 268 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
272 EXPECT_EQ(0, sequencer_->num_early_frames_received()); 269 EXPECT_EQ(0, sequencer_->num_early_frames_received());
273 } 270 }
274 271
275 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { 272 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) {
276 OnFrame(3, "abc"); 273 OnFrame(3, "abc");
277 EXPECT_EQ(1u, NumBufferedFrames()); 274 EXPECT_EQ(3u, NumBufferedBytes());
278 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 275 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
279 EXPECT_EQ(1, sequencer_->num_early_frames_received()); 276 EXPECT_EQ(1, sequencer_->num_early_frames_received());
280 } 277 }
281 278
282 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { 279 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) {
283 // Buffer the first 280 // Buffer the first
284 OnFrame(6, "ghi"); 281 OnFrame(6, "ghi");
285 EXPECT_EQ(1u, NumBufferedFrames()); 282 EXPECT_EQ(3u, NumBufferedBytes());
286 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 283 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
287 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); 284 EXPECT_EQ(3u, sequencer_->NumBytesBuffered());
288 // Buffer the second 285 // Buffer the second
289 OnFrame(3, "def"); 286 OnFrame(3, "def");
290 EXPECT_EQ(2u, NumBufferedFrames()); 287 EXPECT_EQ(6u, NumBufferedBytes());
291 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 288 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
292 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); 289 EXPECT_EQ(6u, sequencer_->NumBytesBuffered());
293 290
294 EXPECT_CALL(stream_, OnDataAvailable()) 291 EXPECT_CALL(stream_, OnDataAvailable())
295 .WillOnce(testing::Invoke( 292 .WillOnce(testing::Invoke(
296 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 9))); 293 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 9)));
297 294
298 // Now process all of them at once. 295 // Now process all of them at once.
299 OnFrame(0, "abc"); 296 OnFrame(0, "abc");
300 EXPECT_EQ(9u, sequencer_->num_bytes_consumed()); 297 EXPECT_EQ(9u, sequencer_->NumBytesConsumed());
301 EXPECT_EQ(0u, sequencer_->num_bytes_buffered()); 298 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
302 299
303 EXPECT_EQ(0u, NumBufferedFrames()); 300 EXPECT_EQ(0u, NumBufferedBytes());
304 } 301 }
305 302
306 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { 303 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) {
307 InSequence s; 304 InSequence s;
308 305
309 EXPECT_CALL(stream_, OnDataAvailable()) 306 EXPECT_CALL(stream_, OnDataAvailable())
310 .WillOnce(testing::Invoke( 307 .WillOnce(testing::Invoke(
311 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 308 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
312 OnFinFrame(0, "abc"); 309 OnFinFrame(0, "abc");
313 310
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 441
445 while (output_.size() != arraysize(kPayload) - 1) { 442 while (output_.size() != arraysize(kPayload) - 1) {
446 if (!list_.empty() && (base::RandUint64() % 2 == 0)) { // Send data 443 if (!list_.empty() && (base::RandUint64() % 2 == 0)) { // Send data
447 int index = OneToN(list_.size()) - 1; 444 int index = OneToN(list_.size()) - 1;
448 OnFrame(list_[index].first, list_[index].second.data()); 445 OnFrame(list_[index].first, list_[index].second.data());
449 list_.erase(list_.begin() + index); 446 list_.erase(list_.begin() + index);
450 } else { // Read data 447 } else { // Read data
451 bool has_bytes = sequencer_->HasBytesToRead(); 448 bool has_bytes = sequencer_->HasBytesToRead();
452 iovec peek_iov[20]; 449 iovec peek_iov[20];
453 int iovs_peeked = sequencer_->GetReadableRegions(peek_iov, 20); 450 int iovs_peeked = sequencer_->GetReadableRegions(peek_iov, 20);
451 QuicTime timestamp = clock_.ApproximateNow();
454 if (has_bytes) { 452 if (has_bytes) {
455 ASSERT_LT(0, iovs_peeked); 453 ASSERT_LT(0, iovs_peeked);
456 ASSERT_TRUE(sequencer_->GetReadableRegion(peek_iov, nullptr)); 454 ASSERT_TRUE(sequencer_->GetReadableRegion(peek_iov, &timestamp));
457 } else { 455 } else {
458 ASSERT_EQ(0, iovs_peeked); 456 ASSERT_EQ(0, iovs_peeked);
459 ASSERT_FALSE(sequencer_->GetReadableRegion(peek_iov, nullptr)); 457 ASSERT_FALSE(sequencer_->GetReadableRegion(peek_iov, &timestamp));
460 } 458 }
461 int total_bytes_to_peek = arraysize(buffer); 459 int total_bytes_to_peek = arraysize(buffer);
462 for (int i = 0; i < iovs_peeked; ++i) { 460 for (int i = 0; i < iovs_peeked; ++i) {
463 int bytes_to_peek = min<int>(peek_iov[i].iov_len, total_bytes_to_peek); 461 int bytes_to_peek = min<int>(peek_iov[i].iov_len, total_bytes_to_peek);
464 peeked_.append(static_cast<char*>(peek_iov[i].iov_base), bytes_to_peek); 462 peeked_.append(static_cast<char*>(peek_iov[i].iov_base), bytes_to_peek);
465 total_bytes_to_peek -= bytes_to_peek; 463 total_bytes_to_peek -= bytes_to_peek;
466 if (total_bytes_to_peek == 0) { 464 if (total_bytes_to_peek == 0) {
467 break; 465 break;
468 } 466 }
469 } 467 }
470 int bytes_read = sequencer_->Readv(iov, 2); 468 int bytes_read = sequencer_->Readv(iov, 2);
471 output_.append(buffer, bytes_read); 469 output_.append(buffer, bytes_read);
472 ASSERT_EQ(output_.size(), peeked_.size()); 470 ASSERT_EQ(output_.size(), peeked_.size());
473 } 471 }
474 } 472 }
475 EXPECT_EQ(string(kPayload), output_); 473 EXPECT_EQ(string(kPayload), output_);
476 EXPECT_EQ(string(kPayload), peeked_); 474 EXPECT_EQ(string(kPayload), peeked_);
477 } 475 }
478 476
479 // Same as above, just using a different method for reading. 477 // Same as above, just using a different method for reading.
480 TEST_F(QuicStreamSequencerTest, MarkConsumed) { 478 TEST_F(QuicStreamSequencerTest, MarkConsumed) {
481 InSequence s; 479 InSequence s;
482 EXPECT_CALL(stream_, OnDataAvailable()); 480 EXPECT_CALL(stream_, OnDataAvailable());
483 481
484 OnFrame(0, "abc"); 482 OnFrame(0, "abc");
485 OnFrame(3, "def"); 483 OnFrame(3, "def");
486 OnFrame(6, "ghi"); 484 OnFrame(6, "ghi");
487 485
488 // abcdefghi buffered. 486 // abcdefghi buffered.
489 EXPECT_EQ(9u, sequencer_->num_bytes_buffered()); 487 EXPECT_EQ(9u, sequencer_->NumBytesBuffered());
490 488
491 // Peek into the data. 489 // Peek into the data.
492 const char* expected[] = {"abc", "def", "ghi"}; 490 const char* expected[] = {"abc", "def", "ghi"};
493 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); 491 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
494 492
495 // Consume 1 byte. 493 // Consume 1 byte.
496 sequencer_->MarkConsumed(1); 494 sequencer_->MarkConsumed(1);
497 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed()); 495 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed());
498 // Verify data. 496 // Verify data.
499 const char* expected2[] = {"bc", "def", "ghi"}; 497 const char* expected2[] = {"bc", "def", "ghi"};
500 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2))); 498 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2)));
501 EXPECT_EQ(8u, sequencer_->num_bytes_buffered()); 499 EXPECT_EQ(8u, sequencer_->NumBytesBuffered());
502 500
503 // Consume 2 bytes. 501 // Consume 2 bytes.
504 sequencer_->MarkConsumed(2); 502 sequencer_->MarkConsumed(2);
505 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); 503 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed());
506 // Verify data. 504 // Verify data.
507 const char* expected3[] = {"def", "ghi"}; 505 const char* expected3[] = {"def", "ghi"};
508 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3))); 506 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3)));
509 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); 507 EXPECT_EQ(6u, sequencer_->NumBytesBuffered());
510 508
511 // Consume 5 bytes. 509 // Consume 5 bytes.
512 sequencer_->MarkConsumed(5); 510 sequencer_->MarkConsumed(5);
513 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed()); 511 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed());
514 // Verify data. 512 // Verify data.
515 const char* expected4[] = {"i"}; 513 const char* expected4[] = {"i"};
516 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); 514 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4)));
517 EXPECT_EQ(1u, sequencer_->num_bytes_buffered()); 515 EXPECT_EQ(1u, sequencer_->NumBytesBuffered());
518 } 516 }
519 517
520 TEST_F(QuicStreamSequencerTest, MarkConsumedError) { 518 TEST_F(QuicStreamSequencerTest, MarkConsumedError) {
521 EXPECT_CALL(stream_, OnDataAvailable()); 519 EXPECT_CALL(stream_, OnDataAvailable());
522 520
523 OnFrame(0, "abc"); 521 OnFrame(0, "abc");
524 OnFrame(9, "jklmnopqrstuvwxyz"); 522 OnFrame(9, "jklmnopqrstuvwxyz");
525 523
526 // Peek into the data. Only the first chunk should be readable because of the 524 // Peek into the data. Only the first chunk should be readable because of the
527 // missing data. 525 // missing data.
(...skipping 16 matching lines...) Expand all
544 OnFrame(3, "def"); 542 OnFrame(3, "def");
545 // Missing packet: 6, ghi. 543 // Missing packet: 6, ghi.
546 OnFrame(9, "jkl"); 544 OnFrame(9, "jkl");
547 545
548 const char* expected[] = {"abc", "def"}; 546 const char* expected[] = {"abc", "def"};
549 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); 547 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
550 548
551 sequencer_->MarkConsumed(6); 549 sequencer_->MarkConsumed(6);
552 } 550 }
553 551
554 TEST_F(QuicStreamSequencerTest, FrameOverlapsBufferedData) { 552 TEST(QuicFrameListTest, FrameOverlapsBufferedData) {
553 QuicFrameList buffer;
554
555 // Ensure that FrameOverlapsBufferedData returns appropriate responses when 555 // Ensure that FrameOverlapsBufferedData returns appropriate responses when
556 // there is existing data buffered. 556 // there is existing data buffered.
557 const int kBufferedOffset = 10; 557 const int kBufferedOffset = 10;
558 const int kBufferedDataLength = 3; 558 const int kBufferedDataLength = 3;
559 const int kNewDataLength = 3; 559 const int kNewDataLength = 3;
560 string data(kNewDataLength, '.'); 560 string data(kNewDataLength, '.');
561 561
562 // No overlap if no buffered frames. 562 // No overlap if no buffered frames.
563 EXPECT_EQ(0u, NumBufferedFrames()); 563 EXPECT_EQ(0u, buffer.BytesBuffered());
564 size_t bytes_written;
564 // Add a buffered frame. 565 // Add a buffered frame.
565 sequencer_->OnStreamFrame(QuicStreamFrame(1, false, kBufferedOffset, 566 buffer.OnStreamData(
566 string(kBufferedDataLength, '.'))); 567 kBufferedOffset,
568 StringPiece(string(kBufferedDataLength, '.').data(), kBufferedDataLength),
569 QuicTime::Zero(), &bytes_written);
567 570
568 // New byte range partially overlaps with buffered frame, start offset 571 // New byte range partially overlaps with buffered frame, start offset
569 // preceding buffered frame. 572 // preceding buffered frame.
570 EXPECT_TRUE(FrameOverlapsBufferedData( 573 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData(
571 QuicStreamFrame(1, false, kBufferedOffset - 1, data))); 574 &buffer, QuicStreamFrame(1, false, kBufferedOffset - 1, data)));
572 EXPECT_TRUE(FrameOverlapsBufferedData( 575 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData(
576 &buffer,
573 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength + 1, data))); 577 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength + 1, data)));
574 578
575 // New byte range partially overlaps with buffered frame, start offset inside 579 // New byte range partially overlaps with buffered frame, start offset inside
576 // existing buffered frame. 580 // existing buffered frame.
577 EXPECT_TRUE(FrameOverlapsBufferedData( 581 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData(
578 QuicStreamFrame(1, false, kBufferedOffset + 1, data))); 582 &buffer, QuicStreamFrame(1, false, kBufferedOffset + 1, data)));
579 EXPECT_TRUE(FrameOverlapsBufferedData(QuicStreamFrame( 583 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData(
580 1, false, kBufferedOffset + kBufferedDataLength - 1, data))); 584 &buffer, QuicStreamFrame(
585 1, false, kBufferedOffset + kBufferedDataLength - 1, data)));
581 586
582 // New byte range entirely outside of buffered frames, start offset preceeding 587 // New byte range entirely outside of buffered frames, start offset
583 // buffered frame. 588 // preceeding buffered frame.
584 EXPECT_FALSE(FrameOverlapsBufferedData( 589 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData(
590 &buffer,
585 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data))); 591 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data)));
586 592
587 // New byte range entirely outside of buffered frames, start offset later than 593 // New byte range entirely outside of buffered frames, start offset later than
588 // buffered frame. 594 // buffered frame.
589 EXPECT_FALSE(FrameOverlapsBufferedData( 595 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData(
596 &buffer,
590 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data))); 597 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data)));
591 } 598 }
592 599
593 TEST_F(QuicStreamSequencerTest, DontAcceptOverlappingFrames) { 600 TEST_F(QuicStreamSequencerTest, DontAcceptOverlappingFrames) {
594 // The peer should never send us non-identical stream frames which contain 601 // The peer should never send us non-identical stream frames which contain
595 // overlapping byte ranges - if they do, we close the connection. 602 // overlapping byte ranges - if they do, we close the connection.
596 603
597 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello")); 604 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello"));
598 sequencer_->OnStreamFrame(frame1); 605 sequencer_->OnStreamFrame(frame1);
599 606
600 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello")); 607 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello"));
601 EXPECT_TRUE(FrameOverlapsBufferedData(frame2));
602 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)) 608 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _))
603 .Times(1); 609 .Times(1);
604 sequencer_->OnStreamFrame(frame2); 610 sequencer_->OnStreamFrame(frame2);
605 } 611 }
606 612
607 TEST_F(QuicStreamSequencerTest, InOrderTimestamps) { 613 TEST_F(QuicStreamSequencerTest, InOrderTimestamps) {
608 // This test verifies that timestamps returned by 614 // This test verifies that timestamps returned by
609 // GetReadableRegion() are in the correct sequence when frames 615 // GetReadableRegion() are in the correct sequence when frames
610 // arrive at the sequencer in order. 616 // arrive at the sequencer in order.
611 EXPECT_CALL(stream_, OnDataAvailable()); 617 EXPECT_CALL(stream_, OnDataAvailable());
612 618
613 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 619 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
614 620
615 // Buffer the first frame. 621 // Buffer the first frame.
616 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 622 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
617 QuicTime t1 = clock_.ApproximateNow(); 623 QuicTime t1 = clock_.ApproximateNow();
618 OnFrame(0, "abc"); 624 OnFrame(0, "abc");
619 EXPECT_EQ(1u, NumBufferedFrames()); 625 EXPECT_EQ(3u, NumBufferedBytes());
620 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 626 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
621 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); 627 EXPECT_EQ(3u, sequencer_->NumBytesBuffered());
622 // Buffer the second frame. 628 // Buffer the second frame.
623 QuicTime t2 = clock_.ApproximateNow(); 629 QuicTime t2 = clock_.ApproximateNow();
624 OnFrame(3, "def"); 630 OnFrame(3, "def");
625 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 631 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
626 EXPECT_EQ(2u, NumBufferedFrames()); 632 EXPECT_EQ(6u, NumBufferedBytes());
627 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 633 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
628 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); 634 EXPECT_EQ(6u, sequencer_->NumBytesBuffered());
629 635
630 iovec iovecs[1]; 636 iovec iovecs[1];
631 QuicTime timestamp(QuicTime::Zero()); 637 QuicTime timestamp(QuicTime::Zero());
632 638
633 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp)); 639 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp));
634 EXPECT_EQ(timestamp, t1); 640 EXPECT_EQ(timestamp, t1);
635 QuicStreamSequencerTest::ConsumeData(3); 641 QuicStreamSequencerTest::ConsumeData(3);
636 EXPECT_EQ(1u, NumBufferedFrames()); 642 EXPECT_EQ(3u, NumBufferedBytes());
637 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); 643 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
638 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); 644 EXPECT_EQ(3u, sequencer_->NumBytesBuffered());
639 645
640 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp)); 646 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp));
641 EXPECT_EQ(timestamp, t2); 647 EXPECT_EQ(timestamp, t2);
642 QuicStreamSequencerTest::ConsumeData(3); 648 QuicStreamSequencerTest::ConsumeData(3);
643 EXPECT_EQ(0u, NumBufferedFrames()); 649 EXPECT_EQ(0u, NumBufferedBytes());
644 EXPECT_EQ(6u, sequencer_->num_bytes_consumed()); 650 EXPECT_EQ(6u, sequencer_->NumBytesConsumed());
645 EXPECT_EQ(0u, sequencer_->num_bytes_buffered()); 651 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
646 } 652 }
647 653
648 TEST_F(QuicStreamSequencerTest, OutOfOrderTimestamps) { 654 TEST_F(QuicStreamSequencerTest, OutOfOrderTimestamps) {
649 // This test verifies that timestamps returned by 655 // This test verifies that timestamps returned by
650 // GetReadableRegion() are in the correct sequence when frames 656 // GetReadableRegion() are in the correct sequence when frames
651 // arrive at the sequencer out of order. 657 // arrive at the sequencer out of order.
652 EXPECT_CALL(stream_, OnDataAvailable()); 658 EXPECT_CALL(stream_, OnDataAvailable());
653 659
654 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 660 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
655 661
656 // Buffer the first frame 662 // Buffer the first frame
657 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 663 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
658 QuicTime t1 = clock_.ApproximateNow(); 664 QuicTime t1 = clock_.ApproximateNow();
659 OnFrame(3, "def"); 665 OnFrame(3, "def");
660 EXPECT_EQ(1u, NumBufferedFrames()); 666 EXPECT_EQ(3u, NumBufferedBytes());
661 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 667 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
662 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); 668 EXPECT_EQ(3u, sequencer_->NumBytesBuffered());
663 // Buffer the second frame 669 // Buffer the second frame
664 QuicTime t2 = clock_.ApproximateNow(); 670 QuicTime t2 = clock_.ApproximateNow();
665 OnFrame(0, "abc"); 671 OnFrame(0, "abc");
666 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 672 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
667 EXPECT_EQ(2u, NumBufferedFrames()); 673 EXPECT_EQ(6u, NumBufferedBytes());
668 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 674 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
669 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); 675 EXPECT_EQ(6u, sequencer_->NumBytesBuffered());
670 676
671 iovec iovecs[1]; 677 iovec iovecs[1];
672 QuicTime timestamp(QuicTime::Zero()); 678 QuicTime timestamp(QuicTime::Zero());
673 679
674 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp)); 680 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp));
675 EXPECT_EQ(timestamp, t2); 681 EXPECT_EQ(timestamp, t2);
676 QuicStreamSequencerTest::ConsumeData(3); 682 QuicStreamSequencerTest::ConsumeData(3);
677 EXPECT_EQ(1u, NumBufferedFrames()); 683 EXPECT_EQ(3u, NumBufferedBytes());
678 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); 684 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
679 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); 685 EXPECT_EQ(3u, sequencer_->NumBytesBuffered());
680 686
681 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp)); 687 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp));
682 EXPECT_EQ(timestamp, t1); 688 EXPECT_EQ(timestamp, t1);
683 QuicStreamSequencerTest::ConsumeData(3); 689 QuicStreamSequencerTest::ConsumeData(3);
684 EXPECT_EQ(0u, NumBufferedFrames()); 690 EXPECT_EQ(0u, NumBufferedBytes());
685 EXPECT_EQ(6u, sequencer_->num_bytes_consumed()); 691 EXPECT_EQ(6u, sequencer_->NumBytesConsumed());
686 EXPECT_EQ(0u, sequencer_->num_bytes_buffered()); 692 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
687 } 693 }
688 694
689 } // namespace 695 } // namespace
690 } // namespace test 696 } // namespace test
691 } // namespace net 697 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698