OLD | NEW |
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" |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 | 175 |
176 INSTANTIATE_TEST_CASE_P(QuicStreamSequencerTests, | 176 INSTANTIATE_TEST_CASE_P(QuicStreamSequencerTests, |
177 QuicStreamSequencerTest, | 177 QuicStreamSequencerTest, |
178 ::testing::Values(false, true)); | 178 ::testing::Values(false, true)); |
179 | 179 |
180 // TODO(rch): reorder these tests so they build on each other. | 180 // TODO(rch): reorder these tests so they build on each other. |
181 | 181 |
182 TEST_P(QuicStreamSequencerTest, RejectOldFrame) { | 182 TEST_P(QuicStreamSequencerTest, RejectOldFrame) { |
183 EXPECT_CALL(stream_, OnDataAvailable()) | 183 EXPECT_CALL(stream_, OnDataAvailable()) |
184 .WillOnce(testing::Invoke( | 184 .WillOnce(testing::Invoke( |
185 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 185 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 186 base::Unretained(this), 3))); |
186 | 187 |
187 OnFrame(0, "abc"); | 188 OnFrame(0, "abc"); |
188 | 189 |
189 EXPECT_EQ(0u, NumBufferedBytes()); | 190 EXPECT_EQ(0u, NumBufferedBytes()); |
190 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 191 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
191 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); | 192 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); |
192 // Ignore this - it matches a past packet number and we should not see it | 193 // Ignore this - it matches a past packet number and we should not see it |
193 // again. | 194 // again. |
194 OnFrame(0, "def"); | 195 OnFrame(0, "def"); |
195 EXPECT_EQ(0u, NumBufferedBytes()); | 196 EXPECT_EQ(0u, NumBufferedBytes()); |
196 } | 197 } |
197 | 198 |
198 TEST_P(QuicStreamSequencerTest, RejectBufferedFrame) { | 199 TEST_P(QuicStreamSequencerTest, RejectBufferedFrame) { |
199 EXPECT_CALL(stream_, OnDataAvailable()); | 200 EXPECT_CALL(stream_, OnDataAvailable()); |
200 | 201 |
201 OnFrame(0, "abc"); | 202 OnFrame(0, "abc"); |
202 EXPECT_EQ(3u, NumBufferedBytes()); | 203 EXPECT_EQ(3u, NumBufferedBytes()); |
203 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 204 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
204 | 205 |
205 // Ignore this - it matches a buffered frame. | 206 // Ignore this - it matches a buffered frame. |
206 // Right now there's no checking that the payload is consistent. | 207 // Right now there's no checking that the payload is consistent. |
207 OnFrame(0, "def"); | 208 OnFrame(0, "def"); |
208 EXPECT_EQ(3u, NumBufferedBytes()); | 209 EXPECT_EQ(3u, NumBufferedBytes()); |
209 } | 210 } |
210 | 211 |
211 TEST_P(QuicStreamSequencerTest, FullFrameConsumed) { | 212 TEST_P(QuicStreamSequencerTest, FullFrameConsumed) { |
212 EXPECT_CALL(stream_, OnDataAvailable()) | 213 EXPECT_CALL(stream_, OnDataAvailable()) |
213 .WillOnce(testing::Invoke( | 214 .WillOnce(testing::Invoke( |
214 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 215 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 216 base::Unretained(this), 3))); |
215 | 217 |
216 OnFrame(0, "abc"); | 218 OnFrame(0, "abc"); |
217 EXPECT_EQ(0u, NumBufferedBytes()); | 219 EXPECT_EQ(0u, NumBufferedBytes()); |
218 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 220 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
219 } | 221 } |
220 | 222 |
221 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { | 223 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { |
222 sequencer_->SetBlockedUntilFlush(); | 224 sequencer_->SetBlockedUntilFlush(); |
223 | 225 |
224 OnFrame(0, "abc"); | 226 OnFrame(0, "abc"); |
225 EXPECT_EQ(3u, NumBufferedBytes()); | 227 EXPECT_EQ(3u, NumBufferedBytes()); |
226 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 228 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
227 | 229 |
228 EXPECT_CALL(stream_, OnDataAvailable()) | 230 EXPECT_CALL(stream_, OnDataAvailable()) |
229 .WillOnce(testing::Invoke( | 231 .WillOnce(testing::Invoke( |
230 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 232 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 233 base::Unretained(this), 3))); |
231 sequencer_->SetUnblocked(); | 234 sequencer_->SetUnblocked(); |
232 EXPECT_EQ(0u, NumBufferedBytes()); | 235 EXPECT_EQ(0u, NumBufferedBytes()); |
233 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 236 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
234 | 237 |
235 EXPECT_CALL(stream_, OnDataAvailable()) | 238 EXPECT_CALL(stream_, OnDataAvailable()) |
236 .WillOnce(testing::Invoke( | 239 .WillOnce(testing::Invoke( |
237 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 240 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 241 base::Unretained(this), 3))); |
238 EXPECT_FALSE(sequencer_->IsClosed()); | 242 EXPECT_FALSE(sequencer_->IsClosed()); |
239 OnFinFrame(3, "def"); | 243 OnFinFrame(3, "def"); |
240 EXPECT_TRUE(sequencer_->IsClosed()); | 244 EXPECT_TRUE(sequencer_->IsClosed()); |
241 } | 245 } |
242 | 246 |
243 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { | 247 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { |
244 sequencer_->SetBlockedUntilFlush(); | 248 sequencer_->SetBlockedUntilFlush(); |
245 | 249 |
246 OnFinFrame(0, "abc"); | 250 OnFinFrame(0, "abc"); |
247 EXPECT_EQ(3u, NumBufferedBytes()); | 251 EXPECT_EQ(3u, NumBufferedBytes()); |
248 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 252 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
249 | 253 |
250 EXPECT_CALL(stream_, OnDataAvailable()) | 254 EXPECT_CALL(stream_, OnDataAvailable()) |
251 .WillOnce(testing::Invoke( | 255 .WillOnce(testing::Invoke( |
252 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 256 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 257 base::Unretained(this), 3))); |
253 EXPECT_FALSE(sequencer_->IsClosed()); | 258 EXPECT_FALSE(sequencer_->IsClosed()); |
254 sequencer_->SetUnblocked(); | 259 sequencer_->SetUnblocked(); |
255 EXPECT_TRUE(sequencer_->IsClosed()); | 260 EXPECT_TRUE(sequencer_->IsClosed()); |
256 EXPECT_EQ(0u, NumBufferedBytes()); | 261 EXPECT_EQ(0u, NumBufferedBytes()); |
257 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 262 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
258 } | 263 } |
259 | 264 |
260 TEST_P(QuicStreamSequencerTest, EmptyFrame) { | 265 TEST_P(QuicStreamSequencerTest, EmptyFrame) { |
261 EXPECT_CALL(stream_, | 266 EXPECT_CALL(stream_, |
262 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); | 267 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); |
263 OnFrame(0, ""); | 268 OnFrame(0, ""); |
264 EXPECT_EQ(0u, NumBufferedBytes()); | 269 EXPECT_EQ(0u, NumBufferedBytes()); |
265 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 270 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
266 } | 271 } |
267 | 272 |
268 TEST_P(QuicStreamSequencerTest, EmptyFinFrame) { | 273 TEST_P(QuicStreamSequencerTest, EmptyFinFrame) { |
269 EXPECT_CALL(stream_, OnDataAvailable()); | 274 EXPECT_CALL(stream_, OnDataAvailable()); |
270 OnFinFrame(0, ""); | 275 OnFinFrame(0, ""); |
271 EXPECT_EQ(0u, NumBufferedBytes()); | 276 EXPECT_EQ(0u, NumBufferedBytes()); |
272 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 277 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
273 } | 278 } |
274 | 279 |
275 TEST_P(QuicStreamSequencerTest, PartialFrameConsumed) { | 280 TEST_P(QuicStreamSequencerTest, PartialFrameConsumed) { |
276 EXPECT_CALL(stream_, OnDataAvailable()) | 281 EXPECT_CALL(stream_, OnDataAvailable()) |
277 .WillOnce(testing::Invoke( | 282 .WillOnce(testing::Invoke( |
278 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 2))); | 283 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 284 base::Unretained(this), 2))); |
279 | 285 |
280 OnFrame(0, "abc"); | 286 OnFrame(0, "abc"); |
281 EXPECT_EQ(1u, NumBufferedBytes()); | 287 EXPECT_EQ(1u, NumBufferedBytes()); |
282 EXPECT_EQ(2u, sequencer_->NumBytesConsumed()); | 288 EXPECT_EQ(2u, sequencer_->NumBytesConsumed()); |
283 } | 289 } |
284 | 290 |
285 TEST_P(QuicStreamSequencerTest, NextxFrameNotConsumed) { | 291 TEST_P(QuicStreamSequencerTest, NextxFrameNotConsumed) { |
286 EXPECT_CALL(stream_, OnDataAvailable()); | 292 EXPECT_CALL(stream_, OnDataAvailable()); |
287 | 293 |
288 OnFrame(0, "abc"); | 294 OnFrame(0, "abc"); |
(...skipping 16 matching lines...) Expand all Loading... |
305 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 311 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
306 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); | 312 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
307 // Buffer the second | 313 // Buffer the second |
308 OnFrame(3, "def"); | 314 OnFrame(3, "def"); |
309 EXPECT_EQ(6u, NumBufferedBytes()); | 315 EXPECT_EQ(6u, NumBufferedBytes()); |
310 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 316 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
311 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); | 317 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
312 | 318 |
313 EXPECT_CALL(stream_, OnDataAvailable()) | 319 EXPECT_CALL(stream_, OnDataAvailable()) |
314 .WillOnce(testing::Invoke( | 320 .WillOnce(testing::Invoke( |
315 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 9))); | 321 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 322 base::Unretained(this), 9))); |
316 | 323 |
317 // Now process all of them at once. | 324 // Now process all of them at once. |
318 OnFrame(0, "abc"); | 325 OnFrame(0, "abc"); |
319 EXPECT_EQ(9u, sequencer_->NumBytesConsumed()); | 326 EXPECT_EQ(9u, sequencer_->NumBytesConsumed()); |
320 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); | 327 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
321 | 328 |
322 EXPECT_EQ(0u, NumBufferedBytes()); | 329 EXPECT_EQ(0u, NumBufferedBytes()); |
323 } | 330 } |
324 | 331 |
325 TEST_P(QuicStreamSequencerTest, BasicHalfCloseOrdered) { | 332 TEST_P(QuicStreamSequencerTest, BasicHalfCloseOrdered) { |
326 InSequence s; | 333 InSequence s; |
327 | 334 |
328 EXPECT_CALL(stream_, OnDataAvailable()) | 335 EXPECT_CALL(stream_, OnDataAvailable()) |
329 .WillOnce(testing::Invoke( | 336 .WillOnce(testing::Invoke( |
330 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 337 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 338 base::Unretained(this), 3))); |
331 OnFinFrame(0, "abc"); | 339 OnFinFrame(0, "abc"); |
332 | 340 |
333 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 341 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
334 } | 342 } |
335 | 343 |
336 TEST_P(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { | 344 TEST_P(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { |
337 OnFinFrame(6, ""); | 345 OnFinFrame(6, ""); |
338 EXPECT_EQ(6u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 346 EXPECT_EQ(6u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
339 | 347 |
340 OnFrame(3, "def"); | 348 OnFrame(3, "def"); |
341 EXPECT_CALL(stream_, OnDataAvailable()) | 349 EXPECT_CALL(stream_, OnDataAvailable()) |
342 .WillOnce(testing::Invoke( | 350 .WillOnce(testing::Invoke( |
343 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 6))); | 351 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 352 base::Unretained(this), 6))); |
344 EXPECT_FALSE(sequencer_->IsClosed()); | 353 EXPECT_FALSE(sequencer_->IsClosed()); |
345 OnFrame(0, "abc"); | 354 OnFrame(0, "abc"); |
346 EXPECT_TRUE(sequencer_->IsClosed()); | 355 EXPECT_TRUE(sequencer_->IsClosed()); |
347 } | 356 } |
348 | 357 |
349 TEST_P(QuicStreamSequencerTest, BasicHalfUnordered) { | 358 TEST_P(QuicStreamSequencerTest, BasicHalfUnordered) { |
350 OnFinFrame(3, ""); | 359 OnFinFrame(3, ""); |
351 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 360 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
352 | 361 |
353 EXPECT_CALL(stream_, OnDataAvailable()) | 362 EXPECT_CALL(stream_, OnDataAvailable()) |
354 .WillOnce(testing::Invoke( | 363 .WillOnce(testing::Invoke( |
355 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 364 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 365 base::Unretained(this), 3))); |
356 EXPECT_FALSE(sequencer_->IsClosed()); | 366 EXPECT_FALSE(sequencer_->IsClosed()); |
357 OnFrame(0, "abc"); | 367 OnFrame(0, "abc"); |
358 EXPECT_TRUE(sequencer_->IsClosed()); | 368 EXPECT_TRUE(sequencer_->IsClosed()); |
359 } | 369 } |
360 | 370 |
361 TEST_P(QuicStreamSequencerTest, TerminateWithReadv) { | 371 TEST_P(QuicStreamSequencerTest, TerminateWithReadv) { |
362 char buffer[3]; | 372 char buffer[3]; |
363 | 373 |
364 OnFinFrame(3, ""); | 374 OnFinFrame(3, ""); |
365 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 375 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
728 EXPECT_EQ(timestamp, t1); | 738 EXPECT_EQ(timestamp, t1); |
729 QuicStreamSequencerTest::ConsumeData(3); | 739 QuicStreamSequencerTest::ConsumeData(3); |
730 EXPECT_EQ(0u, NumBufferedBytes()); | 740 EXPECT_EQ(0u, NumBufferedBytes()); |
731 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); | 741 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); |
732 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); | 742 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
733 } | 743 } |
734 | 744 |
735 } // namespace | 745 } // namespace |
736 } // namespace test | 746 } // namespace test |
737 } // namespace net | 747 } // namespace net |
OLD | NEW |