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/core/quic_packet_generator.h" | 5 #include "net/quic/core/quic_packet_generator.h" |
6 | 6 |
7 #include <cstdint> | 7 #include <cstdint> |
8 #include <memory> | 8 #include <memory> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate { | 234 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate { |
235 public: | 235 public: |
236 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); | 236 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); |
237 }; | 237 }; |
238 | 238 |
239 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { | 239 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { |
240 delegate_.SetCanNotWrite(); | 240 delegate_.SetCanNotWrite(); |
241 | 241 |
242 generator_.SetShouldSendAck(false); | 242 generator_.SetShouldSendAck(false); |
243 EXPECT_TRUE(generator_.HasQueuedFrames()); | 243 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 244 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
244 } | 245 } |
245 | 246 |
246 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | 247 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { |
247 StrictMock<MockDebugDelegate> debug_delegate; | 248 StrictMock<MockDebugDelegate> debug_delegate; |
248 | 249 |
249 generator_.set_debug_delegate(&debug_delegate); | 250 generator_.set_debug_delegate(&debug_delegate); |
250 delegate_.SetCanWriteOnlyNonRetransmittable(); | 251 delegate_.SetCanWriteOnlyNonRetransmittable(); |
251 generator_.StartBatchOperations(); | 252 generator_.StartBatchOperations(); |
252 | 253 |
253 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | 254 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
254 .WillOnce(Return(QuicFrame(&ack_frame_))); | 255 .WillOnce(Return(QuicFrame(&ack_frame_))); |
255 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | 256 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
256 | 257 |
257 generator_.SetShouldSendAck(false); | 258 generator_.SetShouldSendAck(false); |
258 EXPECT_TRUE(generator_.HasQueuedFrames()); | 259 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 260 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
259 } | 261 } |
260 | 262 |
261 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 263 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
262 delegate_.SetCanWriteOnlyNonRetransmittable(); | 264 delegate_.SetCanWriteOnlyNonRetransmittable(); |
263 | 265 |
264 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | 266 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
265 .WillOnce(Return(QuicFrame(&ack_frame_))); | 267 .WillOnce(Return(QuicFrame(&ack_frame_))); |
266 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 268 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
267 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 269 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
268 | 270 |
269 generator_.SetShouldSendAck(false); | 271 generator_.SetShouldSendAck(false); |
270 EXPECT_FALSE(generator_.HasQueuedFrames()); | 272 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 273 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
271 | 274 |
272 PacketContents contents; | 275 PacketContents contents; |
273 contents.num_ack_frames = 1; | 276 contents.num_ack_frames = 1; |
274 CheckPacketContains(contents, 0); | 277 CheckPacketContains(contents, 0); |
275 } | 278 } |
276 | 279 |
277 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { | 280 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { |
278 // Make sure that calling SetShouldSendAck multiple times does not result in a | 281 // Make sure that calling SetShouldSendAck multiple times does not result in a |
279 // crash. Previously this would result in multiple QuicFrames queued in the | 282 // crash. Previously this would result in multiple QuicFrames queued in the |
280 // packet generator, with all but the last with internal pointers to freed | 283 // packet generator, with all but the last with internal pointers to freed |
(...skipping 11 matching lines...) Expand all Loading... |
292 generator_.SetShouldSendAck(false); | 295 generator_.SetShouldSendAck(false); |
293 generator_.SetShouldSendAck(false); | 296 generator_.SetShouldSendAck(false); |
294 generator_.FinishBatchOperations(); | 297 generator_.FinishBatchOperations(); |
295 } | 298 } |
296 | 299 |
297 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { | 300 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { |
298 delegate_.SetCanNotWrite(); | 301 delegate_.SetCanNotWrite(); |
299 | 302 |
300 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 303 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
301 EXPECT_TRUE(generator_.HasQueuedFrames()); | 304 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 305 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
302 } | 306 } |
303 | 307 |
304 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { | 308 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { |
305 delegate_.SetCanWriteOnlyNonRetransmittable(); | 309 delegate_.SetCanWriteOnlyNonRetransmittable(); |
306 | 310 |
307 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 311 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
308 EXPECT_TRUE(generator_.HasQueuedFrames()); | 312 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 313 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
309 } | 314 } |
310 | 315 |
311 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { | 316 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { |
312 delegate_.SetCanWriteAnything(); | 317 delegate_.SetCanWriteAnything(); |
313 generator_.StartBatchOperations(); | 318 generator_.StartBatchOperations(); |
314 | 319 |
315 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 320 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
316 EXPECT_TRUE(generator_.HasQueuedFrames()); | 321 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 322 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
317 } | 323 } |
318 | 324 |
319 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { | 325 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { |
320 delegate_.SetCanNotWrite(); | 326 delegate_.SetCanNotWrite(); |
321 generator_.StartBatchOperations(); | 327 generator_.StartBatchOperations(); |
322 | 328 |
323 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 329 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
324 EXPECT_TRUE(generator_.HasQueuedFrames()); | 330 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 331 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
325 generator_.FinishBatchOperations(); | 332 generator_.FinishBatchOperations(); |
326 EXPECT_TRUE(generator_.HasQueuedFrames()); | 333 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 334 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
327 | 335 |
328 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 336 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
329 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 337 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
330 generator_.FlushAllQueuedFrames(); | 338 generator_.FlushAllQueuedFrames(); |
331 EXPECT_FALSE(generator_.HasQueuedFrames()); | 339 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 340 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
332 | 341 |
333 PacketContents contents; | 342 PacketContents contents; |
334 contents.num_rst_stream_frames = 1; | 343 contents.num_rst_stream_frames = 1; |
335 CheckPacketContains(contents, 0); | 344 CheckPacketContains(contents, 0); |
336 } | 345 } |
337 | 346 |
338 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { | 347 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { |
339 delegate_.SetCanWriteAnything(); | 348 delegate_.SetCanWriteAnything(); |
340 | 349 |
341 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 350 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
342 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 351 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
343 | 352 |
344 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 353 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
345 EXPECT_FALSE(generator_.HasQueuedFrames()); | 354 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 355 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
346 | 356 |
347 PacketContents contents; | 357 PacketContents contents; |
348 contents.num_rst_stream_frames = 1; | 358 contents.num_rst_stream_frames = 1; |
349 CheckPacketContains(contents, 0); | 359 CheckPacketContains(contents, 0); |
350 } | 360 } |
351 | 361 |
352 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | 362 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
353 delegate_.SetCanNotWrite(); | 363 delegate_.SetCanNotWrite(); |
354 | 364 |
355 QuicConsumedData consumed = generator_.ConsumeData( | 365 QuicConsumedData consumed = generator_.ConsumeData( |
356 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); | 366 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); |
357 EXPECT_EQ(0u, consumed.bytes_consumed); | 367 EXPECT_EQ(0u, consumed.bytes_consumed); |
358 EXPECT_FALSE(consumed.fin_consumed); | 368 EXPECT_FALSE(consumed.fin_consumed); |
359 EXPECT_FALSE(generator_.HasQueuedFrames()); | 369 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 370 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
360 } | 371 } |
361 | 372 |
362 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { | 373 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { |
363 delegate_.SetCanWriteAnything(); | 374 delegate_.SetCanWriteAnything(); |
364 generator_.StartBatchOperations(); | 375 generator_.StartBatchOperations(); |
365 | 376 |
366 QuicConsumedData consumed = generator_.ConsumeData( | 377 QuicConsumedData consumed = generator_.ConsumeData( |
367 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); | 378 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); |
368 EXPECT_EQ(3u, consumed.bytes_consumed); | 379 EXPECT_EQ(3u, consumed.bytes_consumed); |
369 EXPECT_TRUE(consumed.fin_consumed); | 380 EXPECT_TRUE(consumed.fin_consumed); |
370 EXPECT_TRUE(generator_.HasQueuedFrames()); | 381 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 382 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
371 } | 383 } |
372 | 384 |
373 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | 385 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
374 delegate_.SetCanWriteAnything(); | 386 delegate_.SetCanWriteAnything(); |
375 | 387 |
376 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 388 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
377 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 389 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
378 QuicConsumedData consumed = generator_.ConsumeData( | 390 QuicConsumedData consumed = generator_.ConsumeData( |
379 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); | 391 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); |
380 EXPECT_EQ(3u, consumed.bytes_consumed); | 392 EXPECT_EQ(3u, consumed.bytes_consumed); |
381 EXPECT_TRUE(consumed.fin_consumed); | 393 EXPECT_TRUE(consumed.fin_consumed); |
382 EXPECT_FALSE(generator_.HasQueuedFrames()); | 394 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 395 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
383 | 396 |
384 PacketContents contents; | 397 PacketContents contents; |
385 contents.num_stream_frames = 1; | 398 contents.num_stream_frames = 1; |
386 CheckPacketContains(contents, 0); | 399 CheckPacketContains(contents, 0); |
387 } | 400 } |
388 | 401 |
389 // Test the behavior of ConsumeData when the data consumed is for the crypto | 402 // Test the behavior of ConsumeData when the data consumed is for the crypto |
390 // handshake stream. Ensure that the packet is always sent and padded even if | 403 // handshake stream. Ensure that the packet is always sent and padded even if |
391 // the generator operates in batch mode. | 404 // the generator operates in batch mode. |
392 TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake) { | 405 TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake) { |
393 delegate_.SetCanWriteAnything(); | 406 delegate_.SetCanWriteAnything(); |
394 generator_.StartBatchOperations(); | 407 generator_.StartBatchOperations(); |
395 | 408 |
396 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 409 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
397 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 410 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
398 QuicConsumedData consumed = generator_.ConsumeData( | 411 QuicConsumedData consumed = generator_.ConsumeData( |
399 kCryptoStreamId, MakeIOVectorFromStringPiece("foo"), 0, NO_FIN, nullptr); | 412 kCryptoStreamId, MakeIOVectorFromStringPiece("foo"), 0, NO_FIN, nullptr); |
400 EXPECT_EQ(3u, consumed.bytes_consumed); | 413 EXPECT_EQ(3u, consumed.bytes_consumed); |
401 EXPECT_FALSE(generator_.HasQueuedFrames()); | 414 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 415 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
402 | 416 |
403 PacketContents contents; | 417 PacketContents contents; |
404 contents.num_stream_frames = 1; | 418 contents.num_stream_frames = 1; |
405 contents.num_padding_frames = 1; | 419 contents.num_padding_frames = 1; |
406 CheckPacketContains(contents, 0); | 420 CheckPacketContains(contents, 0); |
407 | 421 |
408 ASSERT_EQ(1u, packets_.size()); | 422 ASSERT_EQ(1u, packets_.size()); |
409 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength()); | 423 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength()); |
410 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 424 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
411 } | 425 } |
(...skipping 10 matching lines...) Expand all Loading... |
422 delegate_.SetCanWriteAnything(); | 436 delegate_.SetCanWriteAnything(); |
423 generator_.StartBatchOperations(); | 437 generator_.StartBatchOperations(); |
424 | 438 |
425 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), | 439 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), |
426 2, FIN, nullptr); | 440 2, FIN, nullptr); |
427 QuicConsumedData consumed = generator_.ConsumeData( | 441 QuicConsumedData consumed = generator_.ConsumeData( |
428 3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, nullptr); | 442 3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, nullptr); |
429 EXPECT_EQ(4u, consumed.bytes_consumed); | 443 EXPECT_EQ(4u, consumed.bytes_consumed); |
430 EXPECT_FALSE(consumed.fin_consumed); | 444 EXPECT_FALSE(consumed.fin_consumed); |
431 EXPECT_TRUE(generator_.HasQueuedFrames()); | 445 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 446 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
432 } | 447 } |
433 | 448 |
434 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { | 449 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { |
435 delegate_.SetCanWriteAnything(); | 450 delegate_.SetCanWriteAnything(); |
436 generator_.StartBatchOperations(); | 451 generator_.StartBatchOperations(); |
437 | 452 |
438 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), | 453 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), |
439 2, FIN, nullptr); | 454 2, FIN, nullptr); |
440 QuicConsumedData consumed = generator_.ConsumeData( | 455 QuicConsumedData consumed = generator_.ConsumeData( |
441 3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, nullptr); | 456 3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, nullptr); |
442 EXPECT_EQ(4u, consumed.bytes_consumed); | 457 EXPECT_EQ(4u, consumed.bytes_consumed); |
443 EXPECT_FALSE(consumed.fin_consumed); | 458 EXPECT_FALSE(consumed.fin_consumed); |
444 EXPECT_TRUE(generator_.HasQueuedFrames()); | 459 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 460 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
445 | 461 |
446 // Now both frames will be flushed out. | 462 // Now both frames will be flushed out. |
447 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 463 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
448 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 464 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
449 generator_.FinishBatchOperations(); | 465 generator_.FinishBatchOperations(); |
450 EXPECT_FALSE(generator_.HasQueuedFrames()); | 466 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 467 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
451 | 468 |
452 PacketContents contents; | 469 PacketContents contents; |
453 contents.num_stream_frames = 2; | 470 contents.num_stream_frames = 2; |
454 CheckPacketContains(contents, 0); | 471 CheckPacketContains(contents, 0); |
455 } | 472 } |
456 | 473 |
457 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { | 474 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { |
458 // Set the packet size be enough for two stream frames with 0 stream offset, | 475 // Set the packet size be enough for two stream frames with 0 stream offset, |
459 // but not enough for a stream frame of 0 offset and one with non-zero offset. | 476 // but not enough for a stream frame of 0 offset and one with non-zero offset. |
460 size_t length = | 477 size_t length = |
(...skipping 16 matching lines...) Expand all Loading... |
477 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 494 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
478 } | 495 } |
479 generator_.StartBatchOperations(); | 496 generator_.StartBatchOperations(); |
480 // Queue enough data to prevent a stream frame with a non-zero offset from | 497 // Queue enough data to prevent a stream frame with a non-zero offset from |
481 // fitting. | 498 // fitting. |
482 QuicConsumedData consumed = generator_.ConsumeData( | 499 QuicConsumedData consumed = generator_.ConsumeData( |
483 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 0, NO_FIN, nullptr); | 500 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 0, NO_FIN, nullptr); |
484 EXPECT_EQ(3u, consumed.bytes_consumed); | 501 EXPECT_EQ(3u, consumed.bytes_consumed); |
485 EXPECT_FALSE(consumed.fin_consumed); | 502 EXPECT_FALSE(consumed.fin_consumed); |
486 EXPECT_TRUE(generator_.HasQueuedFrames()); | 503 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 504 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
487 | 505 |
488 // This frame will not fit with the existing frame, causing the queued frame | 506 // This frame will not fit with the existing frame, causing the queued frame |
489 // to be serialized, and it will be added to a new open packet. | 507 // to be serialized, and it will be added to a new open packet. |
490 consumed = generator_.ConsumeData( | 508 consumed = generator_.ConsumeData( |
491 kHeadersStreamId, MakeIOVectorFromStringPiece("bar"), 3, FIN, nullptr); | 509 kHeadersStreamId, MakeIOVectorFromStringPiece("bar"), 3, FIN, nullptr); |
492 EXPECT_EQ(3u, consumed.bytes_consumed); | 510 EXPECT_EQ(3u, consumed.bytes_consumed); |
493 EXPECT_TRUE(consumed.fin_consumed); | 511 EXPECT_TRUE(consumed.fin_consumed); |
494 EXPECT_TRUE(generator_.HasQueuedFrames()); | 512 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 513 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
495 | 514 |
496 creator_->Flush(); | 515 creator_->Flush(); |
497 EXPECT_FALSE(generator_.HasQueuedFrames()); | 516 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 517 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
498 | 518 |
499 PacketContents contents; | 519 PacketContents contents; |
500 contents.num_stream_frames = 1; | 520 contents.num_stream_frames = 1; |
501 CheckPacketContains(contents, 0); | 521 CheckPacketContains(contents, 0); |
502 CheckPacketContains(contents, 1); | 522 CheckPacketContains(contents, 1); |
503 } | 523 } |
504 | 524 |
505 TEST_F(QuicPacketGeneratorTest, ConsumeDataFastPath) { | 525 TEST_F(QuicPacketGeneratorTest, ConsumeDataFastPath) { |
506 delegate_.SetCanWriteAnything(); | 526 delegate_.SetCanWriteAnything(); |
507 | 527 |
508 // Create a 10000 byte IOVector. | 528 // Create a 10000 byte IOVector. |
509 QuicIOVector iov(CreateData(10000)); | 529 QuicIOVector iov(CreateData(10000)); |
510 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 530 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
511 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 531 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
512 QuicConsumedData consumed = | 532 QuicConsumedData consumed = |
513 generator_.ConsumeDataFastPath(kHeadersStreamId, iov, 0, true, nullptr); | 533 generator_.ConsumeDataFastPath(kHeadersStreamId, iov, 0, true, nullptr); |
514 EXPECT_EQ(10000u, consumed.bytes_consumed); | 534 EXPECT_EQ(10000u, consumed.bytes_consumed); |
515 EXPECT_TRUE(consumed.fin_consumed); | 535 EXPECT_TRUE(consumed.fin_consumed); |
516 EXPECT_FALSE(generator_.HasQueuedFrames()); | 536 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 537 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
517 | 538 |
518 PacketContents contents; | 539 PacketContents contents; |
519 contents.num_stream_frames = 1; | 540 contents.num_stream_frames = 1; |
520 CheckPacketContains(contents, 0); | 541 CheckPacketContains(contents, 0); |
521 } | 542 } |
522 | 543 |
523 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | 544 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { |
524 delegate_.SetCanNotWrite(); | 545 delegate_.SetCanNotWrite(); |
525 | 546 |
526 generator_.SetShouldSendAck(false); | 547 generator_.SetShouldSendAck(false); |
527 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 548 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
528 EXPECT_TRUE(generator_.HasQueuedFrames()); | 549 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 550 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
529 | 551 |
530 delegate_.SetCanWriteAnything(); | 552 delegate_.SetCanWriteAnything(); |
531 | 553 |
532 generator_.StartBatchOperations(); | 554 generator_.StartBatchOperations(); |
533 | 555 |
534 // When the first write operation is invoked, the ack frame will be returned. | 556 // When the first write operation is invoked, the ack frame will be returned. |
535 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | 557 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
536 .WillOnce(Return(QuicFrame(&ack_frame_))); | 558 .WillOnce(Return(QuicFrame(&ack_frame_))); |
537 | 559 |
538 // Send some data and a control frame | 560 // Send some data and a control frame |
539 generator_.ConsumeData(3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, | 561 generator_.ConsumeData(3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, |
540 nullptr); | 562 nullptr); |
541 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 563 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
542 | 564 |
543 // All five frames will be flushed out in a single packet. | 565 // All five frames will be flushed out in a single packet. |
544 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 566 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
545 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 567 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
546 generator_.FinishBatchOperations(); | 568 generator_.FinishBatchOperations(); |
547 EXPECT_FALSE(generator_.HasQueuedFrames()); | 569 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 570 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
548 | 571 |
549 PacketContents contents; | 572 PacketContents contents; |
550 contents.num_ack_frames = 1; | 573 contents.num_ack_frames = 1; |
551 contents.num_goaway_frames = 1; | 574 contents.num_goaway_frames = 1; |
552 contents.num_rst_stream_frames = 1; | 575 contents.num_rst_stream_frames = 1; |
553 contents.num_stream_frames = 1; | 576 contents.num_stream_frames = 1; |
554 CheckPacketContains(contents, 0); | 577 CheckPacketContains(contents, 0); |
555 } | 578 } |
556 | 579 |
557 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { | 580 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { |
558 delegate_.SetCanNotWrite(); | 581 delegate_.SetCanNotWrite(); |
559 | 582 |
560 generator_.SetShouldSendAck(false); | 583 generator_.SetShouldSendAck(false); |
561 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 584 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
562 EXPECT_TRUE(generator_.HasQueuedFrames()); | 585 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 586 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
563 | 587 |
564 delegate_.SetCanWriteAnything(); | 588 delegate_.SetCanWriteAnything(); |
565 | 589 |
566 generator_.StartBatchOperations(); | 590 generator_.StartBatchOperations(); |
567 | 591 |
568 // When the first write operation is invoked, the ack frame will be returned. | 592 // When the first write operation is invoked, the ack frame will be returned. |
569 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | 593 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
570 .WillOnce(Return(QuicFrame(&ack_frame_))); | 594 .WillOnce(Return(QuicFrame(&ack_frame_))); |
571 | 595 |
572 { | 596 { |
573 InSequence dummy; | 597 InSequence dummy; |
574 // All five frames will be flushed out in a single packet | 598 // All five frames will be flushed out in a single packet |
575 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 599 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
576 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 600 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
577 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 601 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
578 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 602 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
579 } | 603 } |
580 | 604 |
581 // Send enough data to exceed one packet | 605 // Send enough data to exceed one packet |
582 size_t data_len = kDefaultMaxPacketSize + 100; | 606 size_t data_len = kDefaultMaxPacketSize + 100; |
583 QuicConsumedData consumed = | 607 QuicConsumedData consumed = |
584 generator_.ConsumeData(3, CreateData(data_len), 0, FIN, nullptr); | 608 generator_.ConsumeData(3, CreateData(data_len), 0, FIN, nullptr); |
585 EXPECT_EQ(data_len, consumed.bytes_consumed); | 609 EXPECT_EQ(data_len, consumed.bytes_consumed); |
586 EXPECT_TRUE(consumed.fin_consumed); | 610 EXPECT_TRUE(consumed.fin_consumed); |
587 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 611 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
588 | 612 |
589 generator_.FinishBatchOperations(); | 613 generator_.FinishBatchOperations(); |
590 EXPECT_FALSE(generator_.HasQueuedFrames()); | 614 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 615 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
591 | 616 |
592 // The first packet should have the queued data and part of the stream data. | 617 // The first packet should have the queued data and part of the stream data. |
593 PacketContents contents; | 618 PacketContents contents; |
594 contents.num_ack_frames = 1; | 619 contents.num_ack_frames = 1; |
595 contents.num_rst_stream_frames = 1; | 620 contents.num_rst_stream_frames = 1; |
596 contents.num_stream_frames = 1; | 621 contents.num_stream_frames = 1; |
597 CheckPacketContains(contents, 0); | 622 CheckPacketContains(contents, 0); |
598 | 623 |
599 // The second should have the remainder of the stream data. | 624 // The second should have the remainder of the stream data. |
600 PacketContents contents2; | 625 PacketContents contents2; |
(...skipping 26 matching lines...) Expand all Loading... |
627 | 652 |
628 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 653 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
629 .Times(3) | 654 .Times(3) |
630 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 655 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
631 QuicConsumedData consumed = | 656 QuicConsumedData consumed = |
632 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 657 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
633 /*offset=*/2, FIN, nullptr); | 658 /*offset=*/2, FIN, nullptr); |
634 EXPECT_EQ(data_len, consumed.bytes_consumed); | 659 EXPECT_EQ(data_len, consumed.bytes_consumed); |
635 EXPECT_TRUE(consumed.fin_consumed); | 660 EXPECT_TRUE(consumed.fin_consumed); |
636 EXPECT_FALSE(generator_.HasQueuedFrames()); | 661 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 662 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
637 | 663 |
638 // We expect three packets, and first two of them have to be of packet_len | 664 // We expect three packets, and first two of them have to be of packet_len |
639 // size. We check multiple packets (instead of just one) because we want to | 665 // size. We check multiple packets (instead of just one) because we want to |
640 // ensure that |max_packet_length_| does not get changed incorrectly by the | 666 // ensure that |max_packet_length_| does not get changed incorrectly by the |
641 // generator after first packet is serialized. | 667 // generator after first packet is serialized. |
642 ASSERT_EQ(3u, packets_.size()); | 668 ASSERT_EQ(3u, packets_.size()); |
643 EXPECT_EQ(packet_len, packets_[0].encrypted_length); | 669 EXPECT_EQ(packet_len, packets_[0].encrypted_length); |
644 EXPECT_EQ(packet_len, packets_[1].encrypted_length); | 670 EXPECT_EQ(packet_len, packets_[1].encrypted_length); |
645 CheckAllPacketsHaveSingleStreamFrame(); | 671 CheckAllPacketsHaveSingleStreamFrame(); |
646 } | 672 } |
(...skipping 14 matching lines...) Expand all Loading... |
661 .Times(3) | 687 .Times(3) |
662 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 688 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
663 | 689 |
664 // Send two packets before packet size change. | 690 // Send two packets before packet size change. |
665 QuicConsumedData consumed = | 691 QuicConsumedData consumed = |
666 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 692 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
667 /*offset=*/2, NO_FIN, nullptr); | 693 /*offset=*/2, NO_FIN, nullptr); |
668 EXPECT_EQ(data_len, consumed.bytes_consumed); | 694 EXPECT_EQ(data_len, consumed.bytes_consumed); |
669 EXPECT_FALSE(consumed.fin_consumed); | 695 EXPECT_FALSE(consumed.fin_consumed); |
670 EXPECT_FALSE(generator_.HasQueuedFrames()); | 696 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 697 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
671 | 698 |
672 // Make sure we already have two packets. | 699 // Make sure we already have two packets. |
673 ASSERT_EQ(2u, packets_.size()); | 700 ASSERT_EQ(2u, packets_.size()); |
674 | 701 |
675 // Increase packet size. | 702 // Increase packet size. |
676 generator_.SetMaxPacketLength(packet_len); | 703 generator_.SetMaxPacketLength(packet_len); |
677 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 704 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
678 | 705 |
679 // Send a packet after packet size change. | 706 // Send a packet after packet size change. |
680 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 707 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
681 2 + data_len, FIN, nullptr); | 708 2 + data_len, FIN, nullptr); |
682 EXPECT_EQ(data_len, consumed.bytes_consumed); | 709 EXPECT_EQ(data_len, consumed.bytes_consumed); |
683 EXPECT_TRUE(consumed.fin_consumed); | 710 EXPECT_TRUE(consumed.fin_consumed); |
684 EXPECT_FALSE(generator_.HasQueuedFrames()); | 711 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 712 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
685 | 713 |
686 // We expect first data chunk to get fragmented, but the second one to fit | 714 // We expect first data chunk to get fragmented, but the second one to fit |
687 // into a single packet. | 715 // into a single packet. |
688 ASSERT_EQ(3u, packets_.size()); | 716 ASSERT_EQ(3u, packets_.size()); |
689 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 717 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
690 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length); | 718 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length); |
691 CheckAllPacketsHaveSingleStreamFrame(); | 719 CheckAllPacketsHaveSingleStreamFrame(); |
692 } | 720 } |
693 | 721 |
694 // Test whether SetMaxPacketLength() works correctly when we force the change of | 722 // Test whether SetMaxPacketLength() works correctly when we force the change of |
695 // the packet size in the middle of the batched packet. | 723 // the packet size in the middle of the batched packet. |
696 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) { | 724 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) { |
697 delegate_.SetCanWriteAnything(); | 725 delegate_.SetCanWriteAnything(); |
698 generator_.StartBatchOperations(); | 726 generator_.StartBatchOperations(); |
699 | 727 |
700 size_t first_write_len = kDefaultMaxPacketSize / 2; | 728 size_t first_write_len = kDefaultMaxPacketSize / 2; |
701 size_t packet_len = kDefaultMaxPacketSize + 100; | 729 size_t packet_len = kDefaultMaxPacketSize + 100; |
702 size_t second_write_len = packet_len + 1; | 730 size_t second_write_len = packet_len + 1; |
703 ASSERT_LE(packet_len, kMaxPacketSize); | 731 ASSERT_LE(packet_len, kMaxPacketSize); |
704 | 732 |
705 // First send half of the packet worth of data. We are in the batch mode, so | 733 // First send half of the packet worth of data. We are in the batch mode, so |
706 // should not cause packet serialization. | 734 // should not cause packet serialization. |
707 QuicConsumedData consumed = | 735 QuicConsumedData consumed = |
708 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), | 736 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), |
709 /*offset=*/2, NO_FIN, nullptr); | 737 /*offset=*/2, NO_FIN, nullptr); |
710 EXPECT_EQ(first_write_len, consumed.bytes_consumed); | 738 EXPECT_EQ(first_write_len, consumed.bytes_consumed); |
711 EXPECT_FALSE(consumed.fin_consumed); | 739 EXPECT_FALSE(consumed.fin_consumed); |
712 EXPECT_TRUE(generator_.HasQueuedFrames()); | 740 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 741 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
713 | 742 |
714 // Make sure we have no packets so far. | 743 // Make sure we have no packets so far. |
715 ASSERT_EQ(0u, packets_.size()); | 744 ASSERT_EQ(0u, packets_.size()); |
716 | 745 |
717 // Expect a packet to be flushed. | 746 // Expect a packet to be flushed. |
718 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 747 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
719 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 748 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
720 | 749 |
721 // Increase packet size after flushing all frames. | 750 // Increase packet size after flushing all frames. |
722 // Ensure it's immediately enacted. | 751 // Ensure it's immediately enacted. |
723 generator_.FlushAllQueuedFrames(); | 752 generator_.FlushAllQueuedFrames(); |
724 generator_.SetMaxPacketLength(packet_len); | 753 generator_.SetMaxPacketLength(packet_len); |
725 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 754 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
726 EXPECT_FALSE(generator_.HasQueuedFrames()); | 755 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 756 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
727 | 757 |
728 // We expect to see exactly one packet serialized after that, because we send | 758 // We expect to see exactly one packet serialized after that, because we send |
729 // a value somewhat exceeding new max packet size, and the tail data does not | 759 // a value somewhat exceeding new max packet size, and the tail data does not |
730 // get serialized because we are still in the batch mode. | 760 // get serialized because we are still in the batch mode. |
731 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 761 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
732 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 762 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
733 | 763 |
734 // Send a more than a packet worth of data to the same stream. This should | 764 // Send a more than a packet worth of data to the same stream. This should |
735 // trigger serialization of one packet, and queue another one. | 765 // trigger serialization of one packet, and queue another one. |
736 consumed = | 766 consumed = |
737 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), | 767 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), |
738 /*offset=*/2 + first_write_len, FIN, nullptr); | 768 /*offset=*/2 + first_write_len, FIN, nullptr); |
739 EXPECT_EQ(second_write_len, consumed.bytes_consumed); | 769 EXPECT_EQ(second_write_len, consumed.bytes_consumed); |
740 EXPECT_TRUE(consumed.fin_consumed); | 770 EXPECT_TRUE(consumed.fin_consumed); |
741 EXPECT_TRUE(generator_.HasQueuedFrames()); | 771 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 772 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
742 | 773 |
743 // We expect the first packet to be underfilled, and the second packet be up | 774 // We expect the first packet to be underfilled, and the second packet be up |
744 // to the new max packet size. | 775 // to the new max packet size. |
745 ASSERT_EQ(2u, packets_.size()); | 776 ASSERT_EQ(2u, packets_.size()); |
746 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 777 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
747 EXPECT_EQ(packet_len, packets_[1].encrypted_length); | 778 EXPECT_EQ(packet_len, packets_[1].encrypted_length); |
748 | 779 |
749 CheckAllPacketsHaveSingleStreamFrame(); | 780 CheckAllPacketsHaveSingleStreamFrame(); |
750 } | 781 } |
751 | 782 |
752 // Test sending an MTU probe, without any surrounding data. | 783 // Test sending an MTU probe, without any surrounding data. |
753 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_Simple) { | 784 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_Simple) { |
754 delegate_.SetCanWriteAnything(); | 785 delegate_.SetCanWriteAnything(); |
755 | 786 |
756 const size_t target_mtu = kDefaultMaxPacketSize + 100; | 787 const size_t target_mtu = kDefaultMaxPacketSize + 100; |
757 static_assert(target_mtu < kMaxPacketSize, | 788 static_assert(target_mtu < kMaxPacketSize, |
758 "The MTU probe used by the test exceeds maximum packet size"); | 789 "The MTU probe used by the test exceeds maximum packet size"); |
759 | 790 |
760 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 791 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
761 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 792 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
762 | 793 |
763 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | 794 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); |
764 | 795 |
765 EXPECT_FALSE(generator_.HasQueuedFrames()); | 796 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 797 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
766 ASSERT_EQ(1u, packets_.size()); | 798 ASSERT_EQ(1u, packets_.size()); |
767 EXPECT_EQ(target_mtu, packets_[0].encrypted_length); | 799 EXPECT_EQ(target_mtu, packets_[0].encrypted_length); |
768 | 800 |
769 PacketContents contents; | 801 PacketContents contents; |
770 contents.num_mtu_discovery_frames = 1; | 802 contents.num_mtu_discovery_frames = 1; |
771 contents.num_padding_frames = 1; | 803 contents.num_padding_frames = 1; |
772 CheckPacketContains(contents, 0); | 804 CheckPacketContains(contents, 0); |
773 } | 805 } |
774 | 806 |
775 // Test sending an MTU probe. Surround it with data, to ensure that it resets | 807 // Test sending an MTU probe. Surround it with data, to ensure that it resets |
(...skipping 14 matching lines...) Expand all Loading... |
790 .Times(5) | 822 .Times(5) |
791 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 823 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
792 | 824 |
793 // Send data before the MTU probe. | 825 // Send data before the MTU probe. |
794 QuicConsumedData consumed = | 826 QuicConsumedData consumed = |
795 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 827 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
796 /*offset=*/2, NO_FIN, nullptr); | 828 /*offset=*/2, NO_FIN, nullptr); |
797 EXPECT_EQ(data_len, consumed.bytes_consumed); | 829 EXPECT_EQ(data_len, consumed.bytes_consumed); |
798 EXPECT_FALSE(consumed.fin_consumed); | 830 EXPECT_FALSE(consumed.fin_consumed); |
799 EXPECT_FALSE(generator_.HasQueuedFrames()); | 831 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 832 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
800 | 833 |
801 // Send the MTU probe. | 834 // Send the MTU probe. |
802 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | 835 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); |
803 EXPECT_FALSE(generator_.HasQueuedFrames()); | 836 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 837 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
804 | 838 |
805 // Send data after the MTU probe. | 839 // Send data after the MTU probe. |
806 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 840 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
807 /*offset=*/2 + data_len, FIN, nullptr); | 841 /*offset=*/2 + data_len, FIN, nullptr); |
808 EXPECT_EQ(data_len, consumed.bytes_consumed); | 842 EXPECT_EQ(data_len, consumed.bytes_consumed); |
809 EXPECT_TRUE(consumed.fin_consumed); | 843 EXPECT_TRUE(consumed.fin_consumed); |
810 EXPECT_FALSE(generator_.HasQueuedFrames()); | 844 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 845 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
811 | 846 |
812 ASSERT_EQ(5u, packets_.size()); | 847 ASSERT_EQ(5u, packets_.size()); |
813 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 848 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
814 EXPECT_EQ(target_mtu, packets_[2].encrypted_length); | 849 EXPECT_EQ(target_mtu, packets_[2].encrypted_length); |
815 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length); | 850 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length); |
816 | 851 |
817 PacketContents probe_contents; | 852 PacketContents probe_contents; |
818 probe_contents.num_mtu_discovery_frames = 1; | 853 probe_contents.num_mtu_discovery_frames = 1; |
819 probe_contents.num_padding_frames = 1; | 854 probe_contents.num_padding_frames = 1; |
820 | 855 |
(...skipping 15 matching lines...) Expand all Loading... |
836 generator_.SetShouldSendAck(true); | 871 generator_.SetShouldSendAck(true); |
837 delegate_.SetCanWriteAnything(); | 872 delegate_.SetCanWriteAnything(); |
838 generator_.StartBatchOperations(); | 873 generator_.StartBatchOperations(); |
839 | 874 |
840 // Set up frames to write into the creator when control frames are written. | 875 // Set up frames to write into the creator when control frames are written. |
841 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | 876 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
842 .WillOnce(Return(QuicFrame(&ack_frame_))); | 877 .WillOnce(Return(QuicFrame(&ack_frame_))); |
843 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); | 878 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); |
844 // Generator should have queued control frames, and creator should be empty. | 879 // Generator should have queued control frames, and creator should be empty. |
845 EXPECT_TRUE(generator_.HasQueuedFrames()); | 880 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 881 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
846 EXPECT_FALSE(creator_->HasPendingFrames()); | 882 EXPECT_FALSE(creator_->HasPendingFrames()); |
847 | 883 |
848 // This will not serialize any packets, because of the invalid frame. | 884 // This will not serialize any packets, because of the invalid frame. |
849 EXPECT_CALL(delegate_, | 885 EXPECT_CALL(delegate_, |
850 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _, | 886 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _, |
851 ConnectionCloseSource::FROM_SELF)); | 887 ConnectionCloseSource::FROM_SELF)); |
852 EXPECT_QUIC_BUG(generator_.FinishBatchOperations(), | 888 EXPECT_QUIC_BUG(generator_.FinishBatchOperations(), |
853 "packet_number_length 1 is too small " | 889 "packet_number_length 1 is too small " |
854 "for least_unacked_delta: 1001"); | 890 "for least_unacked_delta: 1001"); |
855 } | 891 } |
856 | 892 |
857 // Regression test for b/31486443. | 893 // Regression test for b/31486443. |
858 TEST_F(QuicPacketGeneratorTest, ConnectionCloseFrameLargerThanPacketSize) { | 894 TEST_F(QuicPacketGeneratorTest, ConnectionCloseFrameLargerThanPacketSize) { |
859 delegate_.SetCanWriteAnything(); | 895 delegate_.SetCanWriteAnything(); |
860 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(); | 896 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(); |
861 frame->error_code = QUIC_PACKET_WRITE_ERROR; | 897 frame->error_code = QUIC_PACKET_WRITE_ERROR; |
862 char buf[2000] = {}; | 898 char buf[2000] = {}; |
863 QuicStringPiece error_details(buf, 2000); | 899 QuicStringPiece error_details(buf, 2000); |
864 frame->error_details = error_details.as_string(); | 900 frame->error_details = error_details.as_string(); |
865 EXPECT_CALL(delegate_, | 901 EXPECT_CALL(delegate_, |
866 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, | 902 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, |
867 "Single frame cannot fit into a packet", _)); | 903 "Single frame cannot fit into a packet", _)); |
868 EXPECT_QUIC_BUG(generator_.AddControlFrame(QuicFrame(frame)), ""); | 904 EXPECT_QUIC_BUG(generator_.AddControlFrame(QuicFrame(frame)), ""); |
869 EXPECT_TRUE(generator_.HasQueuedFrames()); | 905 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 906 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
870 } | 907 } |
871 | 908 |
872 TEST_F(QuicPacketGeneratorTest, RandomPaddingAfterFinSingleStreamSinglePacket) { | 909 TEST_F(QuicPacketGeneratorTest, RandomPaddingAfterFinSingleStreamSinglePacket) { |
873 const QuicByteCount kStreamFramePayloadSize = 100u; | 910 const QuicByteCount kStreamFramePayloadSize = 100u; |
874 char buf[kStreamFramePayloadSize] = {}; | 911 char buf[kStreamFramePayloadSize] = {}; |
875 const QuicStreamId kDataStreamId = 5; | 912 const QuicStreamId kDataStreamId = 5; |
876 // Set the packet size be enough for one stream frame with 0 stream offset and | 913 // Set the packet size be enough for one stream frame with 0 stream offset and |
877 // max size of random padding. | 914 // max size of random padding. |
878 size_t length = NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) + | 915 size_t length = NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) + |
879 GetPacketHeaderSize( | 916 GetPacketHeaderSize( |
880 framer_.version(), creator_->connection_id_length(), | 917 framer_.version(), creator_->connection_id_length(), |
881 kIncludeVersion, !kIncludeDiversificationNonce, | 918 kIncludeVersion, !kIncludeDiversificationNonce, |
882 QuicPacketCreatorPeer::GetPacketNumberLength(creator_)) + | 919 QuicPacketCreatorPeer::GetPacketNumberLength(creator_)) + |
883 QuicFramer::GetMinStreamFrameSize( | 920 QuicFramer::GetMinStreamFrameSize( |
884 kDataStreamId, 0, /*last_frame_in_packet=*/false) + | 921 kDataStreamId, 0, /*last_frame_in_packet=*/false) + |
885 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes; | 922 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes; |
886 generator_.SetMaxPacketLength(length); | 923 generator_.SetMaxPacketLength(length); |
887 delegate_.SetCanWriteAnything(); | 924 delegate_.SetCanWriteAnything(); |
888 generator_.StartBatchOperations(); | 925 generator_.StartBatchOperations(); |
889 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 926 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
890 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 927 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
891 QuicConsumedData consumed = | 928 QuicConsumedData consumed = |
892 generator_.ConsumeData(kDataStreamId, | 929 generator_.ConsumeData(kDataStreamId, |
893 MakeIOVectorFromStringPiece( | 930 MakeIOVectorFromStringPiece( |
894 QuicStringPiece(buf, kStreamFramePayloadSize)), | 931 QuicStringPiece(buf, kStreamFramePayloadSize)), |
895 0, FIN_AND_PADDING, nullptr); | 932 0, FIN_AND_PADDING, nullptr); |
896 generator_.FinishBatchOperations(); | 933 generator_.FinishBatchOperations(); |
897 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); | 934 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
898 EXPECT_FALSE(generator_.HasQueuedFrames()); | 935 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 936 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
899 | 937 |
900 EXPECT_EQ(1u, packets_.size()); | 938 EXPECT_EQ(1u, packets_.size()); |
901 PacketContents contents; | 939 PacketContents contents; |
902 // The packet has both stream and padding frames. | 940 // The packet has both stream and padding frames. |
903 contents.num_padding_frames = 1; | 941 contents.num_padding_frames = 1; |
904 contents.num_stream_frames = 1; | 942 contents.num_stream_frames = 1; |
905 CheckPacketContains(contents, 0); | 943 CheckPacketContains(contents, 0); |
906 } | 944 } |
907 | 945 |
908 TEST_F(QuicPacketGeneratorTest, | 946 TEST_F(QuicPacketGeneratorTest, |
(...skipping 17 matching lines...) Expand all Loading... |
926 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 964 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
927 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 965 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
928 QuicConsumedData consumed = | 966 QuicConsumedData consumed = |
929 generator_.ConsumeData(kDataStreamId, | 967 generator_.ConsumeData(kDataStreamId, |
930 MakeIOVectorFromStringPiece( | 968 MakeIOVectorFromStringPiece( |
931 QuicStringPiece(buf, kStreamFramePayloadSize)), | 969 QuicStringPiece(buf, kStreamFramePayloadSize)), |
932 0, FIN_AND_PADDING, nullptr); | 970 0, FIN_AND_PADDING, nullptr); |
933 generator_.FinishBatchOperations(); | 971 generator_.FinishBatchOperations(); |
934 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); | 972 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
935 EXPECT_FALSE(generator_.HasQueuedFrames()); | 973 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 974 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
936 | 975 |
937 EXPECT_LE(1u, packets_.size()); | 976 EXPECT_LE(1u, packets_.size()); |
938 PacketContents contents; | 977 PacketContents contents; |
939 // The first packet has both stream and padding frames. | 978 // The first packet has both stream and padding frames. |
940 contents.num_stream_frames = 1; | 979 contents.num_stream_frames = 1; |
941 contents.num_padding_frames = 1; | 980 contents.num_padding_frames = 1; |
942 CheckPacketContains(contents, 0); | 981 CheckPacketContains(contents, 0); |
943 | 982 |
944 for (size_t i = 1; i < packets_.size(); ++i) { | 983 for (size_t i = 1; i < packets_.size(); ++i) { |
945 // Following packets only have paddings. | 984 // Following packets only have paddings. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
979 QuicStringPiece(buf, kStreamFramePayloadSize)), | 1018 QuicStringPiece(buf, kStreamFramePayloadSize)), |
980 0, FIN_AND_PADDING, nullptr); | 1019 0, FIN_AND_PADDING, nullptr); |
981 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); | 1020 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
982 consumed = generator_.ConsumeData(kDataStreamId2, | 1021 consumed = generator_.ConsumeData(kDataStreamId2, |
983 MakeIOVectorFromStringPiece(QuicStringPiece( | 1022 MakeIOVectorFromStringPiece(QuicStringPiece( |
984 buf, kStreamFramePayloadSize)), | 1023 buf, kStreamFramePayloadSize)), |
985 0, FIN_AND_PADDING, nullptr); | 1024 0, FIN_AND_PADDING, nullptr); |
986 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); | 1025 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
987 generator_.FinishBatchOperations(); | 1026 generator_.FinishBatchOperations(); |
988 EXPECT_FALSE(generator_.HasQueuedFrames()); | 1027 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1028 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
989 | 1029 |
990 EXPECT_LE(2u, packets_.size()); | 1030 EXPECT_LE(2u, packets_.size()); |
991 PacketContents contents; | 1031 PacketContents contents; |
992 // The first packet has two stream frames. | 1032 // The first packet has two stream frames. |
993 contents.num_stream_frames = 2; | 1033 contents.num_stream_frames = 2; |
994 CheckPacketContains(contents, 0); | 1034 CheckPacketContains(contents, 0); |
995 | 1035 |
996 // The second packet has one stream frame and padding frames. | 1036 // The second packet has one stream frame and padding frames. |
997 contents.num_stream_frames = 1; | 1037 contents.num_stream_frames = 1; |
998 contents.num_padding_frames = 1; | 1038 contents.num_padding_frames = 1; |
999 CheckPacketContains(contents, 1); | 1039 CheckPacketContains(contents, 1); |
1000 | 1040 |
1001 for (size_t i = 2; i < packets_.size(); ++i) { | 1041 for (size_t i = 2; i < packets_.size(); ++i) { |
1002 // Following packets only have paddings. | 1042 // Following packets only have paddings. |
1003 contents.num_stream_frames = 0; | 1043 contents.num_stream_frames = 0; |
1004 contents.num_padding_frames = 1; | 1044 contents.num_padding_frames = 1; |
1005 CheckPacketContains(contents, i); | 1045 CheckPacketContains(contents, i); |
1006 } | 1046 } |
1007 } | 1047 } |
1008 | 1048 |
1009 } // namespace test | 1049 } // namespace test |
1010 } // namespace net | 1050 } // namespace net |
OLD | NEW |