| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/core/quic_packet_generator.h" | 5 #include "net/quic/core/quic_packet_generator.h" |
| 6 | 6 |
| 7 #include <cstdint> | 7 #include <cstdint> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| 11 #include "base/macros.h" | 11 #include "base/macros.h" |
| 12 #include "net/quic/core/crypto/crypto_protocol.h" | 12 #include "net/quic/core/crypto/crypto_protocol.h" |
| 13 #include "net/quic/core/crypto/null_encrypter.h" | 13 #include "net/quic/core/crypto/null_encrypter.h" |
| 14 #include "net/quic/core/crypto/quic_decrypter.h" | 14 #include "net/quic/core/crypto/quic_decrypter.h" |
| 15 #include "net/quic/core/crypto/quic_encrypter.h" | 15 #include "net/quic/core/crypto/quic_encrypter.h" |
| 16 #include "net/quic/core/quic_simple_buffer_allocator.h" | 16 #include "net/quic/core/quic_simple_buffer_allocator.h" |
| 17 #include "net/quic/core/quic_utils.h" | 17 #include "net/quic/core/quic_utils.h" |
| 18 #include "net/quic/platform/api/quic_socket_address.h" | 18 #include "net/quic/platform/api/quic_socket_address.h" |
| 19 #include "net/quic/platform/api/quic_string_piece.h" | 19 #include "net/quic/platform/api/quic_string_piece.h" |
| 20 #include "net/quic/test_tools/mock_random.h" |
| 20 #include "net/quic/test_tools/quic_packet_creator_peer.h" | 21 #include "net/quic/test_tools/quic_packet_creator_peer.h" |
| 21 #include "net/quic/test_tools/quic_packet_generator_peer.h" | 22 #include "net/quic/test_tools/quic_packet_generator_peer.h" |
| 22 #include "net/quic/test_tools/quic_test_utils.h" | 23 #include "net/quic/test_tools/quic_test_utils.h" |
| 23 #include "net/quic/test_tools/simple_quic_framer.h" | 24 #include "net/quic/test_tools/simple_quic_framer.h" |
| 24 #include "testing/gmock/include/gmock/gmock.h" | 25 #include "testing/gmock/include/gmock/gmock.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 26 | 27 |
| 27 using std::string; | 28 using std::string; |
| 28 using testing::InSequence; | 29 using testing::InSequence; |
| 29 using testing::Return; | 30 using testing::Return; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 // contains the expected frames. | 79 // contains the expected frames. |
| 79 struct PacketContents { | 80 struct PacketContents { |
| 80 PacketContents() | 81 PacketContents() |
| 81 : num_ack_frames(0), | 82 : num_ack_frames(0), |
| 82 num_connection_close_frames(0), | 83 num_connection_close_frames(0), |
| 83 num_goaway_frames(0), | 84 num_goaway_frames(0), |
| 84 num_rst_stream_frames(0), | 85 num_rst_stream_frames(0), |
| 85 num_stop_waiting_frames(0), | 86 num_stop_waiting_frames(0), |
| 86 num_stream_frames(0), | 87 num_stream_frames(0), |
| 87 num_ping_frames(0), | 88 num_ping_frames(0), |
| 88 num_mtu_discovery_frames(0) {} | 89 num_mtu_discovery_frames(0), |
| 90 num_padding_frames(0) {} |
| 89 | 91 |
| 90 size_t num_ack_frames; | 92 size_t num_ack_frames; |
| 91 size_t num_connection_close_frames; | 93 size_t num_connection_close_frames; |
| 92 size_t num_goaway_frames; | 94 size_t num_goaway_frames; |
| 93 size_t num_rst_stream_frames; | 95 size_t num_rst_stream_frames; |
| 94 size_t num_stop_waiting_frames; | 96 size_t num_stop_waiting_frames; |
| 95 size_t num_stream_frames; | 97 size_t num_stream_frames; |
| 96 size_t num_ping_frames; | 98 size_t num_ping_frames; |
| 97 size_t num_mtu_discovery_frames; | 99 size_t num_mtu_discovery_frames; |
| 100 size_t num_padding_frames; |
| 98 }; | 101 }; |
| 99 | 102 |
| 100 } // namespace | 103 } // namespace |
| 101 | 104 |
| 102 class QuicPacketGeneratorTest : public ::testing::Test { | 105 class QuicPacketGeneratorTest : public ::testing::Test { |
| 103 public: | 106 public: |
| 104 QuicPacketGeneratorTest() | 107 QuicPacketGeneratorTest() |
| 105 : framer_(AllSupportedVersions(), | 108 : framer_(AllSupportedVersions(), |
| 106 QuicTime::Zero(), | 109 QuicTime::Zero(), |
| 107 Perspective::IS_CLIENT), | 110 Perspective::IS_CLIENT), |
| 108 generator_(42, &framer_, &buffer_allocator_, &delegate_), | 111 generator_(42, |
| 112 &framer_, |
| 113 &random_generator_, |
| 114 &buffer_allocator_, |
| 115 &delegate_), |
| 109 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)) { | 116 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)) { |
| 110 creator_->SetEncrypter(ENCRYPTION_FORWARD_SECURE, | 117 creator_->SetEncrypter(ENCRYPTION_FORWARD_SECURE, |
| 111 new NullEncrypter(Perspective::IS_CLIENT)); | 118 new NullEncrypter(Perspective::IS_CLIENT)); |
| 112 creator_->set_encryption_level(ENCRYPTION_FORWARD_SECURE); | 119 creator_->set_encryption_level(ENCRYPTION_FORWARD_SECURE); |
| 113 } | 120 } |
| 114 | 121 |
| 115 ~QuicPacketGeneratorTest() override { | 122 ~QuicPacketGeneratorTest() override { |
| 116 for (SerializedPacket& packet : packets_) { | 123 for (SerializedPacket& packet : packets_) { |
| 117 delete[] packet.encrypted_buffer; | 124 delete[] packet.encrypted_buffer; |
| 118 ClearSerializedPacket(&packet); | 125 ClearSerializedPacket(&packet); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 138 void CheckPacketContains(const PacketContents& contents, | 145 void CheckPacketContains(const PacketContents& contents, |
| 139 size_t packet_index) { | 146 size_t packet_index) { |
| 140 ASSERT_GT(packets_.size(), packet_index); | 147 ASSERT_GT(packets_.size(), packet_index); |
| 141 const SerializedPacket& packet = packets_[packet_index]; | 148 const SerializedPacket& packet = packets_[packet_index]; |
| 142 size_t num_retransmittable_frames = | 149 size_t num_retransmittable_frames = |
| 143 contents.num_connection_close_frames + contents.num_goaway_frames + | 150 contents.num_connection_close_frames + contents.num_goaway_frames + |
| 144 contents.num_rst_stream_frames + contents.num_stream_frames + | 151 contents.num_rst_stream_frames + contents.num_stream_frames + |
| 145 contents.num_ping_frames; | 152 contents.num_ping_frames; |
| 146 size_t num_frames = | 153 size_t num_frames = |
| 147 contents.num_ack_frames + contents.num_stop_waiting_frames + | 154 contents.num_ack_frames + contents.num_stop_waiting_frames + |
| 148 contents.num_mtu_discovery_frames + num_retransmittable_frames; | 155 contents.num_mtu_discovery_frames + contents.num_padding_frames + |
| 156 num_retransmittable_frames; |
| 149 | 157 |
| 150 if (num_retransmittable_frames == 0) { | 158 if (num_retransmittable_frames == 0) { |
| 151 ASSERT_TRUE(packet.retransmittable_frames.empty()); | 159 ASSERT_TRUE(packet.retransmittable_frames.empty()); |
| 152 } else { | 160 } else { |
| 153 ASSERT_FALSE(packet.retransmittable_frames.empty()); | 161 ASSERT_FALSE(packet.retransmittable_frames.empty()); |
| 154 EXPECT_EQ(num_retransmittable_frames, | 162 EXPECT_EQ(num_retransmittable_frames, |
| 155 packet.retransmittable_frames.size()); | 163 packet.retransmittable_frames.size()); |
| 156 } | 164 } |
| 157 | 165 |
| 158 ASSERT_TRUE(packet.encrypted_buffer != nullptr); | 166 ASSERT_TRUE(packet.encrypted_buffer != nullptr); |
| 159 ASSERT_TRUE(simple_framer_.ProcessPacket( | 167 ASSERT_TRUE(simple_framer_.ProcessPacket( |
| 160 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length))); | 168 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length))); |
| 161 EXPECT_EQ(num_frames, simple_framer_.num_frames()); | 169 EXPECT_EQ(num_frames, simple_framer_.num_frames()); |
| 162 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); | 170 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); |
| 163 EXPECT_EQ(contents.num_connection_close_frames, | 171 EXPECT_EQ(contents.num_connection_close_frames, |
| 164 simple_framer_.connection_close_frames().size()); | 172 simple_framer_.connection_close_frames().size()); |
| 165 EXPECT_EQ(contents.num_goaway_frames, | 173 EXPECT_EQ(contents.num_goaway_frames, |
| 166 simple_framer_.goaway_frames().size()); | 174 simple_framer_.goaway_frames().size()); |
| 167 EXPECT_EQ(contents.num_rst_stream_frames, | 175 EXPECT_EQ(contents.num_rst_stream_frames, |
| 168 simple_framer_.rst_stream_frames().size()); | 176 simple_framer_.rst_stream_frames().size()); |
| 169 EXPECT_EQ(contents.num_stream_frames, | 177 EXPECT_EQ(contents.num_stream_frames, |
| 170 simple_framer_.stream_frames().size()); | 178 simple_framer_.stream_frames().size()); |
| 171 EXPECT_EQ(contents.num_stop_waiting_frames, | 179 EXPECT_EQ(contents.num_stop_waiting_frames, |
| 172 simple_framer_.stop_waiting_frames().size()); | 180 simple_framer_.stop_waiting_frames().size()); |
| 181 EXPECT_EQ(contents.num_padding_frames, |
| 182 simple_framer_.padding_frames().size()); |
| 173 | 183 |
| 174 // From the receiver's perspective, MTU discovery frames are ping frames. | 184 // From the receiver's perspective, MTU discovery frames are ping frames. |
| 175 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames, | 185 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames, |
| 176 simple_framer_.ping_frames().size()); | 186 simple_framer_.ping_frames().size()); |
| 177 } | 187 } |
| 178 | 188 |
| 179 void CheckPacketHasSingleStreamFrame(size_t packet_index) { | 189 void CheckPacketHasSingleStreamFrame(size_t packet_index) { |
| 180 ASSERT_GT(packets_.size(), packet_index); | 190 ASSERT_GT(packets_.size(), packet_index); |
| 181 const SerializedPacket& packet = packets_[packet_index]; | 191 const SerializedPacket& packet = packets_[packet_index]; |
| 182 ASSERT_FALSE(packet.retransmittable_frames.empty()); | 192 ASSERT_FALSE(packet.retransmittable_frames.empty()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 200 iov_.iov_base = data_array_.get(); | 210 iov_.iov_base = data_array_.get(); |
| 201 iov_.iov_len = len; | 211 iov_.iov_len = len; |
| 202 return QuicIOVector(&iov_, 1, len); | 212 return QuicIOVector(&iov_, 1, len); |
| 203 } | 213 } |
| 204 | 214 |
| 205 QuicIOVector MakeIOVectorFromStringPiece(QuicStringPiece s) { | 215 QuicIOVector MakeIOVectorFromStringPiece(QuicStringPiece s) { |
| 206 return MakeIOVector(s, &iov_); | 216 return MakeIOVector(s, &iov_); |
| 207 } | 217 } |
| 208 | 218 |
| 209 QuicFramer framer_; | 219 QuicFramer framer_; |
| 220 MockRandom random_generator_; |
| 210 SimpleBufferAllocator buffer_allocator_; | 221 SimpleBufferAllocator buffer_allocator_; |
| 211 StrictMock<MockDelegate> delegate_; | 222 StrictMock<MockDelegate> delegate_; |
| 212 QuicPacketGenerator generator_; | 223 QuicPacketGenerator generator_; |
| 213 QuicPacketCreator* creator_; | 224 QuicPacketCreator* creator_; |
| 214 SimpleQuicFramer simple_framer_; | 225 SimpleQuicFramer simple_framer_; |
| 215 std::vector<SerializedPacket> packets_; | 226 std::vector<SerializedPacket> packets_; |
| 216 QuicAckFrame ack_frame_; | 227 QuicAckFrame ack_frame_; |
| 217 | 228 |
| 218 private: | 229 private: |
| 219 std::unique_ptr<char[]> data_array_; | 230 std::unique_ptr<char[]> data_array_; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 | 346 |
| 336 PacketContents contents; | 347 PacketContents contents; |
| 337 contents.num_rst_stream_frames = 1; | 348 contents.num_rst_stream_frames = 1; |
| 338 CheckPacketContains(contents, 0); | 349 CheckPacketContains(contents, 0); |
| 339 } | 350 } |
| 340 | 351 |
| 341 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | 352 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
| 342 delegate_.SetCanNotWrite(); | 353 delegate_.SetCanNotWrite(); |
| 343 | 354 |
| 344 QuicConsumedData consumed = generator_.ConsumeData( | 355 QuicConsumedData consumed = generator_.ConsumeData( |
| 345 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, true, nullptr); | 356 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); |
| 346 EXPECT_EQ(0u, consumed.bytes_consumed); | 357 EXPECT_EQ(0u, consumed.bytes_consumed); |
| 347 EXPECT_FALSE(consumed.fin_consumed); | 358 EXPECT_FALSE(consumed.fin_consumed); |
| 348 EXPECT_FALSE(generator_.HasQueuedFrames()); | 359 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 349 } | 360 } |
| 350 | 361 |
| 351 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { | 362 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { |
| 352 delegate_.SetCanWriteAnything(); | 363 delegate_.SetCanWriteAnything(); |
| 353 generator_.StartBatchOperations(); | 364 generator_.StartBatchOperations(); |
| 354 | 365 |
| 355 QuicConsumedData consumed = generator_.ConsumeData( | 366 QuicConsumedData consumed = generator_.ConsumeData( |
| 356 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, true, nullptr); | 367 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); |
| 357 EXPECT_EQ(3u, consumed.bytes_consumed); | 368 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 358 EXPECT_TRUE(consumed.fin_consumed); | 369 EXPECT_TRUE(consumed.fin_consumed); |
| 359 EXPECT_TRUE(generator_.HasQueuedFrames()); | 370 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 360 } | 371 } |
| 361 | 372 |
| 362 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | 373 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
| 363 delegate_.SetCanWriteAnything(); | 374 delegate_.SetCanWriteAnything(); |
| 364 | 375 |
| 365 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 376 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 366 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 377 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 367 QuicConsumedData consumed = generator_.ConsumeData( | 378 QuicConsumedData consumed = generator_.ConsumeData( |
| 368 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, true, nullptr); | 379 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); |
| 369 EXPECT_EQ(3u, consumed.bytes_consumed); | 380 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 370 EXPECT_TRUE(consumed.fin_consumed); | 381 EXPECT_TRUE(consumed.fin_consumed); |
| 371 EXPECT_FALSE(generator_.HasQueuedFrames()); | 382 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 372 | 383 |
| 373 PacketContents contents; | 384 PacketContents contents; |
| 374 contents.num_stream_frames = 1; | 385 contents.num_stream_frames = 1; |
| 375 CheckPacketContains(contents, 0); | 386 CheckPacketContains(contents, 0); |
| 376 } | 387 } |
| 377 | 388 |
| 378 // Test the behavior of ConsumeData when the data consumed is for the crypto | 389 // Test the behavior of ConsumeData when the data consumed is for the crypto |
| 379 // handshake stream. Ensure that the packet is always sent and padded even if | 390 // handshake stream. Ensure that the packet is always sent and padded even if |
| 380 // the generator operates in batch mode. | 391 // the generator operates in batch mode. |
| 381 TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake) { | 392 TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake) { |
| 382 delegate_.SetCanWriteAnything(); | 393 delegate_.SetCanWriteAnything(); |
| 383 generator_.StartBatchOperations(); | 394 generator_.StartBatchOperations(); |
| 384 | 395 |
| 385 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 396 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 386 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 397 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 387 QuicConsumedData consumed = generator_.ConsumeData( | 398 QuicConsumedData consumed = generator_.ConsumeData( |
| 388 kCryptoStreamId, MakeIOVectorFromStringPiece("foo"), 0, false, nullptr); | 399 kCryptoStreamId, MakeIOVectorFromStringPiece("foo"), 0, NO_FIN, nullptr); |
| 389 EXPECT_EQ(3u, consumed.bytes_consumed); | 400 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 390 EXPECT_FALSE(generator_.HasQueuedFrames()); | 401 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 391 | 402 |
| 392 PacketContents contents; | 403 PacketContents contents; |
| 393 contents.num_stream_frames = 1; | 404 contents.num_stream_frames = 1; |
| 405 contents.num_padding_frames = 1; |
| 394 CheckPacketContains(contents, 0); | 406 CheckPacketContains(contents, 0); |
| 395 | 407 |
| 396 ASSERT_EQ(1u, packets_.size()); | 408 ASSERT_EQ(1u, packets_.size()); |
| 397 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength()); | 409 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength()); |
| 398 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 410 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 399 } | 411 } |
| 400 | 412 |
| 401 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { | 413 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { |
| 402 EXPECT_QUIC_BUG( | 414 EXPECT_QUIC_BUG( |
| 403 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece(""), | 415 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece(""), |
| 404 0, false, nullptr), | 416 0, NO_FIN, nullptr), |
| 405 "Attempt to consume empty data without FIN."); | 417 "Attempt to consume empty data without FIN."); |
| 406 } | 418 } |
| 407 | 419 |
| 408 TEST_F(QuicPacketGeneratorTest, | 420 TEST_F(QuicPacketGeneratorTest, |
| 409 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { | 421 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { |
| 410 delegate_.SetCanWriteAnything(); | 422 delegate_.SetCanWriteAnything(); |
| 411 generator_.StartBatchOperations(); | 423 generator_.StartBatchOperations(); |
| 412 | 424 |
| 413 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), | 425 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), |
| 414 2, true, nullptr); | 426 2, FIN, nullptr); |
| 415 QuicConsumedData consumed = generator_.ConsumeData( | 427 QuicConsumedData consumed = generator_.ConsumeData( |
| 416 3, MakeIOVectorFromStringPiece("quux"), 7, false, nullptr); | 428 3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, nullptr); |
| 417 EXPECT_EQ(4u, consumed.bytes_consumed); | 429 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 418 EXPECT_FALSE(consumed.fin_consumed); | 430 EXPECT_FALSE(consumed.fin_consumed); |
| 419 EXPECT_TRUE(generator_.HasQueuedFrames()); | 431 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 420 } | 432 } |
| 421 | 433 |
| 422 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { | 434 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { |
| 423 delegate_.SetCanWriteAnything(); | 435 delegate_.SetCanWriteAnything(); |
| 424 generator_.StartBatchOperations(); | 436 generator_.StartBatchOperations(); |
| 425 | 437 |
| 426 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), | 438 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), |
| 427 2, true, nullptr); | 439 2, FIN, nullptr); |
| 428 QuicConsumedData consumed = generator_.ConsumeData( | 440 QuicConsumedData consumed = generator_.ConsumeData( |
| 429 3, MakeIOVectorFromStringPiece("quux"), 7, false, nullptr); | 441 3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, nullptr); |
| 430 EXPECT_EQ(4u, consumed.bytes_consumed); | 442 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 431 EXPECT_FALSE(consumed.fin_consumed); | 443 EXPECT_FALSE(consumed.fin_consumed); |
| 432 EXPECT_TRUE(generator_.HasQueuedFrames()); | 444 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 433 | 445 |
| 434 // Now both frames will be flushed out. | 446 // Now both frames will be flushed out. |
| 435 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 447 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 436 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 448 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 437 generator_.FinishBatchOperations(); | 449 generator_.FinishBatchOperations(); |
| 438 EXPECT_FALSE(generator_.HasQueuedFrames()); | 450 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 439 | 451 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 461 InSequence dummy; | 473 InSequence dummy; |
| 462 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 474 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 463 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 475 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 464 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 476 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 465 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 477 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 466 } | 478 } |
| 467 generator_.StartBatchOperations(); | 479 generator_.StartBatchOperations(); |
| 468 // Queue enough data to prevent a stream frame with a non-zero offset from | 480 // Queue enough data to prevent a stream frame with a non-zero offset from |
| 469 // fitting. | 481 // fitting. |
| 470 QuicConsumedData consumed = generator_.ConsumeData( | 482 QuicConsumedData consumed = generator_.ConsumeData( |
| 471 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 0, false, nullptr); | 483 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 0, NO_FIN, nullptr); |
| 472 EXPECT_EQ(3u, consumed.bytes_consumed); | 484 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 473 EXPECT_FALSE(consumed.fin_consumed); | 485 EXPECT_FALSE(consumed.fin_consumed); |
| 474 EXPECT_TRUE(generator_.HasQueuedFrames()); | 486 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 475 | 487 |
| 476 // This frame will not fit with the existing frame, causing the queued frame | 488 // This frame will not fit with the existing frame, causing the queued frame |
| 477 // to be serialized, and it will be added to a new open packet. | 489 // to be serialized, and it will be added to a new open packet. |
| 478 consumed = generator_.ConsumeData( | 490 consumed = generator_.ConsumeData( |
| 479 kHeadersStreamId, MakeIOVectorFromStringPiece("bar"), 3, true, nullptr); | 491 kHeadersStreamId, MakeIOVectorFromStringPiece("bar"), 3, FIN, nullptr); |
| 480 EXPECT_EQ(3u, consumed.bytes_consumed); | 492 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 481 EXPECT_TRUE(consumed.fin_consumed); | 493 EXPECT_TRUE(consumed.fin_consumed); |
| 482 EXPECT_TRUE(generator_.HasQueuedFrames()); | 494 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 483 | 495 |
| 484 creator_->Flush(); | 496 creator_->Flush(); |
| 485 EXPECT_FALSE(generator_.HasQueuedFrames()); | 497 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 486 | 498 |
| 487 PacketContents contents; | 499 PacketContents contents; |
| 488 contents.num_stream_frames = 1; | 500 contents.num_stream_frames = 1; |
| 489 CheckPacketContains(contents, 0); | 501 CheckPacketContains(contents, 0); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 517 | 529 |
| 518 delegate_.SetCanWriteAnything(); | 530 delegate_.SetCanWriteAnything(); |
| 519 | 531 |
| 520 generator_.StartBatchOperations(); | 532 generator_.StartBatchOperations(); |
| 521 | 533 |
| 522 // When the first write operation is invoked, the ack frame will be returned. | 534 // When the first write operation is invoked, the ack frame will be returned. |
| 523 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | 535 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 524 .WillOnce(Return(QuicFrame(&ack_frame_))); | 536 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 525 | 537 |
| 526 // Send some data and a control frame | 538 // Send some data and a control frame |
| 527 generator_.ConsumeData(3, MakeIOVectorFromStringPiece("quux"), 7, false, | 539 generator_.ConsumeData(3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, |
| 528 nullptr); | 540 nullptr); |
| 529 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 541 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 530 | 542 |
| 531 // All five frames will be flushed out in a single packet. | 543 // All five frames will be flushed out in a single packet. |
| 532 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 544 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 533 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 545 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 534 generator_.FinishBatchOperations(); | 546 generator_.FinishBatchOperations(); |
| 535 EXPECT_FALSE(generator_.HasQueuedFrames()); | 547 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 536 | 548 |
| 537 PacketContents contents; | 549 PacketContents contents; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 562 // All five frames will be flushed out in a single packet | 574 // All five frames will be flushed out in a single packet |
| 563 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 575 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 564 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 576 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 565 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 577 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 566 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 578 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 567 } | 579 } |
| 568 | 580 |
| 569 // Send enough data to exceed one packet | 581 // Send enough data to exceed one packet |
| 570 size_t data_len = kDefaultMaxPacketSize + 100; | 582 size_t data_len = kDefaultMaxPacketSize + 100; |
| 571 QuicConsumedData consumed = | 583 QuicConsumedData consumed = |
| 572 generator_.ConsumeData(3, CreateData(data_len), 0, true, nullptr); | 584 generator_.ConsumeData(3, CreateData(data_len), 0, FIN, nullptr); |
| 573 EXPECT_EQ(data_len, consumed.bytes_consumed); | 585 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 574 EXPECT_TRUE(consumed.fin_consumed); | 586 EXPECT_TRUE(consumed.fin_consumed); |
| 575 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 587 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 576 | 588 |
| 577 generator_.FinishBatchOperations(); | 589 generator_.FinishBatchOperations(); |
| 578 EXPECT_FALSE(generator_.HasQueuedFrames()); | 590 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 579 | 591 |
| 580 // The first packet should have the queued data and part of the stream data. | 592 // The first packet should have the queued data and part of the stream data. |
| 581 PacketContents contents; | 593 PacketContents contents; |
| 582 contents.num_ack_frames = 1; | 594 contents.num_ack_frames = 1; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 611 size_t packet_len = kDefaultMaxPacketSize + 100; | 623 size_t packet_len = kDefaultMaxPacketSize + 100; |
| 612 ASSERT_LE(packet_len, kMaxPacketSize); | 624 ASSERT_LE(packet_len, kMaxPacketSize); |
| 613 generator_.SetMaxPacketLength(packet_len); | 625 generator_.SetMaxPacketLength(packet_len); |
| 614 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 626 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
| 615 | 627 |
| 616 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 628 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 617 .Times(3) | 629 .Times(3) |
| 618 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 630 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 619 QuicConsumedData consumed = | 631 QuicConsumedData consumed = |
| 620 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 632 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 621 /*offset=*/2, | 633 /*offset=*/2, FIN, nullptr); |
| 622 /*fin=*/true, nullptr); | |
| 623 EXPECT_EQ(data_len, consumed.bytes_consumed); | 634 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 624 EXPECT_TRUE(consumed.fin_consumed); | 635 EXPECT_TRUE(consumed.fin_consumed); |
| 625 EXPECT_FALSE(generator_.HasQueuedFrames()); | 636 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 626 | 637 |
| 627 // We expect three packets, and first two of them have to be of packet_len | 638 // We expect three packets, and first two of them have to be of packet_len |
| 628 // size. We check multiple packets (instead of just one) because we want to | 639 // size. We check multiple packets (instead of just one) because we want to |
| 629 // ensure that |max_packet_length_| does not get changed incorrectly by the | 640 // ensure that |max_packet_length_| does not get changed incorrectly by the |
| 630 // generator after first packet is serialized. | 641 // generator after first packet is serialized. |
| 631 ASSERT_EQ(3u, packets_.size()); | 642 ASSERT_EQ(3u, packets_.size()); |
| 632 EXPECT_EQ(packet_len, packets_[0].encrypted_length); | 643 EXPECT_EQ(packet_len, packets_[0].encrypted_length); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 646 ASSERT_LE(packet_len, kMaxPacketSize); | 657 ASSERT_LE(packet_len, kMaxPacketSize); |
| 647 | 658 |
| 648 // We expect to see three packets in total. | 659 // We expect to see three packets in total. |
| 649 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 660 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 650 .Times(3) | 661 .Times(3) |
| 651 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 662 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 652 | 663 |
| 653 // Send two packets before packet size change. | 664 // Send two packets before packet size change. |
| 654 QuicConsumedData consumed = | 665 QuicConsumedData consumed = |
| 655 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 666 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 656 /*offset=*/2, | 667 /*offset=*/2, NO_FIN, nullptr); |
| 657 /*fin=*/false, nullptr); | |
| 658 EXPECT_EQ(data_len, consumed.bytes_consumed); | 668 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 659 EXPECT_FALSE(consumed.fin_consumed); | 669 EXPECT_FALSE(consumed.fin_consumed); |
| 660 EXPECT_FALSE(generator_.HasQueuedFrames()); | 670 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 661 | 671 |
| 662 // Make sure we already have two packets. | 672 // Make sure we already have two packets. |
| 663 ASSERT_EQ(2u, packets_.size()); | 673 ASSERT_EQ(2u, packets_.size()); |
| 664 | 674 |
| 665 // Increase packet size. | 675 // Increase packet size. |
| 666 generator_.SetMaxPacketLength(packet_len); | 676 generator_.SetMaxPacketLength(packet_len); |
| 667 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 677 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
| 668 | 678 |
| 669 // Send a packet after packet size change. | 679 // Send a packet after packet size change. |
| 670 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 680 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 671 2 + data_len, | 681 2 + data_len, FIN, nullptr); |
| 672 /*fin=*/true, nullptr); | |
| 673 EXPECT_EQ(data_len, consumed.bytes_consumed); | 682 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 674 EXPECT_TRUE(consumed.fin_consumed); | 683 EXPECT_TRUE(consumed.fin_consumed); |
| 675 EXPECT_FALSE(generator_.HasQueuedFrames()); | 684 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 676 | 685 |
| 677 // We expect first data chunk to get fragmented, but the second one to fit | 686 // We expect first data chunk to get fragmented, but the second one to fit |
| 678 // into a single packet. | 687 // into a single packet. |
| 679 ASSERT_EQ(3u, packets_.size()); | 688 ASSERT_EQ(3u, packets_.size()); |
| 680 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 689 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 681 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length); | 690 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length); |
| 682 CheckAllPacketsHaveSingleStreamFrame(); | 691 CheckAllPacketsHaveSingleStreamFrame(); |
| 683 } | 692 } |
| 684 | 693 |
| 685 // Test whether SetMaxPacketLength() works correctly when we force the change of | 694 // Test whether SetMaxPacketLength() works correctly when we force the change of |
| 686 // the packet size in the middle of the batched packet. | 695 // the packet size in the middle of the batched packet. |
| 687 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) { | 696 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) { |
| 688 delegate_.SetCanWriteAnything(); | 697 delegate_.SetCanWriteAnything(); |
| 689 generator_.StartBatchOperations(); | 698 generator_.StartBatchOperations(); |
| 690 | 699 |
| 691 size_t first_write_len = kDefaultMaxPacketSize / 2; | 700 size_t first_write_len = kDefaultMaxPacketSize / 2; |
| 692 size_t packet_len = kDefaultMaxPacketSize + 100; | 701 size_t packet_len = kDefaultMaxPacketSize + 100; |
| 693 size_t second_write_len = packet_len + 1; | 702 size_t second_write_len = packet_len + 1; |
| 694 ASSERT_LE(packet_len, kMaxPacketSize); | 703 ASSERT_LE(packet_len, kMaxPacketSize); |
| 695 | 704 |
| 696 // First send half of the packet worth of data. We are in the batch mode, so | 705 // First send half of the packet worth of data. We are in the batch mode, so |
| 697 // should not cause packet serialization. | 706 // should not cause packet serialization. |
| 698 QuicConsumedData consumed = | 707 QuicConsumedData consumed = |
| 699 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), | 708 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), |
| 700 /*offset=*/2, | 709 /*offset=*/2, NO_FIN, nullptr); |
| 701 /*fin=*/false, nullptr); | |
| 702 EXPECT_EQ(first_write_len, consumed.bytes_consumed); | 710 EXPECT_EQ(first_write_len, consumed.bytes_consumed); |
| 703 EXPECT_FALSE(consumed.fin_consumed); | 711 EXPECT_FALSE(consumed.fin_consumed); |
| 704 EXPECT_TRUE(generator_.HasQueuedFrames()); | 712 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 705 | 713 |
| 706 // Make sure we have no packets so far. | 714 // Make sure we have no packets so far. |
| 707 ASSERT_EQ(0u, packets_.size()); | 715 ASSERT_EQ(0u, packets_.size()); |
| 708 | 716 |
| 709 // Expect a packet to be flushed. | 717 // Expect a packet to be flushed. |
| 710 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 718 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 711 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 719 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 712 | 720 |
| 713 // Increase packet size after flushing all frames. | 721 // Increase packet size after flushing all frames. |
| 714 // Ensure it's immediately enacted. | 722 // Ensure it's immediately enacted. |
| 715 generator_.FlushAllQueuedFrames(); | 723 generator_.FlushAllQueuedFrames(); |
| 716 generator_.SetMaxPacketLength(packet_len); | 724 generator_.SetMaxPacketLength(packet_len); |
| 717 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 725 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
| 718 EXPECT_FALSE(generator_.HasQueuedFrames()); | 726 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 719 | 727 |
| 720 // We expect to see exactly one packet serialized after that, because we send | 728 // We expect to see exactly one packet serialized after that, because we send |
| 721 // a value somewhat exceeding new max packet size, and the tail data does not | 729 // a value somewhat exceeding new max packet size, and the tail data does not |
| 722 // get serialized because we are still in the batch mode. | 730 // get serialized because we are still in the batch mode. |
| 723 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 731 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 724 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 732 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 725 | 733 |
| 726 // Send a more than a packet worth of data to the same stream. This should | 734 // Send a more than a packet worth of data to the same stream. This should |
| 727 // trigger serialization of one packet, and queue another one. | 735 // trigger serialization of one packet, and queue another one. |
| 728 consumed = | 736 consumed = |
| 729 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), | 737 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), |
| 730 /*offset=*/2 + first_write_len, | 738 /*offset=*/2 + first_write_len, FIN, nullptr); |
| 731 /*fin=*/true, nullptr); | |
| 732 EXPECT_EQ(second_write_len, consumed.bytes_consumed); | 739 EXPECT_EQ(second_write_len, consumed.bytes_consumed); |
| 733 EXPECT_TRUE(consumed.fin_consumed); | 740 EXPECT_TRUE(consumed.fin_consumed); |
| 734 EXPECT_TRUE(generator_.HasQueuedFrames()); | 741 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 735 | 742 |
| 736 // We expect the first packet to be underfilled, and the second packet be up | 743 // We expect the first packet to be underfilled, and the second packet be up |
| 737 // to the new max packet size. | 744 // to the new max packet size. |
| 738 ASSERT_EQ(2u, packets_.size()); | 745 ASSERT_EQ(2u, packets_.size()); |
| 739 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 746 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 740 EXPECT_EQ(packet_len, packets_[1].encrypted_length); | 747 EXPECT_EQ(packet_len, packets_[1].encrypted_length); |
| 741 | 748 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 754 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 761 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 755 | 762 |
| 756 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | 763 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); |
| 757 | 764 |
| 758 EXPECT_FALSE(generator_.HasQueuedFrames()); | 765 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 759 ASSERT_EQ(1u, packets_.size()); | 766 ASSERT_EQ(1u, packets_.size()); |
| 760 EXPECT_EQ(target_mtu, packets_[0].encrypted_length); | 767 EXPECT_EQ(target_mtu, packets_[0].encrypted_length); |
| 761 | 768 |
| 762 PacketContents contents; | 769 PacketContents contents; |
| 763 contents.num_mtu_discovery_frames = 1; | 770 contents.num_mtu_discovery_frames = 1; |
| 771 contents.num_padding_frames = 1; |
| 764 CheckPacketContains(contents, 0); | 772 CheckPacketContains(contents, 0); |
| 765 } | 773 } |
| 766 | 774 |
| 767 // Test sending an MTU probe. Surround it with data, to ensure that it resets | 775 // Test sending an MTU probe. Surround it with data, to ensure that it resets |
| 768 // the MTU to the value before the probe was sent. | 776 // the MTU to the value before the probe was sent. |
| 769 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_SurroundedByData) { | 777 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_SurroundedByData) { |
| 770 delegate_.SetCanWriteAnything(); | 778 delegate_.SetCanWriteAnything(); |
| 771 | 779 |
| 772 const size_t target_mtu = kDefaultMaxPacketSize + 100; | 780 const size_t target_mtu = kDefaultMaxPacketSize + 100; |
| 773 static_assert(target_mtu < kMaxPacketSize, | 781 static_assert(target_mtu < kMaxPacketSize, |
| 774 "The MTU probe used by the test exceeds maximum packet size"); | 782 "The MTU probe used by the test exceeds maximum packet size"); |
| 775 | 783 |
| 776 // Send enough data so it would always cause two packets to be sent. | 784 // Send enough data so it would always cause two packets to be sent. |
| 777 const size_t data_len = target_mtu + 1; | 785 const size_t data_len = target_mtu + 1; |
| 778 | 786 |
| 779 // Send a total of five packets: two packets before the probe, the probe | 787 // Send a total of five packets: two packets before the probe, the probe |
| 780 // itself, and two packets after the probe. | 788 // itself, and two packets after the probe. |
| 781 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 789 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 782 .Times(5) | 790 .Times(5) |
| 783 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 791 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 784 | 792 |
| 785 // Send data before the MTU probe. | 793 // Send data before the MTU probe. |
| 786 QuicConsumedData consumed = | 794 QuicConsumedData consumed = |
| 787 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 795 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 788 /*offset=*/2, | 796 /*offset=*/2, NO_FIN, nullptr); |
| 789 /*fin=*/false, nullptr); | |
| 790 EXPECT_EQ(data_len, consumed.bytes_consumed); | 797 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 791 EXPECT_FALSE(consumed.fin_consumed); | 798 EXPECT_FALSE(consumed.fin_consumed); |
| 792 EXPECT_FALSE(generator_.HasQueuedFrames()); | 799 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 793 | 800 |
| 794 // Send the MTU probe. | 801 // Send the MTU probe. |
| 795 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | 802 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); |
| 796 EXPECT_FALSE(generator_.HasQueuedFrames()); | 803 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 797 | 804 |
| 798 // Send data after the MTU probe. | 805 // Send data after the MTU probe. |
| 799 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 806 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 800 /*offset=*/2 + data_len, | 807 /*offset=*/2 + data_len, FIN, nullptr); |
| 801 /*fin=*/true, nullptr); | |
| 802 EXPECT_EQ(data_len, consumed.bytes_consumed); | 808 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 803 EXPECT_TRUE(consumed.fin_consumed); | 809 EXPECT_TRUE(consumed.fin_consumed); |
| 804 EXPECT_FALSE(generator_.HasQueuedFrames()); | 810 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 805 | 811 |
| 806 ASSERT_EQ(5u, packets_.size()); | 812 ASSERT_EQ(5u, packets_.size()); |
| 807 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 813 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 808 EXPECT_EQ(target_mtu, packets_[2].encrypted_length); | 814 EXPECT_EQ(target_mtu, packets_[2].encrypted_length); |
| 809 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length); | 815 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length); |
| 810 | 816 |
| 811 PacketContents probe_contents; | 817 PacketContents probe_contents; |
| 812 probe_contents.num_mtu_discovery_frames = 1; | 818 probe_contents.num_mtu_discovery_frames = 1; |
| 819 probe_contents.num_padding_frames = 1; |
| 813 | 820 |
| 814 CheckPacketHasSingleStreamFrame(0); | 821 CheckPacketHasSingleStreamFrame(0); |
| 815 CheckPacketHasSingleStreamFrame(1); | 822 CheckPacketHasSingleStreamFrame(1); |
| 816 CheckPacketContains(probe_contents, 2); | 823 CheckPacketContains(probe_contents, 2); |
| 817 CheckPacketHasSingleStreamFrame(3); | 824 CheckPacketHasSingleStreamFrame(3); |
| 818 CheckPacketHasSingleStreamFrame(4); | 825 CheckPacketHasSingleStreamFrame(4); |
| 819 } | 826 } |
| 820 | 827 |
| 821 TEST_F(QuicPacketGeneratorTest, DontCrashOnInvalidStopWaiting) { | 828 TEST_F(QuicPacketGeneratorTest, DontCrashOnInvalidStopWaiting) { |
| 822 // Test added to ensure the generator does not crash when an invalid frame is | 829 // Test added to ensure the generator does not crash when an invalid frame is |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 855 char buf[2000] = {}; | 862 char buf[2000] = {}; |
| 856 QuicStringPiece error_details(buf, 2000); | 863 QuicStringPiece error_details(buf, 2000); |
| 857 frame->error_details = error_details.as_string(); | 864 frame->error_details = error_details.as_string(); |
| 858 EXPECT_CALL(delegate_, | 865 EXPECT_CALL(delegate_, |
| 859 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, | 866 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, |
| 860 "Single frame cannot fit into a packet", _)); | 867 "Single frame cannot fit into a packet", _)); |
| 861 EXPECT_QUIC_BUG(generator_.AddControlFrame(QuicFrame(frame)), ""); | 868 EXPECT_QUIC_BUG(generator_.AddControlFrame(QuicFrame(frame)), ""); |
| 862 EXPECT_TRUE(generator_.HasQueuedFrames()); | 869 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 863 } | 870 } |
| 864 | 871 |
| 872 TEST_F(QuicPacketGeneratorTest, RandomPaddingAfterFinSingleStreamSinglePacket) { |
| 873 const QuicByteCount kStreamFramePayloadSize = 100u; |
| 874 char buf[kStreamFramePayloadSize] = {}; |
| 875 const QuicStreamId kDataStreamId = 5; |
| 876 // Set the packet size be enough for one stream frame with 0 stream offset and |
| 877 // max size of random padding. |
| 878 size_t length = NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) + |
| 879 GetPacketHeaderSize( |
| 880 framer_.version(), creator_->connection_id_length(), |
| 881 kIncludeVersion, !kIncludeDiversificationNonce, |
| 882 QuicPacketCreatorPeer::GetPacketNumberLength(creator_)) + |
| 883 QuicFramer::GetMinStreamFrameSize( |
| 884 kDataStreamId, 0, /*last_frame_in_packet=*/false) + |
| 885 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes; |
| 886 generator_.SetMaxPacketLength(length); |
| 887 delegate_.SetCanWriteAnything(); |
| 888 generator_.StartBatchOperations(); |
| 889 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 890 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 891 QuicConsumedData consumed = |
| 892 generator_.ConsumeData(kDataStreamId, |
| 893 MakeIOVectorFromStringPiece( |
| 894 QuicStringPiece(buf, kStreamFramePayloadSize)), |
| 895 0, FIN_AND_PADDING, nullptr); |
| 896 generator_.FinishBatchOperations(); |
| 897 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
| 898 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 899 |
| 900 EXPECT_EQ(1u, packets_.size()); |
| 901 PacketContents contents; |
| 902 // The packet has both stream and padding frames. |
| 903 contents.num_padding_frames = 1; |
| 904 contents.num_stream_frames = 1; |
| 905 CheckPacketContains(contents, 0); |
| 906 } |
| 907 |
| 908 TEST_F(QuicPacketGeneratorTest, |
| 909 RandomPaddingAfterFinSingleStreamMultiplePackets) { |
| 910 const QuicByteCount kStreamFramePayloadSize = 100u; |
| 911 char buf[kStreamFramePayloadSize] = {}; |
| 912 const QuicStreamId kDataStreamId = 5; |
| 913 // Set the packet size be enough for one stream frame with 0 stream offset + |
| 914 // 1. One or more packets will accommodate. |
| 915 size_t length = NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) + |
| 916 GetPacketHeaderSize( |
| 917 framer_.version(), creator_->connection_id_length(), |
| 918 kIncludeVersion, !kIncludeDiversificationNonce, |
| 919 QuicPacketCreatorPeer::GetPacketNumberLength(creator_)) + |
| 920 QuicFramer::GetMinStreamFrameSize( |
| 921 kDataStreamId, 0, /*last_frame_in_packet=*/false) + |
| 922 kStreamFramePayloadSize + 1; |
| 923 generator_.SetMaxPacketLength(length); |
| 924 delegate_.SetCanWriteAnything(); |
| 925 generator_.StartBatchOperations(); |
| 926 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 927 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 928 QuicConsumedData consumed = |
| 929 generator_.ConsumeData(kDataStreamId, |
| 930 MakeIOVectorFromStringPiece( |
| 931 QuicStringPiece(buf, kStreamFramePayloadSize)), |
| 932 0, FIN_AND_PADDING, nullptr); |
| 933 generator_.FinishBatchOperations(); |
| 934 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
| 935 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 936 |
| 937 EXPECT_LE(1u, packets_.size()); |
| 938 PacketContents contents; |
| 939 // The first packet has both stream and padding frames. |
| 940 contents.num_stream_frames = 1; |
| 941 contents.num_padding_frames = 1; |
| 942 CheckPacketContains(contents, 0); |
| 943 |
| 944 for (size_t i = 1; i < packets_.size(); ++i) { |
| 945 // Following packets only have paddings. |
| 946 contents.num_stream_frames = 0; |
| 947 contents.num_padding_frames = 1; |
| 948 CheckPacketContains(contents, i); |
| 949 } |
| 950 } |
| 951 |
| 952 TEST_F(QuicPacketGeneratorTest, |
| 953 RandomPaddingAfterFinMultipleStreamsMultiplePackets) { |
| 954 const QuicByteCount kStreamFramePayloadSize = 100u; |
| 955 char buf[kStreamFramePayloadSize] = {}; |
| 956 const QuicStreamId kDataStreamId1 = 5; |
| 957 const QuicStreamId kDataStreamId2 = 6; |
| 958 // Set the packet size be enough for first frame with 0 stream offset + second |
| 959 // frame + 1 byte payload. two or more packets will accommodate. |
| 960 size_t length = NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) + |
| 961 GetPacketHeaderSize( |
| 962 framer_.version(), creator_->connection_id_length(), |
| 963 kIncludeVersion, !kIncludeDiversificationNonce, |
| 964 QuicPacketCreatorPeer::GetPacketNumberLength(creator_)) + |
| 965 QuicFramer::GetMinStreamFrameSize( |
| 966 kDataStreamId1, 0, /*last_frame_in_packet=*/false) + |
| 967 kStreamFramePayloadSize + |
| 968 QuicFramer::GetMinStreamFrameSize( |
| 969 kDataStreamId1, 0, /*last_frame_in_packet=*/false) + |
| 970 1; |
| 971 generator_.SetMaxPacketLength(length); |
| 972 delegate_.SetCanWriteAnything(); |
| 973 generator_.StartBatchOperations(); |
| 974 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 975 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 976 QuicConsumedData consumed = |
| 977 generator_.ConsumeData(kDataStreamId1, |
| 978 MakeIOVectorFromStringPiece( |
| 979 QuicStringPiece(buf, kStreamFramePayloadSize)), |
| 980 0, FIN_AND_PADDING, nullptr); |
| 981 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
| 982 consumed = generator_.ConsumeData(kDataStreamId2, |
| 983 MakeIOVectorFromStringPiece(QuicStringPiece( |
| 984 buf, kStreamFramePayloadSize)), |
| 985 0, FIN_AND_PADDING, nullptr); |
| 986 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
| 987 generator_.FinishBatchOperations(); |
| 988 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 989 |
| 990 EXPECT_LE(2u, packets_.size()); |
| 991 PacketContents contents; |
| 992 // The first packet has two stream frames. |
| 993 contents.num_stream_frames = 2; |
| 994 CheckPacketContains(contents, 0); |
| 995 |
| 996 // The second packet has one stream frame and padding frames. |
| 997 contents.num_stream_frames = 1; |
| 998 contents.num_padding_frames = 1; |
| 999 CheckPacketContains(contents, 1); |
| 1000 |
| 1001 for (size_t i = 2; i < packets_.size(); ++i) { |
| 1002 // Following packets only have paddings. |
| 1003 contents.num_stream_frames = 0; |
| 1004 contents.num_padding_frames = 1; |
| 1005 CheckPacketContains(contents, i); |
| 1006 } |
| 1007 } |
| 1008 |
| 865 } // namespace test | 1009 } // namespace test |
| 866 } // namespace net | 1010 } // namespace net |
| OLD | NEW |