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_packet_generator.h" | 5 #include "net/quic/quic_packet_generator.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "net/quic/crypto/crypto_protocol.h" | 9 #include "net/quic/crypto/crypto_protocol.h" |
10 #include "net/quic/crypto/null_encrypter.h" | 10 #include "net/quic/crypto/null_encrypter.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 MockDelegate() {} | 35 MockDelegate() {} |
36 virtual ~MockDelegate() OVERRIDE {} | 36 virtual ~MockDelegate() OVERRIDE {} |
37 | 37 |
38 MOCK_METHOD3(ShouldGeneratePacket, | 38 MOCK_METHOD3(ShouldGeneratePacket, |
39 bool(TransmissionType transmission_type, | 39 bool(TransmissionType transmission_type, |
40 HasRetransmittableData retransmittable, | 40 HasRetransmittableData retransmittable, |
41 IsHandshake handshake)); | 41 IsHandshake handshake)); |
42 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); | 42 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); |
43 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); | 43 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); |
44 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); | 44 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); |
45 MOCK_METHOD1(OnSerializedPacket, bool(const SerializedPacket& packet)); | 45 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); |
46 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); | 46 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); |
47 | 47 |
48 void SetCanWriteAnything() { | 48 void SetCanWriteAnything() { |
49 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 49 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
50 .WillRepeatedly(Return(true)); | 50 .WillRepeatedly(Return(true)); |
51 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 51 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
52 NO_RETRANSMITTABLE_DATA, _)) | 52 NO_RETRANSMITTABLE_DATA, _)) |
53 .WillRepeatedly(Return(true)); | 53 .WillRepeatedly(Return(true)); |
54 } | 54 } |
55 | 55 |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | 264 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
265 | 265 |
266 generator_.SetShouldSendAck(false, false); | 266 generator_.SetShouldSendAck(false, false); |
267 EXPECT_TRUE(generator_.HasQueuedFrames()); | 267 EXPECT_TRUE(generator_.HasQueuedFrames()); |
268 } | 268 } |
269 | 269 |
270 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 270 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
271 delegate_.SetCanWriteOnlyNonRetransmittable(); | 271 delegate_.SetCanWriteOnlyNonRetransmittable(); |
272 | 272 |
273 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 273 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
274 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 274 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
275 DoAll(SaveArg<0>(&packet_), Return(true))); | |
276 | 275 |
277 generator_.SetShouldSendAck(false, false); | 276 generator_.SetShouldSendAck(false, false); |
278 EXPECT_FALSE(generator_.HasQueuedFrames()); | 277 EXPECT_FALSE(generator_.HasQueuedFrames()); |
279 | 278 |
280 PacketContents contents; | 279 PacketContents contents; |
281 contents.num_ack_frames = 1; | 280 contents.num_ack_frames = 1; |
282 CheckPacketContains(contents, packet_); | 281 CheckPacketContains(contents, packet_); |
283 } | 282 } |
284 | 283 |
285 TEST_F(QuicPacketGeneratorTest, | 284 TEST_F(QuicPacketGeneratorTest, |
(...skipping 12 matching lines...) Expand all Loading... |
298 TEST_F(QuicPacketGeneratorTest, | 297 TEST_F(QuicPacketGeneratorTest, |
299 ShouldSendAckWithFeedback_WritableAndShouldFlush) { | 298 ShouldSendAckWithFeedback_WritableAndShouldFlush) { |
300 delegate_.SetCanWriteOnlyNonRetransmittable(); | 299 delegate_.SetCanWriteOnlyNonRetransmittable(); |
301 | 300 |
302 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 301 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
303 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 302 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
304 Return(CreateFeedbackFrame())); | 303 Return(CreateFeedbackFrame())); |
305 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( | 304 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( |
306 Return(CreateStopWaitingFrame())); | 305 Return(CreateStopWaitingFrame())); |
307 | 306 |
308 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 307 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
309 DoAll(SaveArg<0>(&packet_), Return(true))); | |
310 | 308 |
311 generator_.SetShouldSendAck(true, true); | 309 generator_.SetShouldSendAck(true, true); |
312 EXPECT_FALSE(generator_.HasQueuedFrames()); | 310 EXPECT_FALSE(generator_.HasQueuedFrames()); |
313 | 311 |
314 PacketContents contents; | 312 PacketContents contents; |
315 contents.num_ack_frames = 1; | 313 contents.num_ack_frames = 1; |
316 contents.num_feedback_frames = 1; | 314 contents.num_feedback_frames = 1; |
317 contents.num_stop_waiting_frames = 1; | 315 contents.num_stop_waiting_frames = 1; |
318 CheckPacketContains(contents, packet_); | 316 CheckPacketContains(contents, packet_); |
319 } | 317 } |
(...skipping 22 matching lines...) Expand all Loading... |
342 | 340 |
343 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { | 341 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { |
344 delegate_.SetCanNotWrite(); | 342 delegate_.SetCanNotWrite(); |
345 generator_.StartBatchOperations(); | 343 generator_.StartBatchOperations(); |
346 | 344 |
347 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 345 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
348 EXPECT_TRUE(generator_.HasQueuedFrames()); | 346 EXPECT_TRUE(generator_.HasQueuedFrames()); |
349 generator_.FinishBatchOperations(); | 347 generator_.FinishBatchOperations(); |
350 EXPECT_TRUE(generator_.HasQueuedFrames()); | 348 EXPECT_TRUE(generator_.HasQueuedFrames()); |
351 | 349 |
352 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 350 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
353 DoAll(SaveArg<0>(&packet_), Return(true))); | |
354 generator_.FlushAllQueuedFrames(); | 351 generator_.FlushAllQueuedFrames(); |
355 EXPECT_FALSE(generator_.HasQueuedFrames()); | 352 EXPECT_FALSE(generator_.HasQueuedFrames()); |
356 | 353 |
357 PacketContents contents; | 354 PacketContents contents; |
358 contents.num_rst_stream_frames = 1; | 355 contents.num_rst_stream_frames = 1; |
359 CheckPacketContains(contents, packet_); | 356 CheckPacketContains(contents, packet_); |
360 } | 357 } |
361 | 358 |
362 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { | 359 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { |
363 delegate_.SetCanWriteAnything(); | 360 delegate_.SetCanWriteAnything(); |
364 | 361 |
365 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 362 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
366 DoAll(SaveArg<0>(&packet_), Return(true))); | |
367 | 363 |
368 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 364 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
369 EXPECT_FALSE(generator_.HasQueuedFrames()); | 365 EXPECT_FALSE(generator_.HasQueuedFrames()); |
370 | 366 |
371 PacketContents contents; | 367 PacketContents contents; |
372 contents.num_rst_stream_frames = 1; | 368 contents.num_rst_stream_frames = 1; |
373 CheckPacketContains(contents, packet_); | 369 CheckPacketContains(contents, packet_); |
374 } | 370 } |
375 | 371 |
376 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | 372 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
(...skipping 13 matching lines...) Expand all Loading... |
390 QuicConsumedData consumed = generator_.ConsumeData( | 386 QuicConsumedData consumed = generator_.ConsumeData( |
391 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); | 387 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); |
392 EXPECT_EQ(3u, consumed.bytes_consumed); | 388 EXPECT_EQ(3u, consumed.bytes_consumed); |
393 EXPECT_TRUE(consumed.fin_consumed); | 389 EXPECT_TRUE(consumed.fin_consumed); |
394 EXPECT_TRUE(generator_.HasQueuedFrames()); | 390 EXPECT_TRUE(generator_.HasQueuedFrames()); |
395 } | 391 } |
396 | 392 |
397 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | 393 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
398 delegate_.SetCanWriteAnything(); | 394 delegate_.SetCanWriteAnything(); |
399 | 395 |
400 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 396 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
401 DoAll(SaveArg<0>(&packet_), Return(true))); | |
402 QuicConsumedData consumed = generator_.ConsumeData( | 397 QuicConsumedData consumed = generator_.ConsumeData( |
403 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); | 398 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); |
404 EXPECT_EQ(3u, consumed.bytes_consumed); | 399 EXPECT_EQ(3u, consumed.bytes_consumed); |
405 EXPECT_TRUE(consumed.fin_consumed); | 400 EXPECT_TRUE(consumed.fin_consumed); |
406 EXPECT_FALSE(generator_.HasQueuedFrames()); | 401 EXPECT_FALSE(generator_.HasQueuedFrames()); |
407 | 402 |
408 PacketContents contents; | 403 PacketContents contents; |
409 contents.num_stream_frames = 1; | 404 contents.num_stream_frames = 1; |
410 CheckPacketContains(contents, packet_); | 405 CheckPacketContains(contents, packet_); |
411 } | 406 } |
(...skipping 18 matching lines...) Expand all Loading... |
430 | 425 |
431 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | 426 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, |
432 MAY_FEC_PROTECT, NULL); | 427 MAY_FEC_PROTECT, NULL); |
433 QuicConsumedData consumed = generator_.ConsumeData( | 428 QuicConsumedData consumed = generator_.ConsumeData( |
434 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL); | 429 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL); |
435 EXPECT_EQ(4u, consumed.bytes_consumed); | 430 EXPECT_EQ(4u, consumed.bytes_consumed); |
436 EXPECT_FALSE(consumed.fin_consumed); | 431 EXPECT_FALSE(consumed.fin_consumed); |
437 EXPECT_TRUE(generator_.HasQueuedFrames()); | 432 EXPECT_TRUE(generator_.HasQueuedFrames()); |
438 | 433 |
439 // Now both frames will be flushed out. | 434 // Now both frames will be flushed out. |
440 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 435 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
441 DoAll(SaveArg<0>(&packet_), Return(true))); | |
442 generator_.FinishBatchOperations(); | 436 generator_.FinishBatchOperations(); |
443 EXPECT_FALSE(generator_.HasQueuedFrames()); | 437 EXPECT_FALSE(generator_.HasQueuedFrames()); |
444 | 438 |
445 PacketContents contents; | 439 PacketContents contents; |
446 contents.num_stream_frames = 2; | 440 contents.num_stream_frames = 2; |
447 CheckPacketContains(contents, packet_); | 441 CheckPacketContains(contents, packet_); |
448 } | 442 } |
449 | 443 |
450 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { | 444 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { |
451 delegate_.SetCanWriteAnything(); | 445 delegate_.SetCanWriteAnything(); |
452 | 446 |
453 // Send FEC every two packets. | 447 // Send FEC every two packets. |
454 creator_->set_max_packets_per_fec_group(2); | 448 creator_->set_max_packets_per_fec_group(2); |
455 | 449 |
456 { | 450 { |
457 InSequence dummy; | 451 InSequence dummy; |
458 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 452 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
459 DoAll(SaveArg<0>(&packet_), Return(true))); | 453 SaveArg<0>(&packet_)); |
460 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 454 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
461 DoAll(SaveArg<0>(&packet2_), Return(true))); | 455 SaveArg<0>(&packet2_)); |
462 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 456 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
463 DoAll(SaveArg<0>(&packet3_), Return(true))); | 457 SaveArg<0>(&packet3_)); |
464 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 458 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
465 DoAll(SaveArg<0>(&packet4_), Return(true))); | 459 SaveArg<0>(&packet4_)); |
466 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 460 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
467 DoAll(SaveArg<0>(&packet5_), Return(true))); | 461 SaveArg<0>(&packet5_)); |
468 } | 462 } |
469 | 463 |
470 // Send enough data to create 3 packets: two full and one partial. Send | 464 // Send enough data to create 3 packets: two full and one partial. Send |
471 // with MUST_FEC_PROTECT flag. | 465 // with MUST_FEC_PROTECT flag. |
472 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 466 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
473 QuicConsumedData consumed = | 467 QuicConsumedData consumed = |
474 generator_.ConsumeData(3, CreateData(data_len), 0, true, | 468 generator_.ConsumeData(3, CreateData(data_len), 0, true, |
475 MUST_FEC_PROTECT, NULL); | 469 MUST_FEC_PROTECT, NULL); |
476 EXPECT_EQ(data_len, consumed.bytes_consumed); | 470 EXPECT_EQ(data_len, consumed.bytes_consumed); |
477 EXPECT_TRUE(consumed.fin_consumed); | 471 EXPECT_TRUE(consumed.fin_consumed); |
478 EXPECT_FALSE(generator_.HasQueuedFrames()); | 472 EXPECT_FALSE(generator_.HasQueuedFrames()); |
479 | 473 |
480 CheckPacketHasSingleStreamFrame(packet_); | 474 CheckPacketHasSingleStreamFrame(packet_); |
481 CheckPacketHasSingleStreamFrame(packet2_); | 475 CheckPacketHasSingleStreamFrame(packet2_); |
482 CheckPacketIsFec(packet3_, 1); | 476 CheckPacketIsFec(packet3_, 1); |
483 | 477 |
484 CheckPacketHasSingleStreamFrame(packet4_); | 478 CheckPacketHasSingleStreamFrame(packet4_); |
485 CheckPacketIsFec(packet5_, 4); | 479 CheckPacketIsFec(packet5_, 4); |
486 } | 480 } |
487 | 481 |
488 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { | 482 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { |
489 delegate_.SetCanWriteAnything(); | 483 delegate_.SetCanWriteAnything(); |
490 | 484 |
491 // Enable FEC. | 485 // Enable FEC. |
492 creator_->set_max_packets_per_fec_group(6); | 486 creator_->set_max_packets_per_fec_group(6); |
493 { | 487 { |
494 InSequence dummy; | 488 InSequence dummy; |
495 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 489 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
496 DoAll(SaveArg<0>(&packet_), Return(true))); | 490 SaveArg<0>(&packet_)); |
497 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 491 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
498 DoAll(SaveArg<0>(&packet2_), Return(true))); | 492 SaveArg<0>(&packet2_)); |
499 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 493 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
500 DoAll(SaveArg<0>(&packet3_), Return(true))); | 494 SaveArg<0>(&packet3_)); |
501 } | 495 } |
502 | 496 |
503 // Send enough data to create 2 packets: one full and one partial. Send | 497 // Send enough data to create 2 packets: one full and one partial. Send |
504 // with MUST_FEC_PROTECT flag. | 498 // with MUST_FEC_PROTECT flag. |
505 size_t data_len = 1 * kDefaultMaxPacketSize + 100; | 499 size_t data_len = 1 * kDefaultMaxPacketSize + 100; |
506 QuicConsumedData consumed = | 500 QuicConsumedData consumed = |
507 generator_.ConsumeData(3, CreateData(data_len), 0, true, | 501 generator_.ConsumeData(3, CreateData(data_len), 0, true, |
508 MUST_FEC_PROTECT, NULL); | 502 MUST_FEC_PROTECT, NULL); |
509 EXPECT_EQ(data_len, consumed.bytes_consumed); | 503 EXPECT_EQ(data_len, consumed.bytes_consumed); |
510 EXPECT_TRUE(consumed.fin_consumed); | 504 EXPECT_TRUE(consumed.fin_consumed); |
(...skipping 15 matching lines...) Expand all Loading... |
526 NOT_IN_FEC_GROUP) + | 520 NOT_IN_FEC_GROUP) + |
527 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger | 521 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger |
528 // than the GetMinStreamFrameSize. | 522 // than the GetMinStreamFrameSize. |
529 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + | 523 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + |
530 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; | 524 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; |
531 creator_->set_max_packet_length(length); | 525 creator_->set_max_packet_length(length); |
532 delegate_.SetCanWriteAnything(); | 526 delegate_.SetCanWriteAnything(); |
533 { | 527 { |
534 InSequence dummy; | 528 InSequence dummy; |
535 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 529 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
536 DoAll(SaveArg<0>(&packet_), Return(true))); | 530 SaveArg<0>(&packet_)); |
537 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 531 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
538 DoAll(SaveArg<0>(&packet2_), Return(true))); | 532 SaveArg<0>(&packet2_)); |
539 } | 533 } |
540 generator_.StartBatchOperations(); | 534 generator_.StartBatchOperations(); |
541 // Queue enough data to prevent a stream frame with a non-zero offset from | 535 // Queue enough data to prevent a stream frame with a non-zero offset from |
542 // fitting. | 536 // fitting. |
543 QuicConsumedData consumed = generator_.ConsumeData( | 537 QuicConsumedData consumed = generator_.ConsumeData( |
544 kHeadersStreamId, MakeIOVector("foo"), 0, false, MAY_FEC_PROTECT, NULL); | 538 kHeadersStreamId, MakeIOVector("foo"), 0, false, MAY_FEC_PROTECT, NULL); |
545 EXPECT_EQ(3u, consumed.bytes_consumed); | 539 EXPECT_EQ(3u, consumed.bytes_consumed); |
546 EXPECT_FALSE(consumed.fin_consumed); | 540 EXPECT_FALSE(consumed.fin_consumed); |
547 EXPECT_TRUE(generator_.HasQueuedFrames()); | 541 EXPECT_TRUE(generator_.HasQueuedFrames()); |
548 | 542 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 generator_.StartBatchOperations(); | 581 generator_.StartBatchOperations(); |
588 creator_->set_max_packets_per_fec_group(50); | 582 creator_->set_max_packets_per_fec_group(50); |
589 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | 583 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
590 EXPECT_FALSE(creator_->IsFecGroupOpen()); | 584 EXPECT_FALSE(creator_->IsFecGroupOpen()); |
591 | 585 |
592 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. | 586 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. |
593 // 3 packets are sent, one is queued in the creator. | 587 // 3 packets are sent, one is queued in the creator. |
594 { | 588 { |
595 InSequence dummy; | 589 InSequence dummy; |
596 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 590 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
597 DoAll(SaveArg<0>(&packet_), Return(true))); | 591 SaveArg<0>(&packet_)); |
598 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 592 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
599 DoAll(SaveArg<0>(&packet2_), Return(true))); | 593 SaveArg<0>(&packet2_)); |
600 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 594 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
601 DoAll(SaveArg<0>(&packet3_), Return(true))); | 595 SaveArg<0>(&packet3_)); |
602 } | 596 } |
603 size_t data_len = 3 * kDefaultMaxPacketSize + 1; | 597 size_t data_len = 3 * kDefaultMaxPacketSize + 1; |
604 QuicConsumedData consumed = generator_.ConsumeData( | 598 QuicConsumedData consumed = generator_.ConsumeData( |
605 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); | 599 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); |
606 EXPECT_EQ(data_len, consumed.bytes_consumed); | 600 EXPECT_EQ(data_len, consumed.bytes_consumed); |
607 EXPECT_TRUE(creator_->IsFecGroupOpen()); | 601 EXPECT_TRUE(creator_->IsFecGroupOpen()); |
608 | 602 |
609 // Change FEC groupsize. | 603 // Change FEC groupsize. |
610 generator_.OnCongestionWindowChange(2 * kDefaultTCPMSS); | 604 generator_.OnCongestionWindowChange(2 * kDefaultTCPMSS); |
611 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | 605 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); |
612 | 606 |
613 // Send enough data to trigger one unprotected data packet, | 607 // Send enough data to trigger one unprotected data packet, |
614 // causing the FEC packet to also be sent. | 608 // causing the FEC packet to also be sent. |
615 { | 609 { |
616 InSequence dummy; | 610 InSequence dummy; |
617 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 611 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
618 DoAll(SaveArg<0>(&packet4_), Return(true))); | 612 SaveArg<0>(&packet4_)); |
619 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 613 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
620 DoAll(SaveArg<0>(&packet5_), Return(true))); | 614 SaveArg<0>(&packet5_)); |
621 } | 615 } |
622 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, | 616 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, |
623 true, MAY_FEC_PROTECT, NULL); | 617 true, MAY_FEC_PROTECT, NULL); |
624 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); | 618 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); |
625 // Verify that one FEC packet was sent. | 619 // Verify that one FEC packet was sent. |
626 CheckPacketIsFec(packet5_, /*fec_group=*/1u); | 620 CheckPacketIsFec(packet5_, /*fec_group=*/1u); |
627 EXPECT_FALSE(creator_->IsFecGroupOpen()); | 621 EXPECT_FALSE(creator_->IsFecGroupOpen()); |
628 EXPECT_FALSE(creator_->IsFecProtected()); | 622 EXPECT_FALSE(creator_->IsFecProtected()); |
629 } | 623 } |
630 | 624 |
631 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { | 625 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { |
632 delegate_.SetCanWriteAnything(); | 626 delegate_.SetCanWriteAnything(); |
633 creator_->set_max_packets_per_fec_group(2); | 627 creator_->set_max_packets_per_fec_group(2); |
634 EXPECT_FALSE(creator_->IsFecProtected()); | 628 EXPECT_FALSE(creator_->IsFecProtected()); |
635 | 629 |
636 // Send one unprotected data packet. | 630 // Send one unprotected data packet. |
637 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 631 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
638 DoAll(SaveArg<0>(&packet_), Return(true))); | 632 SaveArg<0>(&packet_)); |
639 QuicConsumedData consumed = | 633 QuicConsumedData consumed = |
640 generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | 634 generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
641 NULL); | 635 NULL); |
642 EXPECT_EQ(1u, consumed.bytes_consumed); | 636 EXPECT_EQ(1u, consumed.bytes_consumed); |
643 EXPECT_FALSE(generator_.HasQueuedFrames()); | 637 EXPECT_FALSE(generator_.HasQueuedFrames()); |
644 EXPECT_FALSE(creator_->IsFecProtected()); | 638 EXPECT_FALSE(creator_->IsFecProtected()); |
645 // Verify that one data packet was sent. | 639 // Verify that one data packet was sent. |
646 PacketContents contents; | 640 PacketContents contents; |
647 contents.num_stream_frames = 1; | 641 contents.num_stream_frames = 1; |
648 CheckPacketContains(contents, packet_); | 642 CheckPacketContains(contents, packet_); |
649 | 643 |
650 { | 644 { |
651 InSequence dummy; | 645 InSequence dummy; |
652 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 646 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
653 DoAll(SaveArg<0>(&packet2_), Return(true))); | 647 SaveArg<0>(&packet2_)); |
654 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 648 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
655 DoAll(SaveArg<0>(&packet3_), Return(true))); | 649 SaveArg<0>(&packet3_)); |
656 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 650 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
657 DoAll(SaveArg<0>(&packet4_), Return(true))); | 651 SaveArg<0>(&packet4_)); |
658 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 652 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
659 DoAll(SaveArg<0>(&packet5_), Return(true))); | 653 SaveArg<0>(&packet5_)); |
660 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 654 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
661 DoAll(SaveArg<0>(&packet6_), Return(true))); | 655 SaveArg<0>(&packet6_)); |
662 } | 656 } |
663 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. | 657 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. |
664 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 658 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
665 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | 659 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
666 MUST_FEC_PROTECT, NULL); | 660 MUST_FEC_PROTECT, NULL); |
667 EXPECT_EQ(data_len, consumed.bytes_consumed); | 661 EXPECT_EQ(data_len, consumed.bytes_consumed); |
668 EXPECT_FALSE(generator_.HasQueuedFrames()); | 662 EXPECT_FALSE(generator_.HasQueuedFrames()); |
669 | 663 |
670 // Verify that two FEC packets were sent. | 664 // Verify that two FEC packets were sent. |
671 CheckPacketHasSingleStreamFrame(packet2_); | 665 CheckPacketHasSingleStreamFrame(packet2_); |
672 CheckPacketHasSingleStreamFrame(packet3_); | 666 CheckPacketHasSingleStreamFrame(packet3_); |
673 CheckPacketIsFec(packet4_, /*fec_group=*/2u); | 667 CheckPacketIsFec(packet4_, /*fec_group=*/2u); |
674 CheckPacketHasSingleStreamFrame(packet5_); | 668 CheckPacketHasSingleStreamFrame(packet5_); |
675 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. | 669 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. |
676 | 670 |
677 // Send one unprotected data packet. | 671 // Send one unprotected data packet. |
678 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 672 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
679 DoAll(SaveArg<0>(&packet7_), Return(true))); | 673 SaveArg<0>(&packet7_)); |
680 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 674 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
681 MAY_FEC_PROTECT, NULL); | 675 MAY_FEC_PROTECT, NULL); |
682 EXPECT_EQ(1u, consumed.bytes_consumed); | 676 EXPECT_EQ(1u, consumed.bytes_consumed); |
683 EXPECT_FALSE(generator_.HasQueuedFrames()); | 677 EXPECT_FALSE(generator_.HasQueuedFrames()); |
684 EXPECT_FALSE(creator_->IsFecProtected()); | 678 EXPECT_FALSE(creator_->IsFecProtected()); |
685 // Verify that one unprotected data packet was sent. | 679 // Verify that one unprotected data packet was sent. |
686 CheckPacketContains(contents, packet7_); | 680 CheckPacketContains(contents, packet7_); |
687 } | 681 } |
688 | 682 |
689 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { | 683 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { |
690 delegate_.SetCanWriteAnything(); | 684 delegate_.SetCanWriteAnything(); |
691 // Enable FEC. | 685 // Enable FEC. |
692 creator_->set_max_packets_per_fec_group(2); | 686 creator_->set_max_packets_per_fec_group(2); |
693 | 687 |
694 generator_.StartBatchOperations(); | 688 generator_.StartBatchOperations(); |
695 // Queue enough data to prevent a stream frame with a non-zero offset from | 689 // Queue enough data to prevent a stream frame with a non-zero offset from |
696 // fitting. | 690 // fitting. |
697 QuicConsumedData consumed = generator_.ConsumeData( | 691 QuicConsumedData consumed = generator_.ConsumeData( |
698 7, CreateData(1u), 0, true, MAY_FEC_PROTECT, NULL); | 692 7, CreateData(1u), 0, true, MAY_FEC_PROTECT, NULL); |
699 EXPECT_EQ(1u, consumed.bytes_consumed); | 693 EXPECT_EQ(1u, consumed.bytes_consumed); |
700 EXPECT_TRUE(creator_->HasPendingFrames()); | 694 EXPECT_TRUE(creator_->HasPendingFrames()); |
701 | 695 |
702 // Queue protected data for sending. Should cause queued frames to be flushed. | 696 // Queue protected data for sending. Should cause queued frames to be flushed. |
703 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 697 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
704 DoAll(SaveArg<0>(&packet_), Return(true))); | 698 SaveArg<0>(&packet_)); |
705 EXPECT_FALSE(creator_->IsFecProtected()); | 699 EXPECT_FALSE(creator_->IsFecProtected()); |
706 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 700 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
707 MUST_FEC_PROTECT, NULL); | 701 MUST_FEC_PROTECT, NULL); |
708 EXPECT_EQ(1u, consumed.bytes_consumed); | 702 EXPECT_EQ(1u, consumed.bytes_consumed); |
709 PacketContents contents; | 703 PacketContents contents; |
710 contents.num_stream_frames = 1; | 704 contents.num_stream_frames = 1; |
711 // Transmitted packet was not FEC protected. | 705 // Transmitted packet was not FEC protected. |
712 CheckPacketContains(contents, packet_); | 706 CheckPacketContains(contents, packet_); |
713 EXPECT_TRUE(creator_->IsFecProtected()); | 707 EXPECT_TRUE(creator_->IsFecProtected()); |
714 EXPECT_TRUE(creator_->HasPendingFrames()); | 708 EXPECT_TRUE(creator_->HasPendingFrames()); |
(...skipping 16 matching lines...) Expand all Loading... |
731 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( | 725 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( |
732 Return(CreateStopWaitingFrame())); | 726 Return(CreateStopWaitingFrame())); |
733 | 727 |
734 // Generator should have queued control frames, and creator should be empty. | 728 // Generator should have queued control frames, and creator should be empty. |
735 EXPECT_TRUE(generator_.HasQueuedFrames()); | 729 EXPECT_TRUE(generator_.HasQueuedFrames()); |
736 EXPECT_FALSE(creator_->HasPendingFrames()); | 730 EXPECT_FALSE(creator_->HasPendingFrames()); |
737 EXPECT_FALSE(creator_->IsFecProtected()); | 731 EXPECT_FALSE(creator_->IsFecProtected()); |
738 | 732 |
739 // Queue protected data for sending. Should cause queued frames to be flushed. | 733 // Queue protected data for sending. Should cause queued frames to be flushed. |
740 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 734 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
741 DoAll(SaveArg<0>(&packet_), Return(true))); | 735 SaveArg<0>(&packet_)); |
742 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 736 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
743 MUST_FEC_PROTECT, NULL); | 737 MUST_FEC_PROTECT, NULL); |
744 EXPECT_EQ(1u, consumed.bytes_consumed); | 738 EXPECT_EQ(1u, consumed.bytes_consumed); |
745 PacketContents contents; | 739 PacketContents contents; |
746 contents.num_ack_frames = 1; | 740 contents.num_ack_frames = 1; |
747 contents.num_feedback_frames = 1; | 741 contents.num_feedback_frames = 1; |
748 contents.num_stop_waiting_frames = 1; | 742 contents.num_stop_waiting_frames = 1; |
749 CheckPacketContains(contents, packet_); | 743 CheckPacketContains(contents, packet_); |
750 | 744 |
751 // FEC protection should be on in creator. | 745 // FEC protection should be on in creator. |
(...skipping 11 matching lines...) Expand all Loading... |
763 generator_.StartBatchOperations(); | 757 generator_.StartBatchOperations(); |
764 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | 758 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
765 MUST_FEC_PROTECT, NULL); | 759 MUST_FEC_PROTECT, NULL); |
766 EXPECT_EQ(1u, consumed.bytes_consumed); | 760 EXPECT_EQ(1u, consumed.bytes_consumed); |
767 // Creator has a pending protected frame. | 761 // Creator has a pending protected frame. |
768 EXPECT_TRUE(creator_->HasPendingFrames()); | 762 EXPECT_TRUE(creator_->HasPendingFrames()); |
769 EXPECT_TRUE(creator_->IsFecProtected()); | 763 EXPECT_TRUE(creator_->IsFecProtected()); |
770 | 764 |
771 // Add enough unprotected data to exceed size of current packet, so that | 765 // Add enough unprotected data to exceed size of current packet, so that |
772 // current packet is sent. Both frames will be sent out in a single packet. | 766 // current packet is sent. Both frames will be sent out in a single packet. |
773 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 767 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
774 DoAll(SaveArg<0>(&packet_), Return(true))); | |
775 size_t data_len = kDefaultMaxPacketSize; | 768 size_t data_len = kDefaultMaxPacketSize; |
776 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 769 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
777 MAY_FEC_PROTECT, NULL); | 770 MAY_FEC_PROTECT, NULL); |
778 EXPECT_EQ(data_len, consumed.bytes_consumed); | 771 EXPECT_EQ(data_len, consumed.bytes_consumed); |
779 PacketContents contents; | 772 PacketContents contents; |
780 contents.num_stream_frames = 2u; | 773 contents.num_stream_frames = 2u; |
781 contents.fec_group = 1u; | 774 contents.fec_group = 1u; |
782 CheckPacketContains(contents, packet_); | 775 CheckPacketContains(contents, packet_); |
783 // FEC protection should still be on in creator. | 776 // FEC protection should still be on in creator. |
784 EXPECT_TRUE(creator_->IsFecProtected()); | 777 EXPECT_TRUE(creator_->IsFecProtected()); |
785 } | 778 } |
786 | 779 |
787 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { | 780 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { |
788 delegate_.SetCanWriteAnything(); | 781 delegate_.SetCanWriteAnything(); |
789 | 782 |
790 // Enable FEC. | 783 // Enable FEC. |
791 creator_->set_max_packets_per_fec_group(2); | 784 creator_->set_max_packets_per_fec_group(2); |
792 EXPECT_FALSE(creator_->IsFecProtected()); | 785 EXPECT_FALSE(creator_->IsFecProtected()); |
793 | 786 |
794 generator_.StartBatchOperations(); | 787 generator_.StartBatchOperations(); |
795 // Send first packet, FEC protected. | 788 // Send first packet, FEC protected. |
796 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 789 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
797 DoAll(SaveArg<0>(&packet_), Return(true))); | |
798 // Write enough data to cause a packet to be emitted. | 790 // Write enough data to cause a packet to be emitted. |
799 size_t data_len = kDefaultMaxPacketSize; | 791 size_t data_len = kDefaultMaxPacketSize; |
800 QuicConsumedData consumed = generator_.ConsumeData( | 792 QuicConsumedData consumed = generator_.ConsumeData( |
801 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); | 793 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); |
802 EXPECT_EQ(data_len, consumed.bytes_consumed); | 794 EXPECT_EQ(data_len, consumed.bytes_consumed); |
803 PacketContents contents; | 795 PacketContents contents; |
804 contents.num_stream_frames = 1u; | 796 contents.num_stream_frames = 1u; |
805 contents.fec_group = 1u; | 797 contents.fec_group = 1u; |
806 CheckPacketContains(contents, packet_); | 798 CheckPacketContains(contents, packet_); |
807 | 799 |
808 // FEC should still be on in creator. | 800 // FEC should still be on in creator. |
809 EXPECT_TRUE(creator_->IsFecProtected()); | 801 EXPECT_TRUE(creator_->IsFecProtected()); |
810 | 802 |
811 // Send enough unprotected data to cause second packet to be sent, which gets | 803 // Send enough unprotected data to cause second packet to be sent, which gets |
812 // protected because it happens to fall within an open FEC group. Data packet | 804 // protected because it happens to fall within an open FEC group. Data packet |
813 // will be followed by FEC packet. | 805 // will be followed by FEC packet. |
814 { | 806 { |
815 InSequence dummy; | 807 InSequence dummy; |
816 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 808 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
817 DoAll(SaveArg<0>(&packet2_), Return(true))); | 809 SaveArg<0>(&packet2_)); |
818 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 810 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
819 DoAll(SaveArg<0>(&packet3_), Return(true))); | 811 SaveArg<0>(&packet3_)); |
820 } | 812 } |
821 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 813 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
822 MAY_FEC_PROTECT, NULL); | 814 MAY_FEC_PROTECT, NULL); |
823 EXPECT_EQ(data_len, consumed.bytes_consumed); | 815 EXPECT_EQ(data_len, consumed.bytes_consumed); |
824 contents.num_stream_frames = 2u; | 816 contents.num_stream_frames = 2u; |
825 CheckPacketContains(contents, packet2_); | 817 CheckPacketContains(contents, packet2_); |
826 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 818 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
827 | 819 |
828 // FEC protection should be off in creator. | 820 // FEC protection should be off in creator. |
829 EXPECT_FALSE(creator_->IsFecProtected()); | 821 EXPECT_FALSE(creator_->IsFecProtected()); |
830 } | 822 } |
831 | 823 |
832 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { | 824 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { |
833 delegate_.SetCanWriteAnything(); | 825 delegate_.SetCanWriteAnything(); |
834 generator_.StartBatchOperations(); | 826 generator_.StartBatchOperations(); |
835 | 827 |
836 // Enable FEC. | 828 // Enable FEC. |
837 creator_->set_max_packets_per_fec_group(2); | 829 creator_->set_max_packets_per_fec_group(2); |
838 EXPECT_FALSE(creator_->IsFecProtected()); | 830 EXPECT_FALSE(creator_->IsFecProtected()); |
839 | 831 |
840 // Queue one byte of FEC protected data. | 832 // Queue one byte of FEC protected data. |
841 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | 833 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
842 MUST_FEC_PROTECT, NULL); | 834 MUST_FEC_PROTECT, NULL); |
843 EXPECT_TRUE(creator_->HasPendingFrames()); | 835 EXPECT_TRUE(creator_->HasPendingFrames()); |
844 | 836 |
845 // Add more unprotected data causing first packet to be sent, FEC protected. | 837 // Add more unprotected data causing first packet to be sent, FEC protected. |
846 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 838 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
847 DoAll(SaveArg<0>(&packet_), Return(true))); | 839 SaveArg<0>(&packet_)); |
848 size_t data_len = kDefaultMaxPacketSize; | 840 size_t data_len = kDefaultMaxPacketSize; |
849 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 841 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
850 MAY_FEC_PROTECT, NULL); | 842 MAY_FEC_PROTECT, NULL); |
851 EXPECT_EQ(data_len, consumed.bytes_consumed); | 843 EXPECT_EQ(data_len, consumed.bytes_consumed); |
852 PacketContents contents; | 844 PacketContents contents; |
853 contents.num_stream_frames = 2u; | 845 contents.num_stream_frames = 2u; |
854 contents.fec_group = 1u; | 846 contents.fec_group = 1u; |
855 CheckPacketContains(contents, packet_); | 847 CheckPacketContains(contents, packet_); |
856 | 848 |
857 // FEC group is still open in creator. | 849 // FEC group is still open in creator. |
858 EXPECT_TRUE(creator_->IsFecProtected()); | 850 EXPECT_TRUE(creator_->IsFecProtected()); |
859 | 851 |
860 // Add data that should be protected, large enough to cause second packet to | 852 // Add data that should be protected, large enough to cause second packet to |
861 // be sent. Data packet should be followed by FEC packet. | 853 // be sent. Data packet should be followed by FEC packet. |
862 { | 854 { |
863 InSequence dummy; | 855 InSequence dummy; |
864 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 856 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
865 DoAll(SaveArg<0>(&packet2_), Return(true))); | 857 SaveArg<0>(&packet2_)); |
866 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 858 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
867 DoAll(SaveArg<0>(&packet3_), Return(true))); | 859 SaveArg<0>(&packet3_)); |
868 } | 860 } |
869 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 861 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
870 MUST_FEC_PROTECT, NULL); | 862 MUST_FEC_PROTECT, NULL); |
871 EXPECT_EQ(data_len, consumed.bytes_consumed); | 863 EXPECT_EQ(data_len, consumed.bytes_consumed); |
872 CheckPacketContains(contents, packet2_); | 864 CheckPacketContains(contents, packet2_); |
873 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 865 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
874 | 866 |
875 // FEC protection should remain on in creator. | 867 // FEC protection should remain on in creator. |
876 EXPECT_TRUE(creator_->IsFecProtected()); | 868 EXPECT_TRUE(creator_->IsFecProtected()); |
877 } | 869 } |
(...skipping 14 matching lines...) Expand all Loading... |
892 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 884 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
893 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 885 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
894 Return(CreateFeedbackFrame())); | 886 Return(CreateFeedbackFrame())); |
895 | 887 |
896 // Send some data and a control frame | 888 // Send some data and a control frame |
897 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, | 889 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, |
898 MAY_FEC_PROTECT, NULL); | 890 MAY_FEC_PROTECT, NULL); |
899 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 891 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
900 | 892 |
901 // All five frames will be flushed out in a single packet. | 893 // All five frames will be flushed out in a single packet. |
902 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 894 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
903 DoAll(SaveArg<0>(&packet_), Return(true))); | |
904 generator_.FinishBatchOperations(); | 895 generator_.FinishBatchOperations(); |
905 EXPECT_FALSE(generator_.HasQueuedFrames()); | 896 EXPECT_FALSE(generator_.HasQueuedFrames()); |
906 | 897 |
907 PacketContents contents; | 898 PacketContents contents; |
908 contents.num_ack_frames = 1; | 899 contents.num_ack_frames = 1; |
909 contents.num_goaway_frames = 1; | 900 contents.num_goaway_frames = 1; |
910 contents.num_feedback_frames = 1; | 901 contents.num_feedback_frames = 1; |
911 contents.num_rst_stream_frames = 1; | 902 contents.num_rst_stream_frames = 1; |
912 contents.num_stream_frames = 1; | 903 contents.num_stream_frames = 1; |
913 CheckPacketContains(contents, packet_); | 904 CheckPacketContains(contents, packet_); |
(...skipping 11 matching lines...) Expand all Loading... |
925 generator_.StartBatchOperations(); | 916 generator_.StartBatchOperations(); |
926 | 917 |
927 // When the first write operation is invoked, the ack and feedback | 918 // When the first write operation is invoked, the ack and feedback |
928 // frames will be returned. | 919 // frames will be returned. |
929 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 920 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
930 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 921 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
931 Return(CreateFeedbackFrame())); | 922 Return(CreateFeedbackFrame())); |
932 | 923 |
933 { | 924 { |
934 InSequence dummy; | 925 InSequence dummy; |
935 // All five frames will be flushed out in a single packet | 926 // All five frames will be flushed out in a single packet |
936 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 927 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
937 DoAll(SaveArg<0>(&packet_), Return(true))); | 928 SaveArg<0>(&packet_)); |
938 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 929 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
939 DoAll(SaveArg<0>(&packet2_), Return(true))); | 930 SaveArg<0>(&packet2_)); |
940 } | 931 } |
941 | 932 |
942 // Send enough data to exceed one packet | 933 // Send enough data to exceed one packet |
943 size_t data_len = kDefaultMaxPacketSize + 100; | 934 size_t data_len = kDefaultMaxPacketSize + 100; |
944 QuicConsumedData consumed = | 935 QuicConsumedData consumed = |
945 generator_.ConsumeData(3, CreateData(data_len), 0, true, | 936 generator_.ConsumeData(3, CreateData(data_len), 0, true, |
946 MAY_FEC_PROTECT, NULL); | 937 MAY_FEC_PROTECT, NULL); |
947 EXPECT_EQ(data_len, consumed.bytes_consumed); | 938 EXPECT_EQ(data_len, consumed.bytes_consumed); |
948 EXPECT_TRUE(consumed.fin_consumed); | 939 EXPECT_TRUE(consumed.fin_consumed); |
949 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 940 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
(...skipping 11 matching lines...) Expand all Loading... |
961 | 952 |
962 // The second should have the remainder of the stream data. | 953 // The second should have the remainder of the stream data. |
963 PacketContents contents2; | 954 PacketContents contents2; |
964 contents2.num_goaway_frames = 1; | 955 contents2.num_goaway_frames = 1; |
965 contents2.num_stream_frames = 1; | 956 contents2.num_stream_frames = 1; |
966 CheckPacketContains(contents2, packet2_); | 957 CheckPacketContains(contents2, packet2_); |
967 } | 958 } |
968 | 959 |
969 } // namespace test | 960 } // namespace test |
970 } // namespace net | 961 } // namespace net |
OLD | NEW |