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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 client_framer_.GetMaxPlaintextSize( | 112 client_framer_.GetMaxPlaintextSize( |
113 creator_.options()->max_packet_length); | 113 creator_.options()->max_packet_length); |
114 } | 114 } |
115 | 115 |
116 // Returns the number of bytes consumed by the non-data fields of a stream | 116 // 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 | 117 // frame, assuming it is the last frame in the packet |
118 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) { | 118 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) { |
119 return QuicFramer::GetMinStreamFrameSize( | 119 return QuicFramer::GetMinStreamFrameSize( |
120 client_framer_.version(), kStreamId, kOffset, true, is_in_fec_group); | 120 client_framer_.version(), kStreamId, kOffset, true, is_in_fec_group); |
121 } | 121 } |
122 | |
123 static const QuicStreamId kStreamId = 1u; | 122 static const QuicStreamId kStreamId = 1u; |
124 static const QuicStreamOffset kOffset = 1u; | 123 static const QuicStreamOffset kOffset = 1u; |
125 | 124 |
126 QuicFrames frames_; | 125 QuicFrames frames_; |
127 QuicFramer server_framer_; | 126 QuicFramer server_framer_; |
128 QuicFramer client_framer_; | 127 QuicFramer client_framer_; |
129 testing::StrictMock<MockFramerVisitor> framer_visitor_; | 128 testing::StrictMock<MockFramerVisitor> framer_visitor_; |
130 QuicPacketSequenceNumber sequence_number_; | 129 QuicPacketSequenceNumber sequence_number_; |
131 QuicConnectionId connection_id_; | 130 QuicConnectionId connection_id_; |
132 string data_; | 131 string data_; |
133 MockRandom mock_random_; | 132 MockRandom mock_random_; |
134 QuicPacketCreator creator_; | 133 QuicPacketCreator creator_; |
135 }; | 134 }; |
136 | 135 |
137 // Run all packet creator tests with all supported versions of QUIC, and with | 136 // Run all packet creator tests with all supported versions of QUIC, and with |
138 // and without version in the packet header. | 137 // and without version in the packet header. |
139 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, | 138 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, |
140 QuicPacketCreatorTest, | 139 QuicPacketCreatorTest, |
141 ::testing::ValuesIn(GetTestParams())); | 140 ::testing::ValuesIn(GetTestParams())); |
142 | 141 |
143 | |
144 TEST_P(QuicPacketCreatorTest, SerializeFrames) { | 142 TEST_P(QuicPacketCreatorTest, SerializeFrames) { |
145 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); | 143 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); |
146 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 144 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
147 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector()))); | 145 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector()))); |
148 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 146 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
149 delete frames_[0].ack_frame; | 147 delete frames_[0].ack_frame; |
150 delete frames_[1].stream_frame; | 148 delete frames_[1].stream_frame; |
151 delete frames_[2].stream_frame; | 149 delete frames_[2].stream_frame; |
152 | 150 |
153 { | 151 { |
154 InSequence s; | 152 InSequence s; |
155 EXPECT_CALL(framer_visitor_, OnPacket()); | 153 EXPECT_CALL(framer_visitor_, OnPacket()); |
156 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 154 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
157 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 155 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
158 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); | 156 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); |
159 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 157 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
160 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); | 158 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
161 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 159 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
162 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 160 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
163 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 161 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
164 } | 162 } |
165 ProcessPacket(serialized.packet); | 163 ProcessPacket(serialized.packet); |
166 delete serialized.packet; | 164 delete serialized.packet; |
167 } | 165 } |
168 | 166 |
169 TEST_P(QuicPacketCreatorTest, SerializeWithFEC) { | 167 TEST_P(QuicPacketCreatorTest, SerializeWithFEC) { |
170 creator_.options()->max_packets_per_fec_group = 6; | 168 // Enable FEC protection, and send FEC packet every 6 packets. |
| 169 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); |
171 // Should return false since we do not have enough packets in the FEC group to | 170 // Should return false since we do not have enough packets in the FEC group to |
172 // trigger an FEC packet. | 171 // trigger an FEC packet. |
173 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | 172 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
174 | 173 |
175 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 174 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
176 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 175 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
177 delete frames_[0].stream_frame; | 176 delete frames_[0].stream_frame; |
178 | 177 |
179 { | 178 { |
180 InSequence s; | 179 InSequence s; |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 } | 251 } |
253 ProcessPacket(serialized.packet); | 252 ProcessPacket(serialized.packet); |
254 delete serialized.packet; | 253 delete serialized.packet; |
255 } | 254 } |
256 | 255 |
257 TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) { | 256 TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) { |
258 // Test goal is to test the following sequence (P1 => generate Packet 1): | 257 // Test goal is to test the following sequence (P1 => generate Packet 1): |
259 // P1 <change seq num length> P2 FEC, | 258 // P1 <change seq num length> P2 FEC, |
260 // and we expect that sequence number length should not change until the end | 259 // and we expect that sequence number length should not change until the end |
261 // of the open FEC group. | 260 // of the open FEC group. |
262 creator_.options()->max_packets_per_fec_group = 6; | 261 |
| 262 // Enable FEC protection, and send FEC packet every 6 packets. |
| 263 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); |
263 // Should return false since we do not have enough packets in the FEC group to | 264 // Should return false since we do not have enough packets in the FEC group to |
264 // trigger an FEC packet. | 265 // trigger an FEC packet. |
265 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | 266 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
266 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); | 267 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); |
267 | 268 |
268 // Generate Packet 1. | 269 // Generate Packet 1. |
269 creator_.AddSavedFrame(frames_[0]); | 270 creator_.AddSavedFrame(frames_[0]); |
270 // Change the sequence number length mid-FEC group and it should not change. | 271 // Change the sequence number length mid-FEC group and it should not change. |
271 creator_.options()->send_sequence_number_length = | 272 creator_.options()->send_sequence_number_length = |
272 PACKET_4BYTE_SEQUENCE_NUMBER; | 273 PACKET_4BYTE_SEQUENCE_NUMBER; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 385 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
385 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); | 386 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); |
386 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 387 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
387 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); | 388 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); |
388 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 389 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
389 | 390 |
390 ProcessPacket(serialized.packet); | 391 ProcessPacket(serialized.packet); |
391 delete serialized.packet; | 392 delete serialized.packet; |
392 } | 393 } |
393 | 394 |
| 395 TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithNoGroup) { |
| 396 // Enable FEC protection. |
| 397 creator_.set_max_packets_per_fec_group(6); |
| 398 EXPECT_TRUE(creator_.IsFecEnabled()); |
| 399 EXPECT_FALSE(creator_.IsFecProtected()); |
| 400 |
| 401 // Turn on FEC protection. |
| 402 creator_.StartFecProtectingPackets(); |
| 403 EXPECT_TRUE(creator_.IsFecProtected()); |
| 404 // We have no packets in the FEC group, so no FEC packet can be created. |
| 405 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/true)); |
| 406 // Since no packets are in FEC group yet, we should be able to turn FEC |
| 407 // off with no trouble. |
| 408 creator_.StopFecProtectingPackets(); |
| 409 EXPECT_FALSE(creator_.IsFecProtected()); |
| 410 } |
| 411 |
| 412 TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithGroupInProgress) { |
| 413 // Enable FEC protection, and send FEC packet every 6 packets. |
| 414 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); |
| 415 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
| 416 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
| 417 delete frames_[0].stream_frame; |
| 418 delete serialized.packet; |
| 419 |
| 420 EXPECT_TRUE(creator_.IsFecProtected()); |
| 421 // We do not have enough packets in the FEC group to trigger an FEC packet. |
| 422 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); |
| 423 // Should return true since there are packets in the FEC group. |
| 424 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); |
| 425 |
| 426 // Switching FEC off should not change creator state, since there is an |
| 427 // FEC packet under construction. |
| 428 EXPECT_DFATAL(creator_.StopFecProtectingPackets(), |
| 429 "Cannot stop FEC protection with open FEC group."); |
| 430 EXPECT_TRUE(creator_.IsFecProtected()); |
| 431 // Confirm that FEC packet is still under construction. |
| 432 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); |
| 433 |
| 434 serialized = creator_.SerializeFec(); |
| 435 delete serialized.packet; |
| 436 |
| 437 // Switching FEC on/off should work now. |
| 438 creator_.StopFecProtectingPackets(); |
| 439 EXPECT_FALSE(creator_.IsFecProtected()); |
| 440 creator_.StartFecProtectingPackets(); |
| 441 EXPECT_TRUE(creator_.IsFecProtected()); |
| 442 } |
| 443 |
| 444 TEST_P(QuicPacketCreatorTest, SwitchFecOnWithStreamFrameQueued) { |
| 445 // Add a stream frame to the creator. |
| 446 QuicFrame frame; |
| 447 size_t consumed = creator_.CreateStreamFrame( |
| 448 1u, MakeIOVector("test"), 0u, false, &frame); |
| 449 EXPECT_EQ(4u, consumed); |
| 450 ASSERT_TRUE(frame.stream_frame); |
| 451 EXPECT_TRUE(creator_.AddSavedFrame(frame)); |
| 452 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 453 |
| 454 // Enable FEC protection, and send FEC packet every 6 packets. |
| 455 creator_.set_max_packets_per_fec_group(6); |
| 456 EXPECT_TRUE(creator_.IsFecEnabled()); |
| 457 EXPECT_DFATAL(creator_.StartFecProtectingPackets(), |
| 458 "Cannot start FEC protection with pending frames."); |
| 459 EXPECT_FALSE(creator_.IsFecProtected()); |
| 460 |
| 461 // Serialize packet for transmission. |
| 462 SerializedPacket serialized = creator_.SerializePacket(); |
| 463 delete serialized.packet; |
| 464 delete serialized.retransmittable_frames; |
| 465 EXPECT_FALSE(creator_.HasPendingFrames()); |
| 466 |
| 467 // Since all pending frames have been serialized, turning FEC on should work. |
| 468 creator_.StartFecProtectingPackets(); |
| 469 EXPECT_TRUE(creator_.IsFecProtected()); |
| 470 } |
| 471 |
394 TEST_P(QuicPacketCreatorTest, CreateStreamFrame) { | 472 TEST_P(QuicPacketCreatorTest, CreateStreamFrame) { |
395 QuicFrame frame; | 473 QuicFrame frame; |
396 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, | 474 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, |
397 false, &frame); | 475 false, &frame); |
398 EXPECT_EQ(4u, consumed); | 476 EXPECT_EQ(4u, consumed); |
399 CheckStreamFrame(frame, 1u, "test", 0u, false); | 477 CheckStreamFrame(frame, 1u, "test", 0u, false); |
400 delete frame.stream_frame; | 478 delete frame.stream_frame; |
401 } | 479 } |
402 | 480 |
403 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFin) { | 481 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFin) { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; | 540 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; |
463 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | 541 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
464 SerializedPacket serialized_packet = creator_.SerializePacket(); | 542 SerializedPacket serialized_packet = creator_.SerializePacket(); |
465 ASSERT_TRUE(serialized_packet.packet); | 543 ASSERT_TRUE(serialized_packet.packet); |
466 delete serialized_packet.packet; | 544 delete serialized_packet.packet; |
467 delete serialized_packet.retransmittable_frames; | 545 delete serialized_packet.retransmittable_frames; |
468 } | 546 } |
469 } | 547 } |
470 | 548 |
471 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { | 549 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { |
472 // Turn on FEC protection. | 550 // Enable FEC protection, and send FEC packet every 6 packets. |
473 creator_.options()->max_packets_per_fec_group = 6; | 551 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); |
474 // Compute the total overhead for a single frame in packet. | 552 // Compute the total overhead for a single frame in packet. |
475 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) | 553 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) |
476 + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP); | 554 + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP); |
477 size_t capacity = kDefaultMaxPacketSize - overhead; | 555 size_t capacity = kDefaultMaxPacketSize - overhead; |
478 // Now, test various sizes around this size. | 556 // Now, test various sizes around this size. |
479 for (int delta = -5; delta <= 5; ++delta) { | 557 for (int delta = -5; delta <= 5; ++delta) { |
480 string data(capacity + delta, 'A'); | 558 string data(capacity + delta, 'A'); |
481 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 559 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
482 QuicFrame frame; | 560 QuicFrame frame; |
483 size_t bytes_consumed = creator_.CreateStreamFrame( | 561 size_t bytes_consumed = creator_.CreateStreamFrame( |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 // After 64 calls, BoolSource will refresh the bucket - make sure it does. | 843 // After 64 calls, BoolSource will refresh the bucket - make sure it does. |
766 mock_random_.ChangeValue(); | 844 mock_random_.ChangeValue(); |
767 } | 845 } |
768 | 846 |
769 delete frames_[0].stream_frame; | 847 delete frames_[0].stream_frame; |
770 } | 848 } |
771 | 849 |
772 } // namespace | 850 } // namespace |
773 } // namespace test | 851 } // namespace test |
774 } // namespace net | 852 } // namespace net |
OLD | NEW |