| 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_creator.h" | 5 #include "net/quic/quic_packet_creator.h" |
| 6 | 6 |
| 7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
| 8 #include "net/quic/crypto/null_encrypter.h" | 8 #include "net/quic/crypto/null_encrypter.h" |
| 9 #include "net/quic/crypto/quic_decrypter.h" | 9 #include "net/quic/crypto/quic_decrypter.h" |
| 10 #include "net/quic/crypto/quic_encrypter.h" | 10 #include "net/quic/crypto/quic_encrypter.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 using testing::Return; | 24 using testing::Return; |
| 25 using testing::SaveArg; | 25 using testing::SaveArg; |
| 26 using testing::_; | 26 using testing::_; |
| 27 | 27 |
| 28 namespace net { | 28 namespace net { |
| 29 namespace test { | 29 namespace test { |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 // Run tests with combinations of {QuicVersion, ToggleVersionSerialization}. | 32 // Run tests with combinations of {QuicVersion, ToggleVersionSerialization}. |
| 33 struct TestParams { | 33 struct TestParams { |
| 34 TestParams(QuicVersion version, | 34 TestParams(QuicVersion version, bool version_serialization) |
| 35 bool version_serialization) | 35 : version(version), version_serialization(version_serialization) {} |
| 36 : version(version), | |
| 37 version_serialization(version_serialization) { | |
| 38 } | |
| 39 | 36 |
| 40 friend ostream& operator<<(ostream& os, const TestParams& p) { | 37 friend ostream& operator<<(ostream& os, const TestParams& p) { |
| 41 os << "{ client_version: " << QuicVersionToString(p.version) | 38 os << "{ client_version: " << QuicVersionToString(p.version) |
| 42 << " include version: " << p.version_serialization << " }"; | 39 << " include version: " << p.version_serialization << " }"; |
| 43 return os; | 40 return os; |
| 44 } | 41 } |
| 45 | 42 |
| 46 QuicVersion version; | 43 QuicVersion version; |
| 47 bool version_serialization; | 44 bool version_serialization; |
| 48 }; | 45 }; |
| 49 | 46 |
| 50 // Constructs various test permutations. | 47 // Constructs various test permutations. |
| 51 vector<TestParams> GetTestParams() { | 48 vector<TestParams> GetTestParams() { |
| 52 vector<TestParams> params; | 49 vector<TestParams> params; |
| 53 QuicVersionVector all_supported_versions = QuicSupportedVersions(); | 50 QuicVersionVector all_supported_versions = QuicSupportedVersions(); |
| 54 for (size_t i = 0; i < all_supported_versions.size(); ++i) { | 51 for (size_t i = 0; i < all_supported_versions.size(); ++i) { |
| 55 params.push_back(TestParams(all_supported_versions[i], true)); | 52 params.push_back(TestParams(all_supported_versions[i], true)); |
| 56 params.push_back(TestParams(all_supported_versions[i], false)); | 53 params.push_back(TestParams(all_supported_versions[i], false)); |
| 57 } | 54 } |
| 58 return params; | 55 return params; |
| 59 } | 56 } |
| 60 | 57 |
| 61 class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> { | 58 class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> { |
| 62 protected: | 59 protected: |
| 63 QuicPacketCreatorTest() | 60 QuicPacketCreatorTest() |
| 64 : server_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(), | 61 : server_framer_(SupportedVersions(GetParam().version), |
| 62 QuicTime::Zero(), |
| 65 true), | 63 true), |
| 66 client_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(), | 64 client_framer_(SupportedVersions(GetParam().version), |
| 65 QuicTime::Zero(), |
| 67 false), | 66 false), |
| 68 sequence_number_(0), | 67 sequence_number_(0), |
| 69 connection_id_(2), | 68 connection_id_(2), |
| 70 data_("foo"), | 69 data_("foo"), |
| 71 creator_(connection_id_, &client_framer_, &mock_random_, false) { | 70 creator_(connection_id_, &client_framer_, &mock_random_, false) { |
| 72 client_framer_.set_visitor(&framer_visitor_); | 71 client_framer_.set_visitor(&framer_visitor_); |
| 73 server_framer_.set_visitor(&framer_visitor_); | 72 server_framer_.set_visitor(&framer_visitor_); |
| 74 } | 73 } |
| 75 ~QuicPacketCreatorTest() { | 74 ~QuicPacketCreatorTest() {} |
| 76 } | |
| 77 | 75 |
| 78 void ProcessPacket(QuicPacket* packet) { | 76 void ProcessPacket(QuicPacket* packet) { |
| 79 scoped_ptr<QuicEncryptedPacket> encrypted( | 77 scoped_ptr<QuicEncryptedPacket> encrypted(server_framer_.EncryptPacket( |
| 80 server_framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number_, | 78 ENCRYPTION_NONE, sequence_number_, *packet)); |
| 81 *packet)); | |
| 82 server_framer_.ProcessPacket(*encrypted); | 79 server_framer_.ProcessPacket(*encrypted); |
| 83 } | 80 } |
| 84 | 81 |
| 85 void CheckStreamFrame(const QuicFrame& frame, | 82 void CheckStreamFrame(const QuicFrame& frame, |
| 86 QuicStreamId stream_id, | 83 QuicStreamId stream_id, |
| 87 const string& data, | 84 const string& data, |
| 88 QuicStreamOffset offset, | 85 QuicStreamOffset offset, |
| 89 bool fin) { | 86 bool fin) { |
| 90 EXPECT_EQ(STREAM_FRAME, frame.type); | 87 EXPECT_EQ(STREAM_FRAME, frame.type); |
| 91 ASSERT_TRUE(frame.stream_frame); | 88 ASSERT_TRUE(frame.stream_frame); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 102 return GetPacketHeaderSize(creator_.options()->send_connection_id_length, | 99 return GetPacketHeaderSize(creator_.options()->send_connection_id_length, |
| 103 kIncludeVersion, | 100 kIncludeVersion, |
| 104 creator_.options()->send_sequence_number_length, | 101 creator_.options()->send_sequence_number_length, |
| 105 is_in_fec_group); | 102 is_in_fec_group); |
| 106 } | 103 } |
| 107 | 104 |
| 108 // Returns the number of bytes of overhead that will be added to a packet | 105 // Returns the number of bytes of overhead that will be added to a packet |
| 109 // of maximum length. | 106 // of maximum length. |
| 110 size_t GetEncryptionOverhead() { | 107 size_t GetEncryptionOverhead() { |
| 111 return creator_.options()->max_packet_length - | 108 return creator_.options()->max_packet_length - |
| 112 client_framer_.GetMaxPlaintextSize( | 109 client_framer_.GetMaxPlaintextSize( |
| 113 creator_.options()->max_packet_length); | 110 creator_.options()->max_packet_length); |
| 114 } | 111 } |
| 115 | 112 |
| 116 // Returns the number of bytes consumed by the non-data fields of a stream | 113 // Returns the number of bytes consumed by the non-data fields of a stream |
| 117 // frame, assuming it is the last frame in the packet | 114 // frame, assuming it is the last frame in the packet |
| 118 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) { | 115 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) { |
| 119 return QuicFramer::GetMinStreamFrameSize( | 116 return QuicFramer::GetMinStreamFrameSize( |
| 120 client_framer_.version(), kStreamId, kOffset, true, is_in_fec_group); | 117 client_framer_.version(), kStreamId, kOffset, true, is_in_fec_group); |
| 121 } | 118 } |
| 122 | 119 |
| 123 static const QuicStreamId kStreamId = 1u; | 120 static const QuicStreamId kStreamId = 1u; |
| 124 static const QuicStreamOffset kOffset = 1u; | 121 static const QuicStreamOffset kOffset = 1u; |
| 125 | 122 |
| 126 QuicFrames frames_; | 123 QuicFrames frames_; |
| 127 QuicFramer server_framer_; | 124 QuicFramer server_framer_; |
| 128 QuicFramer client_framer_; | 125 QuicFramer client_framer_; |
| 129 testing::StrictMock<MockFramerVisitor> framer_visitor_; | 126 testing::StrictMock<MockFramerVisitor> framer_visitor_; |
| 130 QuicPacketSequenceNumber sequence_number_; | 127 QuicPacketSequenceNumber sequence_number_; |
| 131 QuicConnectionId connection_id_; | 128 QuicConnectionId connection_id_; |
| 132 string data_; | 129 string data_; |
| 133 MockRandom mock_random_; | 130 MockRandom mock_random_; |
| 134 QuicPacketCreator creator_; | 131 QuicPacketCreator creator_; |
| 135 }; | 132 }; |
| 136 | 133 |
| 137 // Run all packet creator tests with all supported versions of QUIC, and with | 134 // Run all packet creator tests with all supported versions of QUIC, and with |
| 138 // and without version in the packet header. | 135 // and without version in the packet header. |
| 139 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, | 136 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, |
| 140 QuicPacketCreatorTest, | 137 QuicPacketCreatorTest, |
| 141 ::testing::ValuesIn(GetTestParams())); | 138 ::testing::ValuesIn(GetTestParams())); |
| 142 | 139 |
| 143 | |
| 144 TEST_P(QuicPacketCreatorTest, SerializeFrames) { | 140 TEST_P(QuicPacketCreatorTest, SerializeFrames) { |
| 145 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); | 141 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); |
| 146 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 142 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 147 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector()))); | 143 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector()))); |
| 148 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 144 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 149 delete frames_[0].ack_frame; | 145 delete frames_[0].ack_frame; |
| 150 delete frames_[1].stream_frame; | 146 delete frames_[1].stream_frame; |
| 151 delete frames_[2].stream_frame; | 147 delete frames_[2].stream_frame; |
| 152 | 148 |
| 153 { | 149 { |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 382 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
| 387 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); | 383 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); |
| 388 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 384 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 389 | 385 |
| 390 ProcessPacket(serialized.packet); | 386 ProcessPacket(serialized.packet); |
| 391 delete serialized.packet; | 387 delete serialized.packet; |
| 392 } | 388 } |
| 393 | 389 |
| 394 TEST_P(QuicPacketCreatorTest, CreateStreamFrame) { | 390 TEST_P(QuicPacketCreatorTest, CreateStreamFrame) { |
| 395 QuicFrame frame; | 391 QuicFrame frame; |
| 396 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, | 392 size_t consumed = |
| 397 false, &frame); | 393 creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, false, &frame); |
| 398 EXPECT_EQ(4u, consumed); | 394 EXPECT_EQ(4u, consumed); |
| 399 CheckStreamFrame(frame, 1u, "test", 0u, false); | 395 CheckStreamFrame(frame, 1u, "test", 0u, false); |
| 400 delete frame.stream_frame; | 396 delete frame.stream_frame; |
| 401 } | 397 } |
| 402 | 398 |
| 403 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFin) { | 399 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFin) { |
| 404 QuicFrame frame; | 400 QuicFrame frame; |
| 405 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 10u, | 401 size_t consumed = |
| 406 true, &frame); | 402 creator_.CreateStreamFrame(1u, MakeIOVector("test"), 10u, true, &frame); |
| 407 EXPECT_EQ(4u, consumed); | 403 EXPECT_EQ(4u, consumed); |
| 408 CheckStreamFrame(frame, 1u, "test", 10u, true); | 404 CheckStreamFrame(frame, 1u, "test", 10u, true); |
| 409 delete frame.stream_frame; | 405 delete frame.stream_frame; |
| 410 } | 406 } |
| 411 | 407 |
| 412 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFinOnly) { | 408 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFinOnly) { |
| 413 QuicFrame frame; | 409 QuicFrame frame; |
| 414 size_t consumed = creator_.CreateStreamFrame(1u, IOVector(), 0u, true, | 410 size_t consumed = |
| 415 &frame); | 411 creator_.CreateStreamFrame(1u, IOVector(), 0u, true, &frame); |
| 416 EXPECT_EQ(0u, consumed); | 412 EXPECT_EQ(0u, consumed); |
| 417 CheckStreamFrame(frame, 1u, string(), 0u, true); | 413 CheckStreamFrame(frame, 1u, string(), 0u, true); |
| 418 delete frame.stream_frame; | 414 delete frame.stream_frame; |
| 419 } | 415 } |
| 420 | 416 |
| 421 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { | 417 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { |
| 422 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 418 const size_t overhead = |
| 423 + GetEncryptionOverhead(); | 419 GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + GetEncryptionOverhead(); |
| 424 for (size_t i = overhead; i < overhead + 100; ++i) { | 420 for (size_t i = overhead; i < overhead + 100; ++i) { |
| 425 creator_.options()->max_packet_length = i; | 421 creator_.options()->max_packet_length = i; |
| 426 const bool should_have_room = i > overhead + GetStreamFrameOverhead( | 422 const bool should_have_room = |
| 427 NOT_IN_FEC_GROUP); | 423 i > overhead + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 428 ASSERT_EQ(should_have_room, | 424 ASSERT_EQ(should_have_room, |
| 429 creator_.HasRoomForStreamFrame(kStreamId, kOffset)); | 425 creator_.HasRoomForStreamFrame(kStreamId, kOffset)); |
| 430 if (should_have_room) { | 426 if (should_have_room) { |
| 431 QuicFrame frame; | 427 QuicFrame frame; |
| 432 size_t bytes_consumed = creator_.CreateStreamFrame( | 428 size_t bytes_consumed = creator_.CreateStreamFrame( |
| 433 kStreamId, MakeIOVector("testdata"), kOffset, false, &frame); | 429 kStreamId, MakeIOVector("testdata"), kOffset, false, &frame); |
| 434 EXPECT_LT(0u, bytes_consumed); | 430 EXPECT_LT(0u, bytes_consumed); |
| 435 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 431 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 436 SerializedPacket serialized_packet = creator_.SerializePacket(); | 432 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 437 ASSERT_TRUE(serialized_packet.packet); | 433 ASSERT_TRUE(serialized_packet.packet); |
| 438 delete serialized_packet.packet; | 434 delete serialized_packet.packet; |
| 439 delete serialized_packet.retransmittable_frames; | 435 delete serialized_packet.retransmittable_frames; |
| 440 } | 436 } |
| 441 } | 437 } |
| 442 } | 438 } |
| 443 | 439 |
| 444 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { | 440 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { |
| 445 // Compute the total overhead for a single frame in packet. | 441 // Compute the total overhead for a single frame in packet. |
| 446 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 442 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + |
| 447 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 443 GetEncryptionOverhead() + |
| 444 GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 448 size_t capacity = kDefaultMaxPacketSize - overhead; | 445 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 449 // Now, test various sizes around this size. | 446 // Now, test various sizes around this size. |
| 450 for (int delta = -5; delta <= 5; ++delta) { | 447 for (int delta = -5; delta <= 5; ++delta) { |
| 451 string data(capacity + delta, 'A'); | 448 string data(capacity + delta, 'A'); |
| 452 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 449 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 453 QuicFrame frame; | 450 QuicFrame frame; |
| 454 size_t bytes_consumed = creator_.CreateStreamFrame( | 451 size_t bytes_consumed = creator_.CreateStreamFrame( |
| 455 kStreamId, MakeIOVector(data), kOffset, false, &frame); | 452 kStreamId, MakeIOVector(data), kOffset, false, &frame); |
| 456 EXPECT_EQ(capacity - bytes_free, bytes_consumed); | 453 EXPECT_EQ(capacity - bytes_free, bytes_consumed); |
| 457 | 454 |
| 458 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 455 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 459 // BytesFree() returns bytes available for the next frame, which will | 456 // BytesFree() returns bytes available for the next frame, which will |
| 460 // be two bytes smaller since the stream frame would need to be grown. | 457 // be two bytes smaller since the stream frame would need to be grown. |
| 461 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); | 458 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); |
| 462 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; | 459 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; |
| 463 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | 460 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
| 464 SerializedPacket serialized_packet = creator_.SerializePacket(); | 461 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 465 ASSERT_TRUE(serialized_packet.packet); | 462 ASSERT_TRUE(serialized_packet.packet); |
| 466 delete serialized_packet.packet; | 463 delete serialized_packet.packet; |
| 467 delete serialized_packet.retransmittable_frames; | 464 delete serialized_packet.retransmittable_frames; |
| 468 } | 465 } |
| 469 } | 466 } |
| 470 | 467 |
| 471 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { | 468 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { |
| 472 // Turn on FEC protection. | 469 // Turn on FEC protection. |
| 473 creator_.options()->max_packets_per_fec_group = 6; | 470 creator_.options()->max_packets_per_fec_group = 6; |
| 474 // Compute the total overhead for a single frame in packet. | 471 // Compute the total overhead for a single frame in packet. |
| 475 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) | 472 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) + |
| 476 + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP); | 473 GetEncryptionOverhead() + |
| 474 GetStreamFrameOverhead(IN_FEC_GROUP); |
| 477 size_t capacity = kDefaultMaxPacketSize - overhead; | 475 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 478 // Now, test various sizes around this size. | 476 // Now, test various sizes around this size. |
| 479 for (int delta = -5; delta <= 5; ++delta) { | 477 for (int delta = -5; delta <= 5; ++delta) { |
| 480 string data(capacity + delta, 'A'); | 478 string data(capacity + delta, 'A'); |
| 481 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 479 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 482 QuicFrame frame; | 480 QuicFrame frame; |
| 483 size_t bytes_consumed = creator_.CreateStreamFrame( | 481 size_t bytes_consumed = creator_.CreateStreamFrame( |
| 484 kStreamId, MakeIOVector(data), kOffset, false, &frame); | 482 kStreamId, MakeIOVector(data), kOffset, false, &frame); |
| 485 EXPECT_EQ(capacity - bytes_free, bytes_consumed); | 483 EXPECT_EQ(capacity - bytes_free, bytes_consumed); |
| 486 | 484 |
| 487 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 485 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 488 // BytesFree() returns bytes available for the next frame. Since stream | 486 // BytesFree() returns bytes available for the next frame. Since stream |
| 489 // frame does not grow for FEC protected packets, this should be the same | 487 // frame does not grow for FEC protected packets, this should be the same |
| 490 // as bytes_free (bound by 0). | 488 // as bytes_free (bound by 0). |
| 491 EXPECT_EQ(0u, creator_.ExpansionOnNewFrame()); | 489 EXPECT_EQ(0u, creator_.ExpansionOnNewFrame()); |
| 492 size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0; | 490 size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0; |
| 493 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | 491 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
| 494 SerializedPacket serialized_packet = creator_.SerializePacket(); | 492 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 495 ASSERT_TRUE(serialized_packet.packet); | 493 ASSERT_TRUE(serialized_packet.packet); |
| 496 delete serialized_packet.packet; | 494 delete serialized_packet.packet; |
| 497 delete serialized_packet.retransmittable_frames; | 495 delete serialized_packet.retransmittable_frames; |
| 498 } | 496 } |
| 499 } | 497 } |
| 500 | 498 |
| 501 TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) { | 499 TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) { |
| 502 // Compute the total overhead for a single frame in packet. | 500 // Compute the total overhead for a single frame in packet. |
| 503 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 501 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + |
| 504 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 502 GetEncryptionOverhead() + |
| 503 GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 505 ASSERT_GT(kMaxPacketSize, overhead); | 504 ASSERT_GT(kMaxPacketSize, overhead); |
| 506 size_t capacity = kDefaultMaxPacketSize - overhead; | 505 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 507 // Now, test various sizes around this size. | 506 // Now, test various sizes around this size. |
| 508 for (int delta = -5; delta <= 5; ++delta) { | 507 for (int delta = -5; delta <= 5; ++delta) { |
| 509 string data(capacity + delta, 'A'); | 508 string data(capacity + delta, 'A'); |
| 510 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 509 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 511 | 510 |
| 512 QuicFrame frame; | 511 QuicFrame frame; |
| 513 size_t bytes_consumed = creator_.CreateStreamFrame( | 512 size_t bytes_consumed = creator_.CreateStreamFrame( |
| 514 kStreamId, MakeIOVector(data), kOffset, false, &frame); | 513 kStreamId, MakeIOVector(data), kOffset, false, &frame); |
| 515 EXPECT_LT(0u, bytes_consumed); | 514 EXPECT_LT(0u, bytes_consumed); |
| 516 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 515 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 517 SerializedPacket serialized_packet = creator_.SerializePacket(); | 516 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 518 ASSERT_TRUE(serialized_packet.packet); | 517 ASSERT_TRUE(serialized_packet.packet); |
| 519 // If there is not enough space in the packet to fit a padding frame | 518 // If there is not enough space in the packet to fit a padding frame |
| 520 // (1 byte) and to expand the stream frame (another 2 bytes) the packet | 519 // (1 byte) and to expand the stream frame (another 2 bytes) the packet |
| 521 // will not be padded. | 520 // will not be padded. |
| 522 if (bytes_free < 3) { | 521 if (bytes_free < 3) { |
| 523 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) | 522 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) - |
| 524 - bytes_free, serialized_packet.packet->length()); | 523 bytes_free, |
| 524 serialized_packet.packet->length()); |
| 525 } else { | 525 } else { |
| 526 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), | 526 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), |
| 527 serialized_packet.packet->length()); | 527 serialized_packet.packet->length()); |
| 528 } | 528 } |
| 529 delete serialized_packet.packet; | 529 delete serialized_packet.packet; |
| 530 delete serialized_packet.retransmittable_frames; | 530 delete serialized_packet.retransmittable_frames; |
| 531 } | 531 } |
| 532 } | 532 } |
| 533 | 533 |
| 534 TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) { | 534 TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) { |
| 535 // Compute the total overhead for a single frame in packet. | 535 // Compute the total overhead for a single frame in packet. |
| 536 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 536 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + |
| 537 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 537 GetEncryptionOverhead() + |
| 538 GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 538 ASSERT_GT(kDefaultMaxPacketSize, overhead); | 539 ASSERT_GT(kDefaultMaxPacketSize, overhead); |
| 539 size_t capacity = kDefaultMaxPacketSize - overhead; | 540 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 540 // Now, test various sizes around this size. | 541 // Now, test various sizes around this size. |
| 541 for (int delta = -5; delta <= 5; ++delta) { | 542 for (int delta = -5; delta <= 5; ++delta) { |
| 542 string data(capacity + delta, 'A'); | 543 string data(capacity + delta, 'A'); |
| 543 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 544 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 544 | 545 |
| 545 QuicFrame frame; | 546 QuicFrame frame; |
| 546 size_t bytes_consumed = creator_.CreateStreamFrame( | 547 size_t bytes_consumed = creator_.CreateStreamFrame( |
| 547 kStreamId + 2, MakeIOVector(data), kOffset, false, &frame); | 548 kStreamId + 2, MakeIOVector(data), kOffset, false, &frame); |
| 548 EXPECT_LT(0u, bytes_consumed); | 549 EXPECT_LT(0u, bytes_consumed); |
| 549 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 550 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
| 550 SerializedPacket serialized_packet = creator_.SerializePacket(); | 551 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 551 ASSERT_TRUE(serialized_packet.packet); | 552 ASSERT_TRUE(serialized_packet.packet); |
| 552 if (bytes_free > 0) { | 553 if (bytes_free > 0) { |
| 553 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) | 554 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) - |
| 554 - bytes_free, serialized_packet.packet->length()); | 555 bytes_free, |
| 556 serialized_packet.packet->length()); |
| 555 } else { | 557 } else { |
| 556 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), | 558 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), |
| 557 serialized_packet.packet->length()); | 559 serialized_packet.packet->length()); |
| 558 } | 560 } |
| 559 delete serialized_packet.packet; | 561 delete serialized_packet.packet; |
| 560 delete serialized_packet.retransmittable_frames; | 562 delete serialized_packet.retransmittable_frames; |
| 561 } | 563 } |
| 562 } | 564 } |
| 563 | 565 |
| 564 TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) { | 566 TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 648 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 650 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 649 delete frames_[0].stream_frame; | 651 delete frames_[0].stream_frame; |
| 650 | 652 |
| 651 QuicPacketHeader header; | 653 QuicPacketHeader header; |
| 652 { | 654 { |
| 653 InSequence s; | 655 InSequence s; |
| 654 EXPECT_CALL(framer_visitor_, OnPacket()); | 656 EXPECT_CALL(framer_visitor_, OnPacket()); |
| 655 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 657 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
| 656 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 658 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
| 657 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); | 659 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); |
| 658 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce( | 660 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)) |
| 659 DoAll(SaveArg<0>(&header), Return(true))); | 661 .WillOnce(DoAll(SaveArg<0>(&header), Return(true))); |
| 660 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 662 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 661 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 663 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 662 } | 664 } |
| 663 ProcessPacket(serialized.packet); | 665 ProcessPacket(serialized.packet); |
| 664 EXPECT_EQ(GetParam().version_serialization, | 666 EXPECT_EQ(GetParam().version_serialization, |
| 665 header.public_header.version_flag); | 667 header.public_header.version_flag); |
| 666 delete serialized.packet; | 668 delete serialized.packet; |
| 667 } | 669 } |
| 668 | 670 |
| 669 TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) { | 671 TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) { |
| 670 if (!GetParam().version_serialization) { | 672 if (!GetParam().version_serialization) { |
| 671 creator_.StopSendingVersion(); | 673 creator_.StopSendingVersion(); |
| 672 } | 674 } |
| 673 // A string larger than fits into a frame. | 675 // A string larger than fits into a frame. |
| 674 size_t payload_length; | 676 size_t payload_length; |
| 675 creator_.options()->max_packet_length = GetPacketLengthForOneStream( | 677 creator_.options()->max_packet_length = GetPacketLengthForOneStream( |
| 676 client_framer_.version(), | 678 client_framer_.version(), |
| 677 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 679 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
| 678 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP, &payload_length); | 680 PACKET_1BYTE_SEQUENCE_NUMBER, |
| 681 NOT_IN_FEC_GROUP, |
| 682 &payload_length); |
| 679 QuicFrame frame; | 683 QuicFrame frame; |
| 680 const string too_long_payload(payload_length * 2, 'a'); | 684 const string too_long_payload(payload_length * 2, 'a'); |
| 681 size_t consumed = creator_.CreateStreamFrame( | 685 size_t consumed = creator_.CreateStreamFrame( |
| 682 1u, MakeIOVector(too_long_payload), 0u, true, &frame); | 686 1u, MakeIOVector(too_long_payload), 0u, true, &frame); |
| 683 EXPECT_EQ(payload_length, consumed); | 687 EXPECT_EQ(payload_length, consumed); |
| 684 const string payload(payload_length, 'a'); | 688 const string payload(payload_length, 'a'); |
| 685 CheckStreamFrame(frame, 1u, payload, 0u, false); | 689 CheckStreamFrame(frame, 1u, payload, 0u, false); |
| 686 delete frame.stream_frame; | 690 delete frame.stream_frame; |
| 687 } | 691 } |
| 688 | 692 |
| 689 TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) { | 693 TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) { |
| 690 if (!GetParam().version_serialization) { | 694 if (!GetParam().version_serialization) { |
| 691 creator_.StopSendingVersion(); | 695 creator_.StopSendingVersion(); |
| 692 } | 696 } |
| 693 const size_t max_plaintext_size = | 697 const size_t max_plaintext_size = |
| 694 client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length); | 698 client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length); |
| 695 EXPECT_FALSE(creator_.HasPendingFrames()); | 699 EXPECT_FALSE(creator_.HasPendingFrames()); |
| 696 EXPECT_EQ(max_plaintext_size - | 700 EXPECT_EQ(max_plaintext_size - |
| 697 GetPacketHeaderSize( | 701 GetPacketHeaderSize( |
| 698 creator_.options()->send_connection_id_length, | 702 creator_.options()->send_connection_id_length, |
| 699 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 703 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
| 700 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 704 PACKET_1BYTE_SEQUENCE_NUMBER, |
| 705 NOT_IN_FEC_GROUP), |
| 701 creator_.BytesFree()); | 706 creator_.BytesFree()); |
| 702 | 707 |
| 703 // Add a variety of frame types and then a padding frame. | 708 // Add a variety of frame types and then a padding frame. |
| 704 QuicAckFrame ack_frame(MakeAckFrame(0u, 0u)); | 709 QuicAckFrame ack_frame(MakeAckFrame(0u, 0u)); |
| 705 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); | 710 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
| 706 EXPECT_TRUE(creator_.HasPendingFrames()); | 711 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 707 | 712 |
| 708 QuicCongestionFeedbackFrame congestion_feedback; | 713 QuicCongestionFeedbackFrame congestion_feedback; |
| 709 congestion_feedback.type = kFixRate; | 714 congestion_feedback.type = kFixRate; |
| 710 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback))); | 715 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback))); |
| 711 EXPECT_TRUE(creator_.HasPendingFrames()); | 716 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 712 | 717 |
| 713 QuicFrame frame; | 718 QuicFrame frame; |
| 714 size_t consumed = creator_.CreateStreamFrame( | 719 size_t consumed = |
| 715 1u, MakeIOVector("test"), 0u, false, &frame); | 720 creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, false, &frame); |
| 716 EXPECT_EQ(4u, consumed); | 721 EXPECT_EQ(4u, consumed); |
| 717 ASSERT_TRUE(frame.stream_frame); | 722 ASSERT_TRUE(frame.stream_frame); |
| 718 EXPECT_TRUE(creator_.AddSavedFrame(frame)); | 723 EXPECT_TRUE(creator_.AddSavedFrame(frame)); |
| 719 EXPECT_TRUE(creator_.HasPendingFrames()); | 724 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 720 | 725 |
| 721 QuicPaddingFrame padding_frame; | 726 QuicPaddingFrame padding_frame; |
| 722 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&padding_frame))); | 727 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&padding_frame))); |
| 723 EXPECT_TRUE(creator_.HasPendingFrames()); | 728 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 724 EXPECT_EQ(0u, creator_.BytesFree()); | 729 EXPECT_EQ(0u, creator_.BytesFree()); |
| 725 | 730 |
| 726 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); | 731 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
| 727 | 732 |
| 728 // Ensure the packet is successfully created. | 733 // Ensure the packet is successfully created. |
| 729 SerializedPacket serialized = creator_.SerializePacket(); | 734 SerializedPacket serialized = creator_.SerializePacket(); |
| 730 ASSERT_TRUE(serialized.packet); | 735 ASSERT_TRUE(serialized.packet); |
| 731 delete serialized.packet; | 736 delete serialized.packet; |
| 732 ASSERT_TRUE(serialized.retransmittable_frames); | 737 ASSERT_TRUE(serialized.retransmittable_frames); |
| 733 RetransmittableFrames* retransmittable = serialized.retransmittable_frames; | 738 RetransmittableFrames* retransmittable = serialized.retransmittable_frames; |
| 734 ASSERT_EQ(1u, retransmittable->frames().size()); | 739 ASSERT_EQ(1u, retransmittable->frames().size()); |
| 735 EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type); | 740 EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type); |
| 736 ASSERT_TRUE(retransmittable->frames()[0].stream_frame); | 741 ASSERT_TRUE(retransmittable->frames()[0].stream_frame); |
| 737 delete serialized.retransmittable_frames; | 742 delete serialized.retransmittable_frames; |
| 738 | 743 |
| 739 EXPECT_FALSE(creator_.HasPendingFrames()); | 744 EXPECT_FALSE(creator_.HasPendingFrames()); |
| 740 EXPECT_EQ(max_plaintext_size - | 745 EXPECT_EQ(max_plaintext_size - |
| 741 GetPacketHeaderSize( | 746 GetPacketHeaderSize( |
| 742 creator_.options()->send_connection_id_length, | 747 creator_.options()->send_connection_id_length, |
| 743 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 748 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
| 744 PACKET_1BYTE_SEQUENCE_NUMBER, | 749 PACKET_1BYTE_SEQUENCE_NUMBER, |
| 745 NOT_IN_FEC_GROUP), | 750 NOT_IN_FEC_GROUP), |
| 746 creator_.BytesFree()); | 751 creator_.BytesFree()); |
| 747 } | 752 } |
| 748 | 753 |
| 749 TEST_P(QuicPacketCreatorTest, EntropyFlag) { | 754 TEST_P(QuicPacketCreatorTest, EntropyFlag) { |
| 750 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 755 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 751 | 756 |
| 752 for (int i = 0; i < 2; ++i) { | 757 for (int i = 0; i < 2; ++i) { |
| 753 for (int j = 0; j < 64; ++j) { | 758 for (int j = 0; j < 64; ++j) { |
| 754 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 759 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 755 // Verify both BoolSource and hash algorithm. | 760 // Verify both BoolSource and hash algorithm. |
| 756 bool expected_rand_bool = | 761 bool expected_rand_bool = |
| 757 (mock_random_.RandUint64() & (GG_UINT64_C(1) << j)) != 0; | 762 (mock_random_.RandUint64() & (GG_UINT64_C(1) << j)) != 0; |
| 758 bool observed_rand_bool = | 763 bool observed_rand_bool = |
| 759 (serialized.entropy_hash & (1 << ((j+1) % 8))) != 0; | 764 (serialized.entropy_hash & (1 << ((j + 1) % 8))) != 0; |
| 760 uint8 rest_of_hash = serialized.entropy_hash & ~(1 << ((j+1) % 8)); | 765 uint8 rest_of_hash = serialized.entropy_hash & ~(1 << ((j + 1) % 8)); |
| 761 EXPECT_EQ(expected_rand_bool, observed_rand_bool); | 766 EXPECT_EQ(expected_rand_bool, observed_rand_bool); |
| 762 EXPECT_EQ(0, rest_of_hash); | 767 EXPECT_EQ(0, rest_of_hash); |
| 763 delete serialized.packet; | 768 delete serialized.packet; |
| 764 } | 769 } |
| 765 // After 64 calls, BoolSource will refresh the bucket - make sure it does. | 770 // After 64 calls, BoolSource will refresh the bucket - make sure it does. |
| 766 mock_random_.ChangeValue(); | 771 mock_random_.ChangeValue(); |
| 767 } | 772 } |
| 768 | 773 |
| 769 delete frames_[0].stream_frame; | 774 delete frames_[0].stream_frame; |
| 770 } | 775 } |
| 771 | 776 |
| 772 } // namespace | 777 } // namespace |
| 773 } // namespace test | 778 } // namespace test |
| 774 } // namespace net | 779 } // namespace net |
| OLD | NEW |