| 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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 client_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(), | 66 client_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(), |
| 67 false), | 67 false), |
| 68 sequence_number_(0), | 68 sequence_number_(0), |
| 69 connection_id_(2), | 69 connection_id_(2), |
| 70 data_("foo"), | 70 data_("foo"), |
| 71 creator_(connection_id_, &client_framer_, &mock_random_, false) { | 71 creator_(connection_id_, &client_framer_, &mock_random_, false) { |
| 72 client_framer_.set_visitor(&framer_visitor_); | 72 client_framer_.set_visitor(&framer_visitor_); |
| 73 client_framer_.set_received_entropy_calculator(&entropy_calculator_); | 73 client_framer_.set_received_entropy_calculator(&entropy_calculator_); |
| 74 server_framer_.set_visitor(&framer_visitor_); | 74 server_framer_.set_visitor(&framer_visitor_); |
| 75 } | 75 } |
| 76 ~QuicPacketCreatorTest() { | 76 |
| 77 virtual ~QuicPacketCreatorTest() OVERRIDE { |
| 77 } | 78 } |
| 78 | 79 |
| 79 void ProcessPacket(QuicPacket* packet) { | 80 void ProcessPacket(QuicPacket* packet) { |
| 80 scoped_ptr<QuicEncryptedPacket> encrypted( | 81 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 81 server_framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number_, | 82 server_framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number_, |
| 82 *packet)); | 83 *packet)); |
| 83 server_framer_.ProcessPacket(*encrypted); | 84 server_framer_.ProcessPacket(*encrypted); |
| 84 } | 85 } |
| 85 | 86 |
| 86 void CheckStreamFrame(const QuicFrame& frame, | 87 void CheckStreamFrame(const QuicFrame& frame, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 113 creator_.max_packet_length()); | 114 creator_.max_packet_length()); |
| 114 } | 115 } |
| 115 | 116 |
| 116 // Returns the number of bytes consumed by the non-data fields of a stream | 117 // 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 | 118 // frame, assuming it is the last frame in the packet |
| 118 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) { | 119 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) { |
| 119 return QuicFramer::GetMinStreamFrameSize(client_framer_.version(), | 120 return QuicFramer::GetMinStreamFrameSize(client_framer_.version(), |
| 120 kClientDataStreamId1, kOffset, | 121 kClientDataStreamId1, kOffset, |
| 121 true, is_in_fec_group); | 122 true, is_in_fec_group); |
| 122 } | 123 } |
| 124 |
| 125 // Enables and turns on FEC protection. Returns true if FEC protection is on. |
| 126 bool SwitchFecProtectionOn(size_t max_packets_per_fec_group) { |
| 127 creator_.set_max_packets_per_fec_group(max_packets_per_fec_group); |
| 128 creator_.StartFecProtectingPackets(); |
| 129 return creator_.IsFecProtected(); |
| 130 } |
| 131 |
| 123 static const QuicStreamOffset kOffset = 1u; | 132 static const QuicStreamOffset kOffset = 1u; |
| 124 | 133 |
| 125 QuicFrames frames_; | 134 QuicFrames frames_; |
| 126 QuicFramer server_framer_; | 135 QuicFramer server_framer_; |
| 127 QuicFramer client_framer_; | 136 QuicFramer client_framer_; |
| 128 testing::StrictMock<MockFramerVisitor> framer_visitor_; | 137 testing::StrictMock<MockFramerVisitor> framer_visitor_; |
| 129 QuicPacketSequenceNumber sequence_number_; | 138 QuicPacketSequenceNumber sequence_number_; |
| 130 QuicConnectionId connection_id_; | 139 QuicConnectionId connection_id_; |
| 131 string data_; | 140 string data_; |
| 132 MockRandom mock_random_; | 141 MockRandom mock_random_; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 160 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 169 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 161 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 170 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 162 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 171 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 163 } | 172 } |
| 164 ProcessPacket(serialized.packet); | 173 ProcessPacket(serialized.packet); |
| 165 delete serialized.packet; | 174 delete serialized.packet; |
| 166 } | 175 } |
| 167 | 176 |
| 168 TEST_P(QuicPacketCreatorTest, SerializeWithFEC) { | 177 TEST_P(QuicPacketCreatorTest, SerializeWithFEC) { |
| 169 // Enable FEC protection, and send FEC packet every 6 packets. | 178 // Enable FEC protection, and send FEC packet every 6 packets. |
| 170 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); | 179 EXPECT_TRUE(SwitchFecProtectionOn(6)); |
| 171 // Should return false since we do not have enough packets in the FEC group to | 180 // Should return false since we do not have enough packets in the FEC group to |
| 172 // trigger an FEC packet. | 181 // trigger an FEC packet. |
| 173 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | 182 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
| 174 | 183 |
| 175 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 184 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 176 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 185 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 177 delete frames_[0].stream_frame; | 186 delete frames_[0].stream_frame; |
| 178 | 187 |
| 179 { | 188 { |
| 180 InSequence s; | 189 InSequence s; |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 delete ack_frame.ack_frame; | 341 delete ack_frame.ack_frame; |
| 333 } | 342 } |
| 334 | 343 |
| 335 TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) { | 344 TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) { |
| 336 // Test goal is to test the following sequence (P1 => generate Packet 1): | 345 // Test goal is to test the following sequence (P1 => generate Packet 1): |
| 337 // P1 <change seq num length> P2 FEC, | 346 // P1 <change seq num length> P2 FEC, |
| 338 // and we expect that sequence number length should not change until the end | 347 // and we expect that sequence number length should not change until the end |
| 339 // of the open FEC group. | 348 // of the open FEC group. |
| 340 | 349 |
| 341 // Enable FEC protection, and send FEC packet every 6 packets. | 350 // Enable FEC protection, and send FEC packet every 6 packets. |
| 342 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); | 351 EXPECT_TRUE(SwitchFecProtectionOn(6)); |
| 343 // Should return false since we do not have enough packets in the FEC group to | 352 // Should return false since we do not have enough packets in the FEC group to |
| 344 // trigger an FEC packet. | 353 // trigger an FEC packet. |
| 345 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | 354 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
| 346 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); | 355 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); |
| 347 | 356 |
| 348 // Generate Packet 1. | 357 // Generate Packet 1. |
| 349 creator_.AddSavedFrame(frames_[0]); | 358 creator_.AddSavedFrame(frames_[0]); |
| 350 // Change the sequence number length mid-FEC group and it should not change. | 359 // Change the sequence number length mid-FEC group and it should not change. |
| 351 creator_.set_next_sequence_number_length(PACKET_4BYTE_SEQUENCE_NUMBER); | 360 creator_.set_next_sequence_number_length(PACKET_4BYTE_SEQUENCE_NUMBER); |
| 352 SerializedPacket serialized = creator_.SerializePacket(); | 361 SerializedPacket serialized = creator_.SerializePacket(); |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 // We have no packets in the FEC group, so no FEC packet can be created. | 490 // We have no packets in the FEC group, so no FEC packet can be created. |
| 482 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/true)); | 491 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/true)); |
| 483 // Since no packets are in FEC group yet, we should be able to turn FEC | 492 // Since no packets are in FEC group yet, we should be able to turn FEC |
| 484 // off with no trouble. | 493 // off with no trouble. |
| 485 creator_.StopFecProtectingPackets(); | 494 creator_.StopFecProtectingPackets(); |
| 486 EXPECT_FALSE(creator_.IsFecProtected()); | 495 EXPECT_FALSE(creator_.IsFecProtected()); |
| 487 } | 496 } |
| 488 | 497 |
| 489 TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithGroupInProgress) { | 498 TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithGroupInProgress) { |
| 490 // Enable FEC protection, and send FEC packet every 6 packets. | 499 // Enable FEC protection, and send FEC packet every 6 packets. |
| 491 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); | 500 EXPECT_TRUE(SwitchFecProtectionOn(6)); |
| 492 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 501 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 493 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 502 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 494 delete frames_[0].stream_frame; | 503 delete frames_[0].stream_frame; |
| 495 delete serialized.packet; | 504 delete serialized.packet; |
| 496 | 505 |
| 497 EXPECT_TRUE(creator_.IsFecProtected()); | 506 EXPECT_TRUE(creator_.IsFecProtected()); |
| 498 // We do not have enough packets in the FEC group to trigger an FEC packet. | 507 // We do not have enough packets in the FEC group to trigger an FEC packet. |
| 499 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | 508 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
| 500 // Should return true since there are packets in the FEC group. | 509 // Should return true since there are packets in the FEC group. |
| 501 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); | 510 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | 628 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
| 620 SerializedPacket serialized_packet = creator_.SerializePacket(); | 629 SerializedPacket serialized_packet = creator_.SerializePacket(); |
| 621 ASSERT_TRUE(serialized_packet.packet); | 630 ASSERT_TRUE(serialized_packet.packet); |
| 622 delete serialized_packet.packet; | 631 delete serialized_packet.packet; |
| 623 delete serialized_packet.retransmittable_frames; | 632 delete serialized_packet.retransmittable_frames; |
| 624 } | 633 } |
| 625 } | 634 } |
| 626 | 635 |
| 627 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { | 636 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { |
| 628 // Enable FEC protection, and send FEC packet every 6 packets. | 637 // Enable FEC protection, and send FEC packet every 6 packets. |
| 629 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); | 638 EXPECT_TRUE(SwitchFecProtectionOn(6)); |
| 630 // Compute the total overhead for a single frame in packet. | 639 // Compute the total overhead for a single frame in packet. |
| 631 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) | 640 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) |
| 632 + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP); | 641 + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP); |
| 633 size_t capacity = kDefaultMaxPacketSize - overhead; | 642 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 634 // Now, test various sizes around this size. | 643 // Now, test various sizes around this size. |
| 635 for (int delta = -5; delta <= 5; ++delta) { | 644 for (int delta = -5; delta <= 5; ++delta) { |
| 636 string data(capacity + delta, 'A'); | 645 string data(capacity + delta, 'A'); |
| 637 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 646 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 638 QuicFrame frame; | 647 QuicFrame frame; |
| 639 size_t bytes_consumed = creator_.CreateStreamFrame( | 648 size_t bytes_consumed = creator_.CreateStreamFrame( |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1001 // After 64 calls, BoolSource will refresh the bucket - make sure it does. | 1010 // After 64 calls, BoolSource will refresh the bucket - make sure it does. |
| 1002 mock_random_.ChangeValue(); | 1011 mock_random_.ChangeValue(); |
| 1003 } | 1012 } |
| 1004 | 1013 |
| 1005 delete frames_[0].stream_frame; | 1014 delete frames_[0].stream_frame; |
| 1006 } | 1015 } |
| 1007 | 1016 |
| 1008 } // namespace | 1017 } // namespace |
| 1009 } // namespace test | 1018 } // namespace test |
| 1010 } // namespace net | 1019 } // namespace net |
| OLD | NEW |