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_generator.h" | 5 #include "net/quic/quic_packet_generator.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "net/quic/crypto/crypto_protocol.h" | 10 #include "net/quic/crypto/crypto_protocol.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 | 36 |
37 class MockDelegate : public QuicPacketGenerator::DelegateInterface { | 37 class MockDelegate : public QuicPacketGenerator::DelegateInterface { |
38 public: | 38 public: |
39 MockDelegate() {} | 39 MockDelegate() {} |
40 ~MockDelegate() override {} | 40 ~MockDelegate() override {} |
41 | 41 |
42 MOCK_METHOD2(ShouldGeneratePacket, | 42 MOCK_METHOD2(ShouldGeneratePacket, |
43 bool(HasRetransmittableData retransmittable, | 43 bool(HasRetransmittableData retransmittable, |
44 IsHandshake handshake)); | 44 IsHandshake handshake)); |
45 MOCK_METHOD1(PopulateAckFrame, void(QuicAckFrame*)); | 45 MOCK_METHOD1(PopulateAckFrame, void(QuicAckFrame*)); |
| 46 MOCK_METHOD0(GetUpdatedAckFrame, const QuicFrame()); |
46 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*)); | 47 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*)); |
47 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); | 48 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); |
48 MOCK_METHOD2(OnUnrecoverableError, | 49 MOCK_METHOD2(OnUnrecoverableError, |
49 void(QuicErrorCode, ConnectionCloseSource)); | 50 void(QuicErrorCode, ConnectionCloseSource)); |
50 | 51 |
51 void SetCanWriteAnything() { | 52 void SetCanWriteAnything() { |
52 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true)); | 53 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true)); |
53 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _)) | 54 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _)) |
54 .WillRepeatedly(Return(true)); | 55 .WillRepeatedly(Return(true)); |
55 } | 56 } |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 } | 207 } |
207 | 208 |
208 QuicFramer framer_; | 209 QuicFramer framer_; |
209 MockRandom random_; | 210 MockRandom random_; |
210 SimpleBufferAllocator buffer_allocator_; | 211 SimpleBufferAllocator buffer_allocator_; |
211 StrictMock<MockDelegate> delegate_; | 212 StrictMock<MockDelegate> delegate_; |
212 QuicPacketGenerator generator_; | 213 QuicPacketGenerator generator_; |
213 QuicPacketCreator* creator_; | 214 QuicPacketCreator* creator_; |
214 SimpleQuicFramer simple_framer_; | 215 SimpleQuicFramer simple_framer_; |
215 vector<SerializedPacket> packets_; | 216 vector<SerializedPacket> packets_; |
| 217 QuicAckFrame ack_frame_; |
216 | 218 |
217 private: | 219 private: |
218 scoped_ptr<char[]> data_array_; | 220 scoped_ptr<char[]> data_array_; |
219 struct iovec iov_; | 221 struct iovec iov_; |
220 }; | 222 }; |
221 | 223 |
222 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate { | 224 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate { |
223 public: | 225 public: |
224 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); | 226 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); |
225 }; | 227 }; |
226 | 228 |
227 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { | 229 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { |
228 delegate_.SetCanNotWrite(); | 230 delegate_.SetCanNotWrite(); |
229 | 231 |
230 generator_.SetShouldSendAck(false); | 232 generator_.SetShouldSendAck(false); |
231 EXPECT_TRUE(generator_.HasQueuedFrames()); | 233 EXPECT_TRUE(generator_.HasQueuedFrames()); |
232 } | 234 } |
233 | 235 |
234 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | 236 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { |
235 StrictMock<MockDebugDelegate> debug_delegate; | 237 StrictMock<MockDebugDelegate> debug_delegate; |
236 | 238 |
237 generator_.set_debug_delegate(&debug_delegate); | 239 generator_.set_debug_delegate(&debug_delegate); |
238 delegate_.SetCanWriteOnlyNonRetransmittable(); | 240 delegate_.SetCanWriteOnlyNonRetransmittable(); |
239 generator_.StartBatchOperations(); | 241 generator_.StartBatchOperations(); |
240 | 242 |
241 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 243 if (FLAGS_quic_dont_copy_acks) { |
| 244 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 245 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 246 } else { |
| 247 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
| 248 } |
242 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | 249 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
243 | 250 |
244 generator_.SetShouldSendAck(false); | 251 generator_.SetShouldSendAck(false); |
245 EXPECT_TRUE(generator_.HasQueuedFrames()); | 252 EXPECT_TRUE(generator_.HasQueuedFrames()); |
246 } | 253 } |
247 | 254 |
248 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 255 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
249 delegate_.SetCanWriteOnlyNonRetransmittable(); | 256 delegate_.SetCanWriteOnlyNonRetransmittable(); |
250 | 257 |
251 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 258 if (FLAGS_quic_dont_copy_acks) { |
| 259 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 260 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 261 } else { |
| 262 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
| 263 } |
252 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 264 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
253 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 265 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
254 | 266 |
255 generator_.SetShouldSendAck(false); | 267 generator_.SetShouldSendAck(false); |
256 EXPECT_FALSE(generator_.HasQueuedFrames()); | 268 EXPECT_FALSE(generator_.HasQueuedFrames()); |
257 | 269 |
258 PacketContents contents; | 270 PacketContents contents; |
259 contents.num_ack_frames = 1; | 271 contents.num_ack_frames = 1; |
260 CheckPacketContains(contents, 0); | 272 CheckPacketContains(contents, 0); |
261 } | 273 } |
262 | 274 |
263 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { | 275 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { |
264 // Make sure that calling SetShouldSendAck multiple times does not result in a | 276 // Make sure that calling SetShouldSendAck multiple times does not result in a |
265 // crash. Previously this would result in multiple QuicFrames queued in the | 277 // crash. Previously this would result in multiple QuicFrames queued in the |
266 // packet generator, with all but the last with internal pointers to freed | 278 // packet generator, with all but the last with internal pointers to freed |
267 // memory. | 279 // memory. |
268 delegate_.SetCanWriteAnything(); | 280 delegate_.SetCanWriteAnything(); |
269 | 281 |
270 // Only one AckFrame should be created. | 282 // Only one AckFrame should be created. |
271 EXPECT_CALL(delegate_, PopulateAckFrame(_)).Times(1); | 283 if (FLAGS_quic_dont_copy_acks) { |
| 284 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 285 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 286 } else { |
| 287 EXPECT_CALL(delegate_, PopulateAckFrame(_)).Times(1); |
| 288 } |
272 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 289 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
273 .Times(1) | 290 .Times(1) |
274 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 291 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
275 | 292 |
276 generator_.StartBatchOperations(); | 293 generator_.StartBatchOperations(); |
277 generator_.SetShouldSendAck(false); | 294 generator_.SetShouldSendAck(false); |
278 generator_.SetShouldSendAck(false); | 295 generator_.SetShouldSendAck(false); |
279 generator_.FinishBatchOperations(); | 296 generator_.FinishBatchOperations(); |
280 } | 297 } |
281 | 298 |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 | 506 |
490 generator_.SetShouldSendAck(false); | 507 generator_.SetShouldSendAck(false); |
491 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 508 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
492 EXPECT_TRUE(generator_.HasQueuedFrames()); | 509 EXPECT_TRUE(generator_.HasQueuedFrames()); |
493 | 510 |
494 delegate_.SetCanWriteAnything(); | 511 delegate_.SetCanWriteAnything(); |
495 | 512 |
496 generator_.StartBatchOperations(); | 513 generator_.StartBatchOperations(); |
497 | 514 |
498 // When the first write operation is invoked, the ack frame will be returned. | 515 // When the first write operation is invoked, the ack frame will be returned. |
499 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 516 if (FLAGS_quic_dont_copy_acks) { |
| 517 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 518 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 519 } else { |
| 520 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
| 521 } |
500 | 522 |
501 // Send some data and a control frame | 523 // Send some data and a control frame |
502 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr); | 524 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr); |
503 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 525 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
504 | 526 |
505 // All five frames will be flushed out in a single packet. | 527 // All five frames will be flushed out in a single packet. |
506 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 528 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
507 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 529 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
508 generator_.FinishBatchOperations(); | 530 generator_.FinishBatchOperations(); |
509 EXPECT_FALSE(generator_.HasQueuedFrames()); | 531 EXPECT_FALSE(generator_.HasQueuedFrames()); |
(...skipping 11 matching lines...) Expand all Loading... |
521 | 543 |
522 generator_.SetShouldSendAck(false); | 544 generator_.SetShouldSendAck(false); |
523 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 545 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
524 EXPECT_TRUE(generator_.HasQueuedFrames()); | 546 EXPECT_TRUE(generator_.HasQueuedFrames()); |
525 | 547 |
526 delegate_.SetCanWriteAnything(); | 548 delegate_.SetCanWriteAnything(); |
527 | 549 |
528 generator_.StartBatchOperations(); | 550 generator_.StartBatchOperations(); |
529 | 551 |
530 // When the first write operation is invoked, the ack frame will be returned. | 552 // When the first write operation is invoked, the ack frame will be returned. |
531 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 553 if (FLAGS_quic_dont_copy_acks) { |
| 554 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 555 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 556 } else { |
| 557 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
| 558 } |
532 | 559 |
533 { | 560 { |
534 InSequence dummy; | 561 InSequence dummy; |
535 // All five frames will be flushed out in a single packet | 562 // All five frames will be flushed out in a single packet |
536 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 563 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
537 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 564 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
538 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 565 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
539 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 566 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
540 } | 567 } |
541 | 568 |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 // DFATALs are expected. | 837 // DFATALs are expected. |
811 // A 1 byte packet number length can't encode a gap of 1000. | 838 // A 1 byte packet number length can't encode a gap of 1000. |
812 QuicPacketCreatorPeer::SetPacketNumber(creator_, 1000); | 839 QuicPacketCreatorPeer::SetPacketNumber(creator_, 1000); |
813 | 840 |
814 delegate_.SetCanNotWrite(); | 841 delegate_.SetCanNotWrite(); |
815 generator_.SetShouldSendAck(true); | 842 generator_.SetShouldSendAck(true); |
816 delegate_.SetCanWriteAnything(); | 843 delegate_.SetCanWriteAnything(); |
817 generator_.StartBatchOperations(); | 844 generator_.StartBatchOperations(); |
818 | 845 |
819 // Set up frames to write into the creator when control frames are written. | 846 // Set up frames to write into the creator when control frames are written. |
820 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 847 if (FLAGS_quic_dont_copy_acks) { |
| 848 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 849 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 850 } else { |
| 851 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
| 852 } |
821 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); | 853 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); |
822 // Generator should have queued control frames, and creator should be empty. | 854 // Generator should have queued control frames, and creator should be empty. |
823 EXPECT_TRUE(generator_.HasQueuedFrames()); | 855 EXPECT_TRUE(generator_.HasQueuedFrames()); |
824 EXPECT_FALSE(creator_->HasPendingFrames()); | 856 EXPECT_FALSE(creator_->HasPendingFrames()); |
825 | 857 |
826 // This will not serialize any packets, because of the invalid frame. | 858 // This will not serialize any packets, because of the invalid frame. |
827 EXPECT_CALL(delegate_, | 859 EXPECT_CALL(delegate_, |
828 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, | 860 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, |
829 ConnectionCloseSource::FROM_SELF)); | 861 ConnectionCloseSource::FROM_SELF)); |
830 EXPECT_DFATAL(generator_.FinishBatchOperations(), | 862 EXPECT_DFATAL(generator_.FinishBatchOperations(), |
(...skipping 25 matching lines...) Expand all Loading... |
856 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 888 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
857 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 889 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
858 generator_.FlushAllQueuedFrames(); | 890 generator_.FlushAllQueuedFrames(); |
859 EXPECT_FALSE(generator_.HasQueuedFrames()); | 891 EXPECT_FALSE(generator_.HasQueuedFrames()); |
860 generator_.SetCurrentPath(kTestPathId1, 1, 0); | 892 generator_.SetCurrentPath(kTestPathId1, 1, 0); |
861 EXPECT_EQ(kTestPathId1, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | 893 EXPECT_EQ(kTestPathId1, QuicPacketCreatorPeer::GetCurrentPath(creator_)); |
862 } | 894 } |
863 | 895 |
864 } // namespace test | 896 } // namespace test |
865 } // namespace net | 897 } // namespace net |
OLD | NEW |