| 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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 }; | 101 }; |
| 102 | 102 |
| 103 } // namespace | 103 } // namespace |
| 104 | 104 |
| 105 class QuicPacketGeneratorTest : public ::testing::Test { | 105 class QuicPacketGeneratorTest : public ::testing::Test { |
| 106 protected: | 106 protected: |
| 107 QuicPacketGeneratorTest() | 107 QuicPacketGeneratorTest() |
| 108 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), | 108 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), |
| 109 generator_(42, &framer_, &random_, &delegate_), | 109 generator_(42, &framer_, &random_, &delegate_), |
| 110 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)), | 110 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)), |
| 111 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 111 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 112 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 112 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 113 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 113 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 114 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 114 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 115 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 115 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 116 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 116 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 117 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL) { | 117 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr) {} |
| 118 } | |
| 119 | 118 |
| 120 virtual ~QuicPacketGeneratorTest() OVERRIDE { | 119 virtual ~QuicPacketGeneratorTest() OVERRIDE { |
| 121 delete packet_.packet; | 120 delete packet_.packet; |
| 122 delete packet_.retransmittable_frames; | 121 delete packet_.retransmittable_frames; |
| 123 delete packet2_.packet; | 122 delete packet2_.packet; |
| 124 delete packet2_.retransmittable_frames; | 123 delete packet2_.retransmittable_frames; |
| 125 delete packet3_.packet; | 124 delete packet3_.packet; |
| 126 delete packet3_.retransmittable_frames; | 125 delete packet3_.retransmittable_frames; |
| 127 delete packet4_.packet; | 126 delete packet4_.packet; |
| 128 delete packet4_.retransmittable_frames; | 127 delete packet4_.retransmittable_frames; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 | 162 |
| 164 void CheckPacketContains(const PacketContents& contents, | 163 void CheckPacketContains(const PacketContents& contents, |
| 165 const SerializedPacket& packet) { | 164 const SerializedPacket& packet) { |
| 166 size_t num_retransmittable_frames = contents.num_connection_close_frames + | 165 size_t num_retransmittable_frames = contents.num_connection_close_frames + |
| 167 contents.num_goaway_frames + contents.num_rst_stream_frames + | 166 contents.num_goaway_frames + contents.num_rst_stream_frames + |
| 168 contents.num_stream_frames; | 167 contents.num_stream_frames; |
| 169 size_t num_frames = contents.num_feedback_frames + contents.num_ack_frames + | 168 size_t num_frames = contents.num_feedback_frames + contents.num_ack_frames + |
| 170 contents.num_stop_waiting_frames + num_retransmittable_frames; | 169 contents.num_stop_waiting_frames + num_retransmittable_frames; |
| 171 | 170 |
| 172 if (num_retransmittable_frames == 0) { | 171 if (num_retransmittable_frames == 0) { |
| 173 ASSERT_TRUE(packet.retransmittable_frames == NULL); | 172 ASSERT_TRUE(packet.retransmittable_frames == nullptr); |
| 174 } else { | 173 } else { |
| 175 ASSERT_TRUE(packet.retransmittable_frames != NULL); | 174 ASSERT_TRUE(packet.retransmittable_frames != nullptr); |
| 176 EXPECT_EQ(num_retransmittable_frames, | 175 EXPECT_EQ(num_retransmittable_frames, |
| 177 packet.retransmittable_frames->frames().size()); | 176 packet.retransmittable_frames->frames().size()); |
| 178 } | 177 } |
| 179 | 178 |
| 180 ASSERT_TRUE(packet.packet != NULL); | 179 ASSERT_TRUE(packet.packet != nullptr); |
| 181 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); | 180 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); |
| 182 EXPECT_EQ(num_frames, simple_framer_.num_frames()); | 181 EXPECT_EQ(num_frames, simple_framer_.num_frames()); |
| 183 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); | 182 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); |
| 184 EXPECT_EQ(contents.num_connection_close_frames, | 183 EXPECT_EQ(contents.num_connection_close_frames, |
| 185 simple_framer_.connection_close_frames().size()); | 184 simple_framer_.connection_close_frames().size()); |
| 186 EXPECT_EQ(contents.num_feedback_frames, | 185 EXPECT_EQ(contents.num_feedback_frames, |
| 187 simple_framer_.feedback_frames().size()); | 186 simple_framer_.feedback_frames().size()); |
| 188 EXPECT_EQ(contents.num_goaway_frames, | 187 EXPECT_EQ(contents.num_goaway_frames, |
| 189 simple_framer_.goaway_frames().size()); | 188 simple_framer_.goaway_frames().size()); |
| 190 EXPECT_EQ(contents.num_rst_stream_frames, | 189 EXPECT_EQ(contents.num_rst_stream_frames, |
| 191 simple_framer_.rst_stream_frames().size()); | 190 simple_framer_.rst_stream_frames().size()); |
| 192 EXPECT_EQ(contents.num_stream_frames, | 191 EXPECT_EQ(contents.num_stream_frames, |
| 193 simple_framer_.stream_frames().size()); | 192 simple_framer_.stream_frames().size()); |
| 194 EXPECT_EQ(contents.num_stop_waiting_frames, | 193 EXPECT_EQ(contents.num_stop_waiting_frames, |
| 195 simple_framer_.stop_waiting_frames().size()); | 194 simple_framer_.stop_waiting_frames().size()); |
| 196 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group); | 195 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group); |
| 197 } | 196 } |
| 198 | 197 |
| 199 void CheckPacketHasSingleStreamFrame(const SerializedPacket& packet) { | 198 void CheckPacketHasSingleStreamFrame(const SerializedPacket& packet) { |
| 200 ASSERT_TRUE(packet.retransmittable_frames != NULL); | 199 ASSERT_TRUE(packet.retransmittable_frames != nullptr); |
| 201 EXPECT_EQ(1u, packet.retransmittable_frames->frames().size()); | 200 EXPECT_EQ(1u, packet.retransmittable_frames->frames().size()); |
| 202 ASSERT_TRUE(packet.packet != NULL); | 201 ASSERT_TRUE(packet.packet != nullptr); |
| 203 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); | 202 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); |
| 204 EXPECT_EQ(1u, simple_framer_.num_frames()); | 203 EXPECT_EQ(1u, simple_framer_.num_frames()); |
| 205 EXPECT_EQ(1u, simple_framer_.stream_frames().size()); | 204 EXPECT_EQ(1u, simple_framer_.stream_frames().size()); |
| 206 } | 205 } |
| 207 | 206 |
| 208 void CheckPacketIsFec(const SerializedPacket& packet, | 207 void CheckPacketIsFec(const SerializedPacket& packet, |
| 209 QuicPacketSequenceNumber fec_group) { | 208 QuicPacketSequenceNumber fec_group) { |
| 210 ASSERT_TRUE(packet.retransmittable_frames == NULL); | 209 ASSERT_TRUE(packet.retransmittable_frames == nullptr); |
| 211 ASSERT_TRUE(packet.packet != NULL); | 210 ASSERT_TRUE(packet.packet != nullptr); |
| 212 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); | 211 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); |
| 213 EXPECT_TRUE(simple_framer_.header().fec_flag); | 212 EXPECT_TRUE(simple_framer_.header().fec_flag); |
| 214 EXPECT_EQ(fec_group, simple_framer_.fec_data().fec_group); | 213 EXPECT_EQ(fec_group, simple_framer_.fec_data().fec_group); |
| 215 } | 214 } |
| 216 | 215 |
| 217 IOVector CreateData(size_t len) { | 216 IOVector CreateData(size_t len) { |
| 218 data_array_.reset(new char[len]); | 217 data_array_.reset(new char[len]); |
| 219 memset(data_array_.get(), '?', len); | 218 memset(data_array_.get(), '?', len); |
| 220 IOVector data; | 219 IOVector data; |
| 221 data.Append(data_array_.get(), len); | 220 data.Append(data_array_.get(), len); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 | 365 |
| 367 PacketContents contents; | 366 PacketContents contents; |
| 368 contents.num_rst_stream_frames = 1; | 367 contents.num_rst_stream_frames = 1; |
| 369 CheckPacketContains(contents, packet_); | 368 CheckPacketContains(contents, packet_); |
| 370 } | 369 } |
| 371 | 370 |
| 372 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | 371 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
| 373 delegate_.SetCanNotWrite(); | 372 delegate_.SetCanNotWrite(); |
| 374 | 373 |
| 375 QuicConsumedData consumed = generator_.ConsumeData( | 374 QuicConsumedData consumed = generator_.ConsumeData( |
| 376 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); | 375 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); |
| 377 EXPECT_EQ(0u, consumed.bytes_consumed); | 376 EXPECT_EQ(0u, consumed.bytes_consumed); |
| 378 EXPECT_FALSE(consumed.fin_consumed); | 377 EXPECT_FALSE(consumed.fin_consumed); |
| 379 EXPECT_FALSE(generator_.HasQueuedFrames()); | 378 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 380 } | 379 } |
| 381 | 380 |
| 382 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { | 381 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { |
| 383 delegate_.SetCanWriteAnything(); | 382 delegate_.SetCanWriteAnything(); |
| 384 generator_.StartBatchOperations(); | 383 generator_.StartBatchOperations(); |
| 385 | 384 |
| 386 QuicConsumedData consumed = generator_.ConsumeData( | 385 QuicConsumedData consumed = generator_.ConsumeData( |
| 387 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); | 386 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); |
| 388 EXPECT_EQ(3u, consumed.bytes_consumed); | 387 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 389 EXPECT_TRUE(consumed.fin_consumed); | 388 EXPECT_TRUE(consumed.fin_consumed); |
| 390 EXPECT_TRUE(generator_.HasQueuedFrames()); | 389 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 391 } | 390 } |
| 392 | 391 |
| 393 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | 392 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
| 394 delegate_.SetCanWriteAnything(); | 393 delegate_.SetCanWriteAnything(); |
| 395 | 394 |
| 396 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 395 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 397 QuicConsumedData consumed = generator_.ConsumeData( | 396 QuicConsumedData consumed = generator_.ConsumeData( |
| 398 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); | 397 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); |
| 399 EXPECT_EQ(3u, consumed.bytes_consumed); | 398 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 400 EXPECT_TRUE(consumed.fin_consumed); | 399 EXPECT_TRUE(consumed.fin_consumed); |
| 401 EXPECT_FALSE(generator_.HasQueuedFrames()); | 400 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 402 | 401 |
| 403 PacketContents contents; | 402 PacketContents contents; |
| 404 contents.num_stream_frames = 1; | 403 contents.num_stream_frames = 1; |
| 405 CheckPacketContains(contents, packet_); | 404 CheckPacketContains(contents, packet_); |
| 406 } | 405 } |
| 407 | 406 |
| 408 TEST_F(QuicPacketGeneratorTest, | 407 TEST_F(QuicPacketGeneratorTest, |
| 409 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { | 408 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { |
| 410 delegate_.SetCanWriteAnything(); | 409 delegate_.SetCanWriteAnything(); |
| 411 generator_.StartBatchOperations(); | 410 generator_.StartBatchOperations(); |
| 412 | 411 |
| 413 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | 412 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, |
| 414 MAY_FEC_PROTECT, NULL); | 413 MAY_FEC_PROTECT, nullptr); |
| 415 QuicConsumedData consumed = generator_.ConsumeData( | 414 QuicConsumedData consumed = generator_.ConsumeData( |
| 416 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL); | 415 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr); |
| 417 EXPECT_EQ(4u, consumed.bytes_consumed); | 416 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 418 EXPECT_FALSE(consumed.fin_consumed); | 417 EXPECT_FALSE(consumed.fin_consumed); |
| 419 EXPECT_TRUE(generator_.HasQueuedFrames()); | 418 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 420 } | 419 } |
| 421 | 420 |
| 422 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { | 421 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { |
| 423 delegate_.SetCanWriteAnything(); | 422 delegate_.SetCanWriteAnything(); |
| 424 generator_.StartBatchOperations(); | 423 generator_.StartBatchOperations(); |
| 425 | 424 |
| 426 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | 425 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, |
| 427 MAY_FEC_PROTECT, NULL); | 426 MAY_FEC_PROTECT, nullptr); |
| 428 QuicConsumedData consumed = generator_.ConsumeData( | 427 QuicConsumedData consumed = generator_.ConsumeData( |
| 429 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL); | 428 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr); |
| 430 EXPECT_EQ(4u, consumed.bytes_consumed); | 429 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 431 EXPECT_FALSE(consumed.fin_consumed); | 430 EXPECT_FALSE(consumed.fin_consumed); |
| 432 EXPECT_TRUE(generator_.HasQueuedFrames()); | 431 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 433 | 432 |
| 434 // Now both frames will be flushed out. | 433 // Now both frames will be flushed out. |
| 435 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 434 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 436 generator_.FinishBatchOperations(); | 435 generator_.FinishBatchOperations(); |
| 437 EXPECT_FALSE(generator_.HasQueuedFrames()); | 436 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 438 | 437 |
| 439 PacketContents contents; | 438 PacketContents contents; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 457 SaveArg<0>(&packet3_)); | 456 SaveArg<0>(&packet3_)); |
| 458 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 457 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 459 SaveArg<0>(&packet4_)); | 458 SaveArg<0>(&packet4_)); |
| 460 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 459 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 461 SaveArg<0>(&packet5_)); | 460 SaveArg<0>(&packet5_)); |
| 462 } | 461 } |
| 463 | 462 |
| 464 // Send enough data to create 3 packets: two full and one partial. Send | 463 // Send enough data to create 3 packets: two full and one partial. Send |
| 465 // with MUST_FEC_PROTECT flag. | 464 // with MUST_FEC_PROTECT flag. |
| 466 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 465 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
| 467 QuicConsumedData consumed = | 466 QuicConsumedData consumed = generator_.ConsumeData( |
| 468 generator_.ConsumeData(3, CreateData(data_len), 0, true, | 467 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
| 469 MUST_FEC_PROTECT, NULL); | |
| 470 EXPECT_EQ(data_len, consumed.bytes_consumed); | 468 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 471 EXPECT_TRUE(consumed.fin_consumed); | 469 EXPECT_TRUE(consumed.fin_consumed); |
| 472 EXPECT_FALSE(generator_.HasQueuedFrames()); | 470 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 473 | 471 |
| 474 CheckPacketHasSingleStreamFrame(packet_); | 472 CheckPacketHasSingleStreamFrame(packet_); |
| 475 CheckPacketHasSingleStreamFrame(packet2_); | 473 CheckPacketHasSingleStreamFrame(packet2_); |
| 476 CheckPacketIsFec(packet3_, 1); | 474 CheckPacketIsFec(packet3_, 1); |
| 477 | 475 |
| 478 CheckPacketHasSingleStreamFrame(packet4_); | 476 CheckPacketHasSingleStreamFrame(packet4_); |
| 479 CheckPacketIsFec(packet5_, 4); | 477 CheckPacketIsFec(packet5_, 4); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 490 SaveArg<0>(&packet_)); | 488 SaveArg<0>(&packet_)); |
| 491 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 489 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 492 SaveArg<0>(&packet2_)); | 490 SaveArg<0>(&packet2_)); |
| 493 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 491 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 494 SaveArg<0>(&packet3_)); | 492 SaveArg<0>(&packet3_)); |
| 495 } | 493 } |
| 496 | 494 |
| 497 // Send enough data to create 2 packets: one full and one partial. Send | 495 // Send enough data to create 2 packets: one full and one partial. Send |
| 498 // with MUST_FEC_PROTECT flag. | 496 // with MUST_FEC_PROTECT flag. |
| 499 size_t data_len = 1 * kDefaultMaxPacketSize + 100; | 497 size_t data_len = 1 * kDefaultMaxPacketSize + 100; |
| 500 QuicConsumedData consumed = | 498 QuicConsumedData consumed = generator_.ConsumeData( |
| 501 generator_.ConsumeData(3, CreateData(data_len), 0, true, | 499 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
| 502 MUST_FEC_PROTECT, NULL); | |
| 503 EXPECT_EQ(data_len, consumed.bytes_consumed); | 500 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 504 EXPECT_TRUE(consumed.fin_consumed); | 501 EXPECT_TRUE(consumed.fin_consumed); |
| 505 EXPECT_FALSE(generator_.HasQueuedFrames()); | 502 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 506 | 503 |
| 507 CheckPacketHasSingleStreamFrame(packet_); | 504 CheckPacketHasSingleStreamFrame(packet_); |
| 508 CheckPacketHasSingleStreamFrame(packet2_); | 505 CheckPacketHasSingleStreamFrame(packet2_); |
| 509 CheckPacketIsFec(packet3_, 1); | 506 CheckPacketIsFec(packet3_, 1); |
| 510 } | 507 } |
| 511 | 508 |
| 512 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { | 509 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 527 { | 524 { |
| 528 InSequence dummy; | 525 InSequence dummy; |
| 529 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 526 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 530 SaveArg<0>(&packet_)); | 527 SaveArg<0>(&packet_)); |
| 531 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 528 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 532 SaveArg<0>(&packet2_)); | 529 SaveArg<0>(&packet2_)); |
| 533 } | 530 } |
| 534 generator_.StartBatchOperations(); | 531 generator_.StartBatchOperations(); |
| 535 // Queue enough data to prevent a stream frame with a non-zero offset from | 532 // Queue enough data to prevent a stream frame with a non-zero offset from |
| 536 // fitting. | 533 // fitting. |
| 537 QuicConsumedData consumed = generator_.ConsumeData( | 534 QuicConsumedData consumed = |
| 538 kHeadersStreamId, MakeIOVector("foo"), 0, false, MAY_FEC_PROTECT, NULL); | 535 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 0, false, |
| 536 MAY_FEC_PROTECT, nullptr); |
| 539 EXPECT_EQ(3u, consumed.bytes_consumed); | 537 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 540 EXPECT_FALSE(consumed.fin_consumed); | 538 EXPECT_FALSE(consumed.fin_consumed); |
| 541 EXPECT_TRUE(generator_.HasQueuedFrames()); | 539 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 542 | 540 |
| 543 // This frame will not fit with the existing frame, causing the queued frame | 541 // This frame will not fit with the existing frame, causing the queued frame |
| 544 // to be serialized, and it will not fit with another frame like it, so it is | 542 // to be serialized, and it will not fit with another frame like it, so it is |
| 545 // serialized by itself. | 543 // serialized by itself. |
| 546 consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3, | 544 consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3, |
| 547 true, MAY_FEC_PROTECT, NULL); | 545 true, MAY_FEC_PROTECT, nullptr); |
| 548 EXPECT_EQ(3u, consumed.bytes_consumed); | 546 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 549 EXPECT_TRUE(consumed.fin_consumed); | 547 EXPECT_TRUE(consumed.fin_consumed); |
| 550 EXPECT_FALSE(generator_.HasQueuedFrames()); | 548 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 551 | 549 |
| 552 PacketContents contents; | 550 PacketContents contents; |
| 553 contents.num_stream_frames = 1; | 551 contents.num_stream_frames = 1; |
| 554 CheckPacketContains(contents, packet_); | 552 CheckPacketContains(contents, packet_); |
| 555 CheckPacketContains(contents, packet2_); | 553 CheckPacketContains(contents, packet2_); |
| 556 } | 554 } |
| 557 | 555 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 589 InSequence dummy; | 587 InSequence dummy; |
| 590 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 588 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 591 SaveArg<0>(&packet_)); | 589 SaveArg<0>(&packet_)); |
| 592 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 590 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 593 SaveArg<0>(&packet2_)); | 591 SaveArg<0>(&packet2_)); |
| 594 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 592 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 595 SaveArg<0>(&packet3_)); | 593 SaveArg<0>(&packet3_)); |
| 596 } | 594 } |
| 597 size_t data_len = 3 * kDefaultMaxPacketSize + 1; | 595 size_t data_len = 3 * kDefaultMaxPacketSize + 1; |
| 598 QuicConsumedData consumed = generator_.ConsumeData( | 596 QuicConsumedData consumed = generator_.ConsumeData( |
| 599 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); | 597 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
| 600 EXPECT_EQ(data_len, consumed.bytes_consumed); | 598 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 601 EXPECT_TRUE(creator_->IsFecGroupOpen()); | 599 EXPECT_TRUE(creator_->IsFecGroupOpen()); |
| 602 | 600 |
| 603 // Change FEC groupsize. | 601 // Change FEC groupsize. |
| 604 generator_.OnCongestionWindowChange(2 * kDefaultTCPMSS); | 602 generator_.OnCongestionWindowChange(2 * kDefaultTCPMSS); |
| 605 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | 603 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); |
| 606 | 604 |
| 607 // Send enough data to trigger one unprotected data packet, | 605 // Send enough data to trigger one unprotected data packet, |
| 608 // causing the FEC packet to also be sent. | 606 // causing the FEC packet to also be sent. |
| 609 { | 607 { |
| 610 InSequence dummy; | 608 InSequence dummy; |
| 611 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 609 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 612 SaveArg<0>(&packet4_)); | 610 SaveArg<0>(&packet4_)); |
| 613 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 611 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 614 SaveArg<0>(&packet5_)); | 612 SaveArg<0>(&packet5_)); |
| 615 } | 613 } |
| 616 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, | 614 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, |
| 617 true, MAY_FEC_PROTECT, NULL); | 615 true, MAY_FEC_PROTECT, nullptr); |
| 618 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); | 616 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); |
| 619 // Verify that one FEC packet was sent. | 617 // Verify that one FEC packet was sent. |
| 620 CheckPacketIsFec(packet5_, /*fec_group=*/1u); | 618 CheckPacketIsFec(packet5_, /*fec_group=*/1u); |
| 621 EXPECT_FALSE(creator_->IsFecGroupOpen()); | 619 EXPECT_FALSE(creator_->IsFecGroupOpen()); |
| 622 EXPECT_FALSE(creator_->IsFecProtected()); | 620 EXPECT_FALSE(creator_->IsFecProtected()); |
| 623 } | 621 } |
| 624 | 622 |
| 625 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { | 623 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { |
| 626 delegate_.SetCanWriteAnything(); | 624 delegate_.SetCanWriteAnything(); |
| 627 creator_->set_max_packets_per_fec_group(2); | 625 creator_->set_max_packets_per_fec_group(2); |
| 628 EXPECT_FALSE(creator_->IsFecProtected()); | 626 EXPECT_FALSE(creator_->IsFecProtected()); |
| 629 | 627 |
| 630 // Send one unprotected data packet. | 628 // Send one unprotected data packet. |
| 631 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 629 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 632 SaveArg<0>(&packet_)); | 630 SaveArg<0>(&packet_)); |
| 633 QuicConsumedData consumed = | 631 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
| 634 generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | 632 MAY_FEC_PROTECT, nullptr); |
| 635 NULL); | |
| 636 EXPECT_EQ(1u, consumed.bytes_consumed); | 633 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 637 EXPECT_FALSE(generator_.HasQueuedFrames()); | 634 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 638 EXPECT_FALSE(creator_->IsFecProtected()); | 635 EXPECT_FALSE(creator_->IsFecProtected()); |
| 639 // Verify that one data packet was sent. | 636 // Verify that one data packet was sent. |
| 640 PacketContents contents; | 637 PacketContents contents; |
| 641 contents.num_stream_frames = 1; | 638 contents.num_stream_frames = 1; |
| 642 CheckPacketContains(contents, packet_); | 639 CheckPacketContains(contents, packet_); |
| 643 | 640 |
| 644 { | 641 { |
| 645 InSequence dummy; | 642 InSequence dummy; |
| 646 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 643 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 647 SaveArg<0>(&packet2_)); | 644 SaveArg<0>(&packet2_)); |
| 648 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 645 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 649 SaveArg<0>(&packet3_)); | 646 SaveArg<0>(&packet3_)); |
| 650 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 647 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 651 SaveArg<0>(&packet4_)); | 648 SaveArg<0>(&packet4_)); |
| 652 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 649 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 653 SaveArg<0>(&packet5_)); | 650 SaveArg<0>(&packet5_)); |
| 654 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 651 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 655 SaveArg<0>(&packet6_)); | 652 SaveArg<0>(&packet6_)); |
| 656 } | 653 } |
| 657 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. | 654 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. |
| 658 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 655 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
| 659 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | 656 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
| 660 MUST_FEC_PROTECT, NULL); | 657 MUST_FEC_PROTECT, nullptr); |
| 661 EXPECT_EQ(data_len, consumed.bytes_consumed); | 658 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 662 EXPECT_FALSE(generator_.HasQueuedFrames()); | 659 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 663 | 660 |
| 664 // Verify that two FEC packets were sent. | 661 // Verify that two FEC packets were sent. |
| 665 CheckPacketHasSingleStreamFrame(packet2_); | 662 CheckPacketHasSingleStreamFrame(packet2_); |
| 666 CheckPacketHasSingleStreamFrame(packet3_); | 663 CheckPacketHasSingleStreamFrame(packet3_); |
| 667 CheckPacketIsFec(packet4_, /*fec_group=*/2u); | 664 CheckPacketIsFec(packet4_, /*fec_group=*/2u); |
| 668 CheckPacketHasSingleStreamFrame(packet5_); | 665 CheckPacketHasSingleStreamFrame(packet5_); |
| 669 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. | 666 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. |
| 670 | 667 |
| 671 // Send one unprotected data packet. | 668 // Send one unprotected data packet. |
| 672 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 669 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 673 SaveArg<0>(&packet7_)); | 670 SaveArg<0>(&packet7_)); |
| 674 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 671 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 675 MAY_FEC_PROTECT, NULL); | 672 nullptr); |
| 676 EXPECT_EQ(1u, consumed.bytes_consumed); | 673 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 677 EXPECT_FALSE(generator_.HasQueuedFrames()); | 674 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 678 EXPECT_FALSE(creator_->IsFecProtected()); | 675 EXPECT_FALSE(creator_->IsFecProtected()); |
| 679 // Verify that one unprotected data packet was sent. | 676 // Verify that one unprotected data packet was sent. |
| 680 CheckPacketContains(contents, packet7_); | 677 CheckPacketContains(contents, packet7_); |
| 681 } | 678 } |
| 682 | 679 |
| 683 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { | 680 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { |
| 684 delegate_.SetCanWriteAnything(); | 681 delegate_.SetCanWriteAnything(); |
| 685 // Enable FEC. | 682 // Enable FEC. |
| 686 creator_->set_max_packets_per_fec_group(2); | 683 creator_->set_max_packets_per_fec_group(2); |
| 687 | 684 |
| 688 generator_.StartBatchOperations(); | 685 generator_.StartBatchOperations(); |
| 689 // Queue enough data to prevent a stream frame with a non-zero offset from | 686 // Queue enough data to prevent a stream frame with a non-zero offset from |
| 690 // fitting. | 687 // fitting. |
| 691 QuicConsumedData consumed = generator_.ConsumeData( | 688 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
| 692 7, CreateData(1u), 0, true, MAY_FEC_PROTECT, NULL); | 689 MAY_FEC_PROTECT, nullptr); |
| 693 EXPECT_EQ(1u, consumed.bytes_consumed); | 690 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 694 EXPECT_TRUE(creator_->HasPendingFrames()); | 691 EXPECT_TRUE(creator_->HasPendingFrames()); |
| 695 | 692 |
| 696 // Queue protected data for sending. Should cause queued frames to be flushed. | 693 // Queue protected data for sending. Should cause queued frames to be flushed. |
| 697 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 694 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 698 SaveArg<0>(&packet_)); | 695 SaveArg<0>(&packet_)); |
| 699 EXPECT_FALSE(creator_->IsFecProtected()); | 696 EXPECT_FALSE(creator_->IsFecProtected()); |
| 700 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 697 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
| 701 MUST_FEC_PROTECT, NULL); | 698 MUST_FEC_PROTECT, nullptr); |
| 702 EXPECT_EQ(1u, consumed.bytes_consumed); | 699 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 703 PacketContents contents; | 700 PacketContents contents; |
| 704 contents.num_stream_frames = 1; | 701 contents.num_stream_frames = 1; |
| 705 // Transmitted packet was not FEC protected. | 702 // Transmitted packet was not FEC protected. |
| 706 CheckPacketContains(contents, packet_); | 703 CheckPacketContains(contents, packet_); |
| 707 EXPECT_TRUE(creator_->IsFecProtected()); | 704 EXPECT_TRUE(creator_->IsFecProtected()); |
| 708 EXPECT_TRUE(creator_->HasPendingFrames()); | 705 EXPECT_TRUE(creator_->HasPendingFrames()); |
| 709 } | 706 } |
| 710 | 707 |
| 711 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { | 708 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 727 | 724 |
| 728 // Generator should have queued control frames, and creator should be empty. | 725 // Generator should have queued control frames, and creator should be empty. |
| 729 EXPECT_TRUE(generator_.HasQueuedFrames()); | 726 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 730 EXPECT_FALSE(creator_->HasPendingFrames()); | 727 EXPECT_FALSE(creator_->HasPendingFrames()); |
| 731 EXPECT_FALSE(creator_->IsFecProtected()); | 728 EXPECT_FALSE(creator_->IsFecProtected()); |
| 732 | 729 |
| 733 // Queue protected data for sending. Should cause queued frames to be flushed. | 730 // Queue protected data for sending. Should cause queued frames to be flushed. |
| 734 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 731 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 735 SaveArg<0>(&packet_)); | 732 SaveArg<0>(&packet_)); |
| 736 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 733 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
| 737 MUST_FEC_PROTECT, NULL); | 734 MUST_FEC_PROTECT, nullptr); |
| 738 EXPECT_EQ(1u, consumed.bytes_consumed); | 735 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 739 PacketContents contents; | 736 PacketContents contents; |
| 740 contents.num_ack_frames = 1; | 737 contents.num_ack_frames = 1; |
| 741 contents.num_feedback_frames = 1; | 738 contents.num_feedback_frames = 1; |
| 742 contents.num_stop_waiting_frames = 1; | 739 contents.num_stop_waiting_frames = 1; |
| 743 CheckPacketContains(contents, packet_); | 740 CheckPacketContains(contents, packet_); |
| 744 | 741 |
| 745 // FEC protection should be on in creator. | 742 // FEC protection should be on in creator. |
| 746 EXPECT_TRUE(creator_->IsFecProtected()); | 743 EXPECT_TRUE(creator_->IsFecProtected()); |
| 747 } | 744 } |
| 748 | 745 |
| 749 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { | 746 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { |
| 750 delegate_.SetCanWriteAnything(); | 747 delegate_.SetCanWriteAnything(); |
| 751 | 748 |
| 752 // Enable FEC. | 749 // Enable FEC. |
| 753 creator_->set_max_packets_per_fec_group(2); | 750 creator_->set_max_packets_per_fec_group(2); |
| 754 EXPECT_FALSE(creator_->IsFecProtected()); | 751 EXPECT_FALSE(creator_->IsFecProtected()); |
| 755 | 752 |
| 756 // Queue stream frame to be protected in creator. | 753 // Queue stream frame to be protected in creator. |
| 757 generator_.StartBatchOperations(); | 754 generator_.StartBatchOperations(); |
| 758 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | 755 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
| 759 MUST_FEC_PROTECT, NULL); | 756 MUST_FEC_PROTECT, nullptr); |
| 760 EXPECT_EQ(1u, consumed.bytes_consumed); | 757 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 761 // Creator has a pending protected frame. | 758 // Creator has a pending protected frame. |
| 762 EXPECT_TRUE(creator_->HasPendingFrames()); | 759 EXPECT_TRUE(creator_->HasPendingFrames()); |
| 763 EXPECT_TRUE(creator_->IsFecProtected()); | 760 EXPECT_TRUE(creator_->IsFecProtected()); |
| 764 | 761 |
| 765 // Add enough unprotected data to exceed size of current packet, so that | 762 // Add enough unprotected data to exceed size of current packet, so that |
| 766 // current packet is sent. Both frames will be sent out in a single packet. | 763 // current packet is sent. Both frames will be sent out in a single packet. |
| 767 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 764 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 768 size_t data_len = kDefaultMaxPacketSize; | 765 size_t data_len = kDefaultMaxPacketSize; |
| 769 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 766 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 770 MAY_FEC_PROTECT, NULL); | 767 MAY_FEC_PROTECT, nullptr); |
| 771 EXPECT_EQ(data_len, consumed.bytes_consumed); | 768 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 772 PacketContents contents; | 769 PacketContents contents; |
| 773 contents.num_stream_frames = 2u; | 770 contents.num_stream_frames = 2u; |
| 774 contents.fec_group = 1u; | 771 contents.fec_group = 1u; |
| 775 CheckPacketContains(contents, packet_); | 772 CheckPacketContains(contents, packet_); |
| 776 // FEC protection should still be on in creator. | 773 // FEC protection should still be on in creator. |
| 777 EXPECT_TRUE(creator_->IsFecProtected()); | 774 EXPECT_TRUE(creator_->IsFecProtected()); |
| 778 } | 775 } |
| 779 | 776 |
| 780 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { | 777 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { |
| 781 delegate_.SetCanWriteAnything(); | 778 delegate_.SetCanWriteAnything(); |
| 782 | 779 |
| 783 // Enable FEC. | 780 // Enable FEC. |
| 784 creator_->set_max_packets_per_fec_group(2); | 781 creator_->set_max_packets_per_fec_group(2); |
| 785 EXPECT_FALSE(creator_->IsFecProtected()); | 782 EXPECT_FALSE(creator_->IsFecProtected()); |
| 786 | 783 |
| 787 generator_.StartBatchOperations(); | 784 generator_.StartBatchOperations(); |
| 788 // Send first packet, FEC protected. | 785 // Send first packet, FEC protected. |
| 789 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 786 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 790 // Write enough data to cause a packet to be emitted. | 787 // Write enough data to cause a packet to be emitted. |
| 791 size_t data_len = kDefaultMaxPacketSize; | 788 size_t data_len = kDefaultMaxPacketSize; |
| 792 QuicConsumedData consumed = generator_.ConsumeData( | 789 QuicConsumedData consumed = generator_.ConsumeData( |
| 793 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); | 790 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
| 794 EXPECT_EQ(data_len, consumed.bytes_consumed); | 791 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 795 PacketContents contents; | 792 PacketContents contents; |
| 796 contents.num_stream_frames = 1u; | 793 contents.num_stream_frames = 1u; |
| 797 contents.fec_group = 1u; | 794 contents.fec_group = 1u; |
| 798 CheckPacketContains(contents, packet_); | 795 CheckPacketContains(contents, packet_); |
| 799 | 796 |
| 800 // FEC should still be on in creator. | 797 // FEC should still be on in creator. |
| 801 EXPECT_TRUE(creator_->IsFecProtected()); | 798 EXPECT_TRUE(creator_->IsFecProtected()); |
| 802 | 799 |
| 803 // Send enough unprotected data to cause second packet to be sent, which gets | 800 // Send enough unprotected data to cause second packet to be sent, which gets |
| 804 // protected because it happens to fall within an open FEC group. Data packet | 801 // protected because it happens to fall within an open FEC group. Data packet |
| 805 // will be followed by FEC packet. | 802 // will be followed by FEC packet. |
| 806 { | 803 { |
| 807 InSequence dummy; | 804 InSequence dummy; |
| 808 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 805 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 809 SaveArg<0>(&packet2_)); | 806 SaveArg<0>(&packet2_)); |
| 810 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 807 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 811 SaveArg<0>(&packet3_)); | 808 SaveArg<0>(&packet3_)); |
| 812 } | 809 } |
| 813 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 810 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 814 MAY_FEC_PROTECT, NULL); | 811 MAY_FEC_PROTECT, nullptr); |
| 815 EXPECT_EQ(data_len, consumed.bytes_consumed); | 812 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 816 contents.num_stream_frames = 2u; | 813 contents.num_stream_frames = 2u; |
| 817 CheckPacketContains(contents, packet2_); | 814 CheckPacketContains(contents, packet2_); |
| 818 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 815 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
| 819 | 816 |
| 820 // FEC protection should be off in creator. | 817 // FEC protection should be off in creator. |
| 821 EXPECT_FALSE(creator_->IsFecProtected()); | 818 EXPECT_FALSE(creator_->IsFecProtected()); |
| 822 } | 819 } |
| 823 | 820 |
| 824 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { | 821 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { |
| 825 delegate_.SetCanWriteAnything(); | 822 delegate_.SetCanWriteAnything(); |
| 826 generator_.StartBatchOperations(); | 823 generator_.StartBatchOperations(); |
| 827 | 824 |
| 828 // Enable FEC. | 825 // Enable FEC. |
| 829 creator_->set_max_packets_per_fec_group(2); | 826 creator_->set_max_packets_per_fec_group(2); |
| 830 EXPECT_FALSE(creator_->IsFecProtected()); | 827 EXPECT_FALSE(creator_->IsFecProtected()); |
| 831 | 828 |
| 832 // Queue one byte of FEC protected data. | 829 // Queue one byte of FEC protected data. |
| 833 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | 830 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
| 834 MUST_FEC_PROTECT, NULL); | 831 MUST_FEC_PROTECT, nullptr); |
| 835 EXPECT_TRUE(creator_->HasPendingFrames()); | 832 EXPECT_TRUE(creator_->HasPendingFrames()); |
| 836 | 833 |
| 837 // Add more unprotected data causing first packet to be sent, FEC protected. | 834 // Add more unprotected data causing first packet to be sent, FEC protected. |
| 838 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 835 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 839 SaveArg<0>(&packet_)); | 836 SaveArg<0>(&packet_)); |
| 840 size_t data_len = kDefaultMaxPacketSize; | 837 size_t data_len = kDefaultMaxPacketSize; |
| 841 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 838 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 842 MAY_FEC_PROTECT, NULL); | 839 MAY_FEC_PROTECT, nullptr); |
| 843 EXPECT_EQ(data_len, consumed.bytes_consumed); | 840 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 844 PacketContents contents; | 841 PacketContents contents; |
| 845 contents.num_stream_frames = 2u; | 842 contents.num_stream_frames = 2u; |
| 846 contents.fec_group = 1u; | 843 contents.fec_group = 1u; |
| 847 CheckPacketContains(contents, packet_); | 844 CheckPacketContains(contents, packet_); |
| 848 | 845 |
| 849 // FEC group is still open in creator. | 846 // FEC group is still open in creator. |
| 850 EXPECT_TRUE(creator_->IsFecProtected()); | 847 EXPECT_TRUE(creator_->IsFecProtected()); |
| 851 | 848 |
| 852 // Add data that should be protected, large enough to cause second packet to | 849 // Add data that should be protected, large enough to cause second packet to |
| 853 // be sent. Data packet should be followed by FEC packet. | 850 // be sent. Data packet should be followed by FEC packet. |
| 854 { | 851 { |
| 855 InSequence dummy; | 852 InSequence dummy; |
| 856 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 853 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 857 SaveArg<0>(&packet2_)); | 854 SaveArg<0>(&packet2_)); |
| 858 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 855 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 859 SaveArg<0>(&packet3_)); | 856 SaveArg<0>(&packet3_)); |
| 860 } | 857 } |
| 861 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 858 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 862 MUST_FEC_PROTECT, NULL); | 859 MUST_FEC_PROTECT, nullptr); |
| 863 EXPECT_EQ(data_len, consumed.bytes_consumed); | 860 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 864 CheckPacketContains(contents, packet2_); | 861 CheckPacketContains(contents, packet2_); |
| 865 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 862 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
| 866 | 863 |
| 867 // FEC protection should remain on in creator. | 864 // FEC protection should remain on in creator. |
| 868 EXPECT_TRUE(creator_->IsFecProtected()); | 865 EXPECT_TRUE(creator_->IsFecProtected()); |
| 869 } | 866 } |
| 870 | 867 |
| 871 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | 868 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { |
| 872 delegate_.SetCanNotWrite(); | 869 delegate_.SetCanNotWrite(); |
| 873 | 870 |
| 874 generator_.SetShouldSendAck(true, false); | 871 generator_.SetShouldSendAck(true, false); |
| 875 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 872 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 876 EXPECT_TRUE(generator_.HasQueuedFrames()); | 873 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 877 | 874 |
| 878 delegate_.SetCanWriteAnything(); | 875 delegate_.SetCanWriteAnything(); |
| 879 | 876 |
| 880 generator_.StartBatchOperations(); | 877 generator_.StartBatchOperations(); |
| 881 | 878 |
| 882 // When the first write operation is invoked, the ack and feedback | 879 // When the first write operation is invoked, the ack and feedback |
| 883 // frames will be returned. | 880 // frames will be returned. |
| 884 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 881 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 885 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 882 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
| 886 Return(CreateFeedbackFrame())); | 883 Return(CreateFeedbackFrame())); |
| 887 | 884 |
| 888 // Send some data and a control frame | 885 // Send some data and a control frame |
| 889 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, | 886 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, |
| 890 MAY_FEC_PROTECT, NULL); | 887 nullptr); |
| 891 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 888 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 892 | 889 |
| 893 // All five frames will be flushed out in a single packet. | 890 // All five frames will be flushed out in a single packet. |
| 894 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 891 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 895 generator_.FinishBatchOperations(); | 892 generator_.FinishBatchOperations(); |
| 896 EXPECT_FALSE(generator_.HasQueuedFrames()); | 893 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 897 | 894 |
| 898 PacketContents contents; | 895 PacketContents contents; |
| 899 contents.num_ack_frames = 1; | 896 contents.num_ack_frames = 1; |
| 900 contents.num_goaway_frames = 1; | 897 contents.num_goaway_frames = 1; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 925 InSequence dummy; | 922 InSequence dummy; |
| 926 // All five frames will be flushed out in a single packet | 923 // All five frames will be flushed out in a single packet |
| 927 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 924 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 928 SaveArg<0>(&packet_)); | 925 SaveArg<0>(&packet_)); |
| 929 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 926 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 930 SaveArg<0>(&packet2_)); | 927 SaveArg<0>(&packet2_)); |
| 931 } | 928 } |
| 932 | 929 |
| 933 // Send enough data to exceed one packet | 930 // Send enough data to exceed one packet |
| 934 size_t data_len = kDefaultMaxPacketSize + 100; | 931 size_t data_len = kDefaultMaxPacketSize + 100; |
| 935 QuicConsumedData consumed = | 932 QuicConsumedData consumed = generator_.ConsumeData( |
| 936 generator_.ConsumeData(3, CreateData(data_len), 0, true, | 933 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr); |
| 937 MAY_FEC_PROTECT, NULL); | |
| 938 EXPECT_EQ(data_len, consumed.bytes_consumed); | 934 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 939 EXPECT_TRUE(consumed.fin_consumed); | 935 EXPECT_TRUE(consumed.fin_consumed); |
| 940 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 936 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 941 | 937 |
| 942 generator_.FinishBatchOperations(); | 938 generator_.FinishBatchOperations(); |
| 943 EXPECT_FALSE(generator_.HasQueuedFrames()); | 939 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 944 | 940 |
| 945 // The first packet should have the queued data and part of the stream data. | 941 // The first packet should have the queued data and part of the stream data. |
| 946 PacketContents contents; | 942 PacketContents contents; |
| 947 contents.num_ack_frames = 1; | 943 contents.num_ack_frames = 1; |
| 948 contents.num_feedback_frames = 1; | 944 contents.num_feedback_frames = 1; |
| 949 contents.num_rst_stream_frames = 1; | 945 contents.num_rst_stream_frames = 1; |
| 950 contents.num_stream_frames = 1; | 946 contents.num_stream_frames = 1; |
| 951 CheckPacketContains(contents, packet_); | 947 CheckPacketContains(contents, packet_); |
| 952 | 948 |
| 953 // The second should have the remainder of the stream data. | 949 // The second should have the remainder of the stream data. |
| 954 PacketContents contents2; | 950 PacketContents contents2; |
| 955 contents2.num_goaway_frames = 1; | 951 contents2.num_goaway_frames = 1; |
| 956 contents2.num_stream_frames = 1; | 952 contents2.num_stream_frames = 1; |
| 957 CheckPacketContains(contents2, packet2_); | 953 CheckPacketContains(contents2, packet2_); |
| 958 } | 954 } |
| 959 | 955 |
| 960 } // namespace test | 956 } // namespace test |
| 961 } // namespace net | 957 } // namespace net |
| OLD | NEW |