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 |