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 "net/quic/crypto/crypto_protocol.h" | 9 #include "net/quic/crypto/crypto_protocol.h" |
10 #include "net/quic/crypto/null_encrypter.h" | 10 #include "net/quic/crypto/null_encrypter.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_METHOD3(ShouldGeneratePacket, | 42 MOCK_METHOD3(ShouldGeneratePacket, |
43 bool(TransmissionType transmission_type, | 43 bool(TransmissionType transmission_type, |
44 HasRetransmittableData retransmittable, | 44 HasRetransmittableData retransmittable, |
45 IsHandshake handshake)); | 45 IsHandshake handshake)); |
46 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); | 46 MOCK_METHOD1(PopulateAckFrame, void(QuicAckFrame*)); |
47 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); | 47 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*)); |
48 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); | 48 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); |
49 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); | 49 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); |
50 | 50 |
51 void SetCanWriteAnything() { | 51 void SetCanWriteAnything() { |
52 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 52 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
53 .WillRepeatedly(Return(true)); | 53 .WillRepeatedly(Return(true)); |
54 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 54 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
55 NO_RETRANSMITTABLE_DATA, _)) | 55 NO_RETRANSMITTABLE_DATA, _)) |
56 .WillRepeatedly(Return(true)); | 56 .WillRepeatedly(Return(true)); |
57 } | 57 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 delete packet5_.packet; | 130 delete packet5_.packet; |
131 delete packet5_.retransmittable_frames; | 131 delete packet5_.retransmittable_frames; |
132 delete packet6_.packet; | 132 delete packet6_.packet; |
133 delete packet6_.retransmittable_frames; | 133 delete packet6_.retransmittable_frames; |
134 delete packet7_.packet; | 134 delete packet7_.packet; |
135 delete packet7_.retransmittable_frames; | 135 delete packet7_.retransmittable_frames; |
136 delete packet8_.packet; | 136 delete packet8_.packet; |
137 delete packet8_.retransmittable_frames; | 137 delete packet8_.retransmittable_frames; |
138 } | 138 } |
139 | 139 |
140 QuicAckFrame* CreateAckFrame() { | |
141 // TODO(rch): Initialize this so it can be verified later. | |
142 return new QuicAckFrame(MakeAckFrame(0)); | |
143 } | |
144 | |
145 QuicStopWaitingFrame* CreateStopWaitingFrame() { | |
146 QuicStopWaitingFrame* frame = new QuicStopWaitingFrame(); | |
147 frame->entropy_hash = 0; | |
148 frame->least_unacked = 0; | |
149 return frame; | |
150 } | |
151 | |
152 QuicRstStreamFrame* CreateRstStreamFrame() { | 140 QuicRstStreamFrame* CreateRstStreamFrame() { |
153 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); | 141 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); |
154 } | 142 } |
155 | 143 |
156 QuicGoAwayFrame* CreateGoAwayFrame() { | 144 QuicGoAwayFrame* CreateGoAwayFrame() { |
157 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); | 145 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); |
158 } | 146 } |
159 | 147 |
160 void CheckPacketContains(const PacketContents& contents, | 148 void CheckPacketContains(const PacketContents& contents, |
161 const SerializedPacket& packet) { | 149 const SerializedPacket& packet) { |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 EXPECT_TRUE(generator_.HasQueuedFrames()); | 237 EXPECT_TRUE(generator_.HasQueuedFrames()); |
250 } | 238 } |
251 | 239 |
252 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | 240 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { |
253 StrictMock<MockDebugDelegate> debug_delegate; | 241 StrictMock<MockDebugDelegate> debug_delegate; |
254 | 242 |
255 generator_.set_debug_delegate(&debug_delegate); | 243 generator_.set_debug_delegate(&debug_delegate); |
256 delegate_.SetCanWriteOnlyNonRetransmittable(); | 244 delegate_.SetCanWriteOnlyNonRetransmittable(); |
257 generator_.StartBatchOperations(); | 245 generator_.StartBatchOperations(); |
258 | 246 |
259 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 247 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
260 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | 248 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
261 | 249 |
262 generator_.SetShouldSendAck(false); | 250 generator_.SetShouldSendAck(false); |
263 EXPECT_TRUE(generator_.HasQueuedFrames()); | 251 EXPECT_TRUE(generator_.HasQueuedFrames()); |
264 } | 252 } |
265 | 253 |
266 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 254 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
267 delegate_.SetCanWriteOnlyNonRetransmittable(); | 255 delegate_.SetCanWriteOnlyNonRetransmittable(); |
268 | 256 |
269 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 257 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
270 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 258 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
271 | 259 |
272 generator_.SetShouldSendAck(false); | 260 generator_.SetShouldSendAck(false); |
273 EXPECT_FALSE(generator_.HasQueuedFrames()); | 261 EXPECT_FALSE(generator_.HasQueuedFrames()); |
274 | 262 |
275 PacketContents contents; | 263 PacketContents contents; |
276 contents.num_ack_frames = 1; | 264 contents.num_ack_frames = 1; |
277 CheckPacketContains(contents, packet_); | 265 CheckPacketContains(contents, packet_); |
278 } | 266 } |
279 | 267 |
280 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { | 268 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { |
281 // Make sure that calling SetShouldSendAck multiple times does not result in a | 269 // Make sure that calling SetShouldSendAck multiple times does not result in a |
282 // crash. Previously this would result in multiple QuicFrames queued in the | 270 // crash. Previously this would result in multiple QuicFrames queued in the |
283 // packet generator, with all but the last with internal pointers to freed | 271 // packet generator, with all but the last with internal pointers to freed |
284 // memory. | 272 // memory. |
285 delegate_.SetCanWriteAnything(); | 273 delegate_.SetCanWriteAnything(); |
286 | 274 |
287 // Only one AckFrame should be created. | 275 // Only one AckFrame should be created. |
288 EXPECT_CALL(delegate_, CreateAckFrame()) | 276 EXPECT_CALL(delegate_, PopulateAckFrame(_)).Times(1); |
289 .Times(1) | |
290 .WillOnce(Return(CreateAckFrame())); | |
291 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 277 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
292 .Times(1) | 278 .Times(1) |
293 .WillOnce(SaveArg<0>(&packet_)); | 279 .WillOnce(SaveArg<0>(&packet_)); |
294 | 280 |
295 generator_.StartBatchOperations(); | 281 generator_.StartBatchOperations(); |
296 generator_.SetShouldSendAck(false); | 282 generator_.SetShouldSendAck(false); |
297 generator_.SetShouldSendAck(false); | 283 generator_.SetShouldSendAck(false); |
298 generator_.FinishBatchOperations(); | 284 generator_.FinishBatchOperations(); |
299 } | 285 } |
300 | 286 |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
864 // Enable FEC. | 850 // Enable FEC. |
865 creator_->set_max_packets_per_fec_group(2); | 851 creator_->set_max_packets_per_fec_group(2); |
866 | 852 |
867 // Queue control frames in generator. | 853 // Queue control frames in generator. |
868 delegate_.SetCanNotWrite(); | 854 delegate_.SetCanNotWrite(); |
869 generator_.SetShouldSendAck(true); | 855 generator_.SetShouldSendAck(true); |
870 delegate_.SetCanWriteAnything(); | 856 delegate_.SetCanWriteAnything(); |
871 generator_.StartBatchOperations(); | 857 generator_.StartBatchOperations(); |
872 | 858 |
873 // Set up frames to write into the creator when control frames are written. | 859 // Set up frames to write into the creator when control frames are written. |
874 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 860 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
875 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( | 861 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); |
876 Return(CreateStopWaitingFrame())); | |
877 | 862 |
878 // Generator should have queued control frames, and creator should be empty. | 863 // Generator should have queued control frames, and creator should be empty. |
879 EXPECT_TRUE(generator_.HasQueuedFrames()); | 864 EXPECT_TRUE(generator_.HasQueuedFrames()); |
880 EXPECT_FALSE(creator_->HasPendingFrames()); | 865 EXPECT_FALSE(creator_->HasPendingFrames()); |
881 EXPECT_FALSE(creator_->IsFecProtected()); | 866 EXPECT_FALSE(creator_->IsFecProtected()); |
882 | 867 |
883 // Queue protected data for sending. Should cause queued frames to be flushed. | 868 // Queue protected data for sending. Should cause queued frames to be flushed. |
884 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 869 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
885 SaveArg<0>(&packet_)); | 870 SaveArg<0>(&packet_)); |
886 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 871 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1019 | 1004 |
1020 generator_.SetShouldSendAck(false); | 1005 generator_.SetShouldSendAck(false); |
1021 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 1006 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
1022 EXPECT_TRUE(generator_.HasQueuedFrames()); | 1007 EXPECT_TRUE(generator_.HasQueuedFrames()); |
1023 | 1008 |
1024 delegate_.SetCanWriteAnything(); | 1009 delegate_.SetCanWriteAnything(); |
1025 | 1010 |
1026 generator_.StartBatchOperations(); | 1011 generator_.StartBatchOperations(); |
1027 | 1012 |
1028 // When the first write operation is invoked, the ack frame will be returned. | 1013 // When the first write operation is invoked, the ack frame will be returned. |
1029 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 1014 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
1030 | 1015 |
1031 // Send some data and a control frame | 1016 // Send some data and a control frame |
1032 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, | 1017 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, |
1033 nullptr); | 1018 nullptr); |
1034 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 1019 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
1035 | 1020 |
1036 // All five frames will be flushed out in a single packet. | 1021 // All five frames will be flushed out in a single packet. |
1037 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 1022 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
1038 generator_.FinishBatchOperations(); | 1023 generator_.FinishBatchOperations(); |
1039 EXPECT_FALSE(generator_.HasQueuedFrames()); | 1024 EXPECT_FALSE(generator_.HasQueuedFrames()); |
(...skipping 11 matching lines...) Expand all Loading... |
1051 | 1036 |
1052 generator_.SetShouldSendAck(false); | 1037 generator_.SetShouldSendAck(false); |
1053 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 1038 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
1054 EXPECT_TRUE(generator_.HasQueuedFrames()); | 1039 EXPECT_TRUE(generator_.HasQueuedFrames()); |
1055 | 1040 |
1056 delegate_.SetCanWriteAnything(); | 1041 delegate_.SetCanWriteAnything(); |
1057 | 1042 |
1058 generator_.StartBatchOperations(); | 1043 generator_.StartBatchOperations(); |
1059 | 1044 |
1060 // When the first write operation is invoked, the ack frame will be returned. | 1045 // When the first write operation is invoked, the ack frame will be returned. |
1061 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 1046 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
1062 | 1047 |
1063 { | 1048 { |
1064 InSequence dummy; | 1049 InSequence dummy; |
1065 // All five frames will be flushed out in a single packet | 1050 // All five frames will be flushed out in a single packet |
1066 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 1051 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
1067 SaveArg<0>(&packet_)); | 1052 SaveArg<0>(&packet_)); |
1068 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 1053 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
1069 SaveArg<0>(&packet2_)); | 1054 SaveArg<0>(&packet2_)); |
1070 } | 1055 } |
1071 | 1056 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1112 generator_.SetConnectionIdLength(7); | 1097 generator_.SetConnectionIdLength(7); |
1113 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 1098 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1114 generator_.SetConnectionIdLength(8); | 1099 generator_.SetConnectionIdLength(8); |
1115 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 1100 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1116 generator_.SetConnectionIdLength(9); | 1101 generator_.SetConnectionIdLength(9); |
1117 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 1102 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1118 } | 1103 } |
1119 | 1104 |
1120 } // namespace test | 1105 } // namespace test |
1121 } // namespace net | 1106 } // namespace net |
OLD | NEW |