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 14 matching lines...) Expand all Loading... |
25 using testing::InSequence; | 25 using testing::InSequence; |
26 using testing::Return; | 26 using testing::Return; |
27 using testing::SaveArg; | 27 using testing::SaveArg; |
28 using testing::StrictMock; | 28 using testing::StrictMock; |
29 using testing::_; | 29 using testing::_; |
30 | 30 |
31 namespace net { | 31 namespace net { |
32 namespace test { | 32 namespace test { |
33 namespace { | 33 namespace { |
34 | 34 |
| 35 const int64 kMinFecTimeoutMs = 5u; |
| 36 |
35 class MockDelegate : public QuicPacketGenerator::DelegateInterface { | 37 class MockDelegate : public QuicPacketGenerator::DelegateInterface { |
36 public: | 38 public: |
37 MockDelegate() {} | 39 MockDelegate() {} |
38 ~MockDelegate() override {} | 40 ~MockDelegate() override {} |
39 | 41 |
40 MOCK_METHOD3(ShouldGeneratePacket, | 42 MOCK_METHOD3(ShouldGeneratePacket, |
41 bool(TransmissionType transmission_type, | 43 bool(TransmissionType transmission_type, |
42 HasRetransmittableData retransmittable, | 44 HasRetransmittableData retransmittable, |
43 IsHandshake handshake)); | 45 IsHandshake handshake)); |
44 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); | 46 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); |
45 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); | |
46 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); | 47 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); |
47 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); | 48 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); |
48 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); | 49 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); |
49 | 50 |
50 void SetCanWriteAnything() { | 51 void SetCanWriteAnything() { |
51 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 52 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
52 .WillRepeatedly(Return(true)); | 53 .WillRepeatedly(Return(true)); |
53 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 54 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
54 NO_RETRANSMITTABLE_DATA, _)) | 55 NO_RETRANSMITTABLE_DATA, _)) |
55 .WillRepeatedly(Return(true)); | 56 .WillRepeatedly(Return(true)); |
56 } | 57 } |
57 | 58 |
58 void SetCanNotWrite() { | 59 void SetCanNotWrite() { |
59 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 60 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
60 .WillRepeatedly(Return(false)); | 61 .WillRepeatedly(Return(false)); |
61 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 62 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
62 NO_RETRANSMITTABLE_DATA, _)) | 63 NO_RETRANSMITTABLE_DATA, _)) |
63 .WillRepeatedly(Return(false)); | 64 .WillRepeatedly(Return(false)); |
64 } | 65 } |
65 | 66 |
66 // Use this when only ack and feedback frames should be allowed to be written. | 67 // Use this when only ack frames should be allowed to be written. |
67 void SetCanWriteOnlyNonRetransmittable() { | 68 void SetCanWriteOnlyNonRetransmittable() { |
68 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 69 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
69 .WillRepeatedly(Return(false)); | 70 .WillRepeatedly(Return(false)); |
70 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 71 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
71 NO_RETRANSMITTABLE_DATA, _)) | 72 NO_RETRANSMITTABLE_DATA, _)) |
72 .WillRepeatedly(Return(true)); | 73 .WillRepeatedly(Return(true)); |
73 } | 74 } |
74 | 75 |
75 private: | 76 private: |
76 DISALLOW_COPY_AND_ASSIGN(MockDelegate); | 77 DISALLOW_COPY_AND_ASSIGN(MockDelegate); |
77 }; | 78 }; |
78 | 79 |
79 // Simple struct for describing the contents of a packet. | 80 // Simple struct for describing the contents of a packet. |
80 // Useful in conjunction with a SimpleQuicFrame for validating | 81 // Useful in conjunction with a SimpleQuicFrame for validating that a packet |
81 // that a packet contains the expected frames. | 82 // contains the expected frames. |
82 struct PacketContents { | 83 struct PacketContents { |
83 PacketContents() | 84 PacketContents() |
84 : num_ack_frames(0), | 85 : num_ack_frames(0), |
85 num_connection_close_frames(0), | 86 num_connection_close_frames(0), |
86 num_feedback_frames(0), | |
87 num_goaway_frames(0), | 87 num_goaway_frames(0), |
88 num_rst_stream_frames(0), | 88 num_rst_stream_frames(0), |
89 num_stop_waiting_frames(0), | 89 num_stop_waiting_frames(0), |
90 num_stream_frames(0), | 90 num_stream_frames(0), |
91 fec_group(0) { | 91 fec_group(0) { |
92 } | 92 } |
93 | 93 |
94 size_t num_ack_frames; | 94 size_t num_ack_frames; |
95 size_t num_connection_close_frames; | 95 size_t num_connection_close_frames; |
96 size_t num_feedback_frames; | |
97 size_t num_goaway_frames; | 96 size_t num_goaway_frames; |
98 size_t num_rst_stream_frames; | 97 size_t num_rst_stream_frames; |
99 size_t num_stop_waiting_frames; | 98 size_t num_stop_waiting_frames; |
100 size_t num_stream_frames; | 99 size_t num_stream_frames; |
101 | 100 |
102 QuicFecGroupNumber fec_group; | 101 QuicFecGroupNumber fec_group; |
103 }; | 102 }; |
104 | 103 |
105 } // namespace | 104 } // namespace |
106 | 105 |
107 class QuicPacketGeneratorTest : public ::testing::Test { | 106 class QuicPacketGeneratorTest : public ::testing::Test { |
108 protected: | 107 protected: |
109 QuicPacketGeneratorTest() | 108 QuicPacketGeneratorTest() |
110 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), | 109 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), |
111 generator_(42, &framer_, &random_, &delegate_), | 110 generator_(42, &framer_, &random_, &delegate_), |
112 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)), | 111 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)), |
113 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 112 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
114 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 113 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
115 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 114 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
116 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 115 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
117 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 116 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
118 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 117 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
119 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr) {} | 118 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 119 packet8_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr) {} |
120 | 120 |
121 ~QuicPacketGeneratorTest() override { | 121 ~QuicPacketGeneratorTest() override { |
122 delete packet_.packet; | 122 delete packet_.packet; |
123 delete packet_.retransmittable_frames; | 123 delete packet_.retransmittable_frames; |
124 delete packet2_.packet; | 124 delete packet2_.packet; |
125 delete packet2_.retransmittable_frames; | 125 delete packet2_.retransmittable_frames; |
126 delete packet3_.packet; | 126 delete packet3_.packet; |
127 delete packet3_.retransmittable_frames; | 127 delete packet3_.retransmittable_frames; |
128 delete packet4_.packet; | 128 delete packet4_.packet; |
129 delete packet4_.retransmittable_frames; | 129 delete packet4_.retransmittable_frames; |
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; |
| 137 delete packet8_.retransmittable_frames; |
136 } | 138 } |
137 | 139 |
138 QuicAckFrame* CreateAckFrame() { | 140 QuicAckFrame* CreateAckFrame() { |
139 // TODO(rch): Initialize this so it can be verified later. | 141 // TODO(rch): Initialize this so it can be verified later. |
140 return new QuicAckFrame(MakeAckFrame(0)); | 142 return new QuicAckFrame(MakeAckFrame(0)); |
141 } | 143 } |
142 | 144 |
143 QuicCongestionFeedbackFrame* CreateFeedbackFrame() { | |
144 QuicCongestionFeedbackFrame* frame = new QuicCongestionFeedbackFrame; | |
145 frame->type = kTCP; | |
146 frame->tcp.receive_window = 0x4030; | |
147 return frame; | |
148 } | |
149 | |
150 QuicStopWaitingFrame* CreateStopWaitingFrame() { | 145 QuicStopWaitingFrame* CreateStopWaitingFrame() { |
151 QuicStopWaitingFrame* frame = new QuicStopWaitingFrame(); | 146 QuicStopWaitingFrame* frame = new QuicStopWaitingFrame(); |
152 frame->entropy_hash = 0; | 147 frame->entropy_hash = 0; |
153 frame->least_unacked = 0; | 148 frame->least_unacked = 0; |
154 return frame; | 149 return frame; |
155 } | 150 } |
156 | 151 |
157 QuicRstStreamFrame* CreateRstStreamFrame() { | 152 QuicRstStreamFrame* CreateRstStreamFrame() { |
158 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); | 153 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); |
159 } | 154 } |
160 | 155 |
161 QuicGoAwayFrame* CreateGoAwayFrame() { | 156 QuicGoAwayFrame* CreateGoAwayFrame() { |
162 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); | 157 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); |
163 } | 158 } |
164 | 159 |
165 void CheckPacketContains(const PacketContents& contents, | 160 void CheckPacketContains(const PacketContents& contents, |
166 const SerializedPacket& packet) { | 161 const SerializedPacket& packet) { |
167 size_t num_retransmittable_frames = contents.num_connection_close_frames + | 162 size_t num_retransmittable_frames = contents.num_connection_close_frames + |
168 contents.num_goaway_frames + contents.num_rst_stream_frames + | 163 contents.num_goaway_frames + contents.num_rst_stream_frames + |
169 contents.num_stream_frames; | 164 contents.num_stream_frames; |
170 size_t num_frames = contents.num_feedback_frames + contents.num_ack_frames + | 165 size_t num_frames = contents.num_ack_frames + |
171 contents.num_stop_waiting_frames + num_retransmittable_frames; | 166 contents.num_stop_waiting_frames + |
| 167 num_retransmittable_frames; |
172 | 168 |
173 if (num_retransmittable_frames == 0) { | 169 if (num_retransmittable_frames == 0) { |
174 ASSERT_TRUE(packet.retransmittable_frames == nullptr); | 170 ASSERT_TRUE(packet.retransmittable_frames == nullptr); |
175 } else { | 171 } else { |
176 ASSERT_TRUE(packet.retransmittable_frames != nullptr); | 172 ASSERT_TRUE(packet.retransmittable_frames != nullptr); |
177 EXPECT_EQ(num_retransmittable_frames, | 173 EXPECT_EQ(num_retransmittable_frames, |
178 packet.retransmittable_frames->frames().size()); | 174 packet.retransmittable_frames->frames().size()); |
179 } | 175 } |
180 | 176 |
181 ASSERT_TRUE(packet.packet != nullptr); | 177 ASSERT_TRUE(packet.packet != nullptr); |
182 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); | 178 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); |
183 EXPECT_EQ(num_frames, simple_framer_.num_frames()); | 179 EXPECT_EQ(num_frames, simple_framer_.num_frames()); |
184 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); | 180 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); |
185 EXPECT_EQ(contents.num_connection_close_frames, | 181 EXPECT_EQ(contents.num_connection_close_frames, |
186 simple_framer_.connection_close_frames().size()); | 182 simple_framer_.connection_close_frames().size()); |
187 EXPECT_EQ(contents.num_feedback_frames, | |
188 simple_framer_.feedback_frames().size()); | |
189 EXPECT_EQ(contents.num_goaway_frames, | 183 EXPECT_EQ(contents.num_goaway_frames, |
190 simple_framer_.goaway_frames().size()); | 184 simple_framer_.goaway_frames().size()); |
191 EXPECT_EQ(contents.num_rst_stream_frames, | 185 EXPECT_EQ(contents.num_rst_stream_frames, |
192 simple_framer_.rst_stream_frames().size()); | 186 simple_framer_.rst_stream_frames().size()); |
193 EXPECT_EQ(contents.num_stream_frames, | 187 EXPECT_EQ(contents.num_stream_frames, |
194 simple_framer_.stream_frames().size()); | 188 simple_framer_.stream_frames().size()); |
195 EXPECT_EQ(contents.num_stop_waiting_frames, | 189 EXPECT_EQ(contents.num_stop_waiting_frames, |
196 simple_framer_.stop_waiting_frames().size()); | 190 simple_framer_.stop_waiting_frames().size()); |
197 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group); | 191 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group); |
198 } | 192 } |
(...skipping 30 matching lines...) Expand all Loading... |
229 QuicPacketGenerator generator_; | 223 QuicPacketGenerator generator_; |
230 QuicPacketCreator* creator_; | 224 QuicPacketCreator* creator_; |
231 SimpleQuicFramer simple_framer_; | 225 SimpleQuicFramer simple_framer_; |
232 SerializedPacket packet_; | 226 SerializedPacket packet_; |
233 SerializedPacket packet2_; | 227 SerializedPacket packet2_; |
234 SerializedPacket packet3_; | 228 SerializedPacket packet3_; |
235 SerializedPacket packet4_; | 229 SerializedPacket packet4_; |
236 SerializedPacket packet5_; | 230 SerializedPacket packet5_; |
237 SerializedPacket packet6_; | 231 SerializedPacket packet6_; |
238 SerializedPacket packet7_; | 232 SerializedPacket packet7_; |
| 233 SerializedPacket packet8_; |
239 | 234 |
240 private: | 235 private: |
241 scoped_ptr<char[]> data_array_; | 236 scoped_ptr<char[]> data_array_; |
242 }; | 237 }; |
243 | 238 |
244 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate { | 239 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate { |
245 public: | 240 public: |
246 MOCK_METHOD1(OnFrameAddedToPacket, | 241 MOCK_METHOD1(OnFrameAddedToPacket, |
247 void(const QuicFrame&)); | 242 void(const QuicFrame&)); |
248 }; | 243 }; |
249 | 244 |
250 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { | 245 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { |
251 delegate_.SetCanNotWrite(); | 246 delegate_.SetCanNotWrite(); |
252 | 247 |
253 generator_.SetShouldSendAck(false, false); | 248 generator_.SetShouldSendAck(false); |
254 EXPECT_TRUE(generator_.HasQueuedFrames()); | 249 EXPECT_TRUE(generator_.HasQueuedFrames()); |
255 } | 250 } |
256 | 251 |
257 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | 252 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { |
258 StrictMock<MockDebugDelegate> debug_delegate; | 253 StrictMock<MockDebugDelegate> debug_delegate; |
259 | 254 |
260 generator_.set_debug_delegate(&debug_delegate); | 255 generator_.set_debug_delegate(&debug_delegate); |
261 delegate_.SetCanWriteOnlyNonRetransmittable(); | 256 delegate_.SetCanWriteOnlyNonRetransmittable(); |
262 generator_.StartBatchOperations(); | 257 generator_.StartBatchOperations(); |
263 | 258 |
264 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 259 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
265 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | 260 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
266 | 261 |
267 generator_.SetShouldSendAck(false, false); | 262 generator_.SetShouldSendAck(false); |
268 EXPECT_TRUE(generator_.HasQueuedFrames()); | 263 EXPECT_TRUE(generator_.HasQueuedFrames()); |
269 } | 264 } |
270 | 265 |
271 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 266 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
272 delegate_.SetCanWriteOnlyNonRetransmittable(); | 267 delegate_.SetCanWriteOnlyNonRetransmittable(); |
273 | 268 |
274 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 269 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
275 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 270 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
276 | 271 |
277 generator_.SetShouldSendAck(false, false); | 272 generator_.SetShouldSendAck(false); |
278 EXPECT_FALSE(generator_.HasQueuedFrames()); | 273 EXPECT_FALSE(generator_.HasQueuedFrames()); |
279 | 274 |
280 PacketContents contents; | 275 PacketContents contents; |
281 contents.num_ack_frames = 1; | 276 contents.num_ack_frames = 1; |
282 CheckPacketContains(contents, packet_); | 277 CheckPacketContains(contents, packet_); |
283 } | 278 } |
284 | 279 |
285 TEST_F(QuicPacketGeneratorTest, | |
286 ShouldSendAckWithFeedback_WritableAndShouldNotFlush) { | |
287 delegate_.SetCanWriteOnlyNonRetransmittable(); | |
288 generator_.StartBatchOperations(); | |
289 | |
290 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | |
291 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | |
292 Return(CreateFeedbackFrame())); | |
293 | |
294 generator_.SetShouldSendAck(true, false); | |
295 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
296 } | |
297 | |
298 TEST_F(QuicPacketGeneratorTest, | |
299 ShouldSendAckWithFeedback_WritableAndShouldFlush) { | |
300 delegate_.SetCanWriteOnlyNonRetransmittable(); | |
301 | |
302 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | |
303 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | |
304 Return(CreateFeedbackFrame())); | |
305 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( | |
306 Return(CreateStopWaitingFrame())); | |
307 | |
308 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
309 | |
310 generator_.SetShouldSendAck(true, true); | |
311 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
312 | |
313 PacketContents contents; | |
314 contents.num_ack_frames = 1; | |
315 contents.num_feedback_frames = 1; | |
316 contents.num_stop_waiting_frames = 1; | |
317 CheckPacketContains(contents, packet_); | |
318 } | |
319 | |
320 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { | 280 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { |
321 ValueRestore<bool> old_flag(&FLAGS_quic_disallow_multiple_pending_ack_frames, | |
322 true); | |
323 | |
324 // Make sure that calling SetShouldSendAck multiple times does not result in a | 281 // Make sure that calling SetShouldSendAck multiple times does not result in a |
325 // crash. Previously this would result in multiple QuicFrames queued in the | 282 // crash. Previously this would result in multiple QuicFrames queued in the |
326 // packet generator, with all but the last with internal pointers to freed | 283 // packet generator, with all but the last with internal pointers to freed |
327 // memory. | 284 // memory. |
328 delegate_.SetCanWriteAnything(); | 285 delegate_.SetCanWriteAnything(); |
329 | 286 |
330 // Only one AckFrame should be created. | 287 // Only one AckFrame should be created. |
331 EXPECT_CALL(delegate_, CreateAckFrame()) | 288 EXPECT_CALL(delegate_, CreateAckFrame()) |
332 .Times(1) | 289 .Times(1) |
333 .WillOnce(Return(CreateAckFrame())); | 290 .WillOnce(Return(CreateAckFrame())); |
334 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 291 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
335 .Times(1) | 292 .Times(1) |
336 .WillOnce(SaveArg<0>(&packet_)); | 293 .WillOnce(SaveArg<0>(&packet_)); |
337 | 294 |
338 generator_.StartBatchOperations(); | 295 generator_.StartBatchOperations(); |
339 generator_.SetShouldSendAck(false, false); | 296 generator_.SetShouldSendAck(false); |
340 generator_.SetShouldSendAck(false, false); | 297 generator_.SetShouldSendAck(false); |
341 generator_.FinishBatchOperations(); | 298 generator_.FinishBatchOperations(); |
342 } | 299 } |
343 | 300 |
344 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { | 301 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { |
345 delegate_.SetCanNotWrite(); | 302 delegate_.SetCanNotWrite(); |
346 | 303 |
347 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 304 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
348 EXPECT_TRUE(generator_.HasQueuedFrames()); | 305 EXPECT_TRUE(generator_.HasQueuedFrames()); |
349 } | 306 } |
350 | 307 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 EXPECT_EQ(3u, consumed.bytes_consumed); | 381 EXPECT_EQ(3u, consumed.bytes_consumed); |
425 EXPECT_TRUE(consumed.fin_consumed); | 382 EXPECT_TRUE(consumed.fin_consumed); |
426 EXPECT_FALSE(generator_.HasQueuedFrames()); | 383 EXPECT_FALSE(generator_.HasQueuedFrames()); |
427 | 384 |
428 PacketContents contents; | 385 PacketContents contents; |
429 contents.num_stream_frames = 1; | 386 contents.num_stream_frames = 1; |
430 CheckPacketContains(contents, packet_); | 387 CheckPacketContains(contents, packet_); |
431 } | 388 } |
432 | 389 |
433 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { | 390 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { |
434 ValueRestore<bool> old_flag(&FLAGS_quic_empty_data_no_fin_early_return, true); | |
435 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, | 391 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, |
436 false, MAY_FEC_PROTECT, nullptr), | 392 false, MAY_FEC_PROTECT, nullptr), |
437 "Attempt to consume empty data without FIN."); | 393 "Attempt to consume empty data without FIN."); |
438 } | 394 } |
439 | 395 |
440 TEST_F(QuicPacketGeneratorTest, | 396 TEST_F(QuicPacketGeneratorTest, |
441 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { | 397 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { |
442 delegate_.SetCanWriteAnything(); | 398 delegate_.SetCanWriteAnything(); |
443 generator_.StartBatchOperations(); | 399 generator_.StartBatchOperations(); |
444 | 400 |
(...skipping 21 matching lines...) Expand all Loading... |
466 // Now both frames will be flushed out. | 422 // Now both frames will be flushed out. |
467 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 423 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
468 generator_.FinishBatchOperations(); | 424 generator_.FinishBatchOperations(); |
469 EXPECT_FALSE(generator_.HasQueuedFrames()); | 425 EXPECT_FALSE(generator_.HasQueuedFrames()); |
470 | 426 |
471 PacketContents contents; | 427 PacketContents contents; |
472 contents.num_stream_frames = 2; | 428 contents.num_stream_frames = 2; |
473 CheckPacketContains(contents, packet_); | 429 CheckPacketContains(contents, packet_); |
474 } | 430 } |
475 | 431 |
476 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { | 432 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnMaxGroupSize) { |
477 delegate_.SetCanWriteAnything(); | 433 delegate_.SetCanWriteAnything(); |
478 | 434 |
479 // Send FEC every two packets. | 435 // Send FEC every two packets. |
480 creator_->set_max_packets_per_fec_group(2); | 436 creator_->set_max_packets_per_fec_group(2); |
481 | 437 |
482 { | 438 { |
483 InSequence dummy; | 439 InSequence dummy; |
484 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 440 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
485 SaveArg<0>(&packet_)); | 441 SaveArg<0>(&packet_)); |
486 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 442 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
487 SaveArg<0>(&packet2_)); | 443 SaveArg<0>(&packet2_)); |
488 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 444 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
489 SaveArg<0>(&packet3_)); | 445 SaveArg<0>(&packet3_)); |
490 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 446 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
491 SaveArg<0>(&packet4_)); | 447 SaveArg<0>(&packet4_)); |
492 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
493 SaveArg<0>(&packet5_)); | |
494 } | 448 } |
495 | 449 |
496 // Send enough data to create 3 packets: two full and one partial. Send | 450 // Send enough data to create 3 packets: two full and one partial. Send with |
497 // with MUST_FEC_PROTECT flag. | 451 // MUST_FEC_PROTECT flag. |
498 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 452 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
499 QuicConsumedData consumed = generator_.ConsumeData( | 453 QuicConsumedData consumed = generator_.ConsumeData( |
500 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | 454 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
501 EXPECT_EQ(data_len, consumed.bytes_consumed); | 455 EXPECT_EQ(data_len, consumed.bytes_consumed); |
502 EXPECT_TRUE(consumed.fin_consumed); | 456 EXPECT_TRUE(consumed.fin_consumed); |
503 EXPECT_FALSE(generator_.HasQueuedFrames()); | 457 EXPECT_FALSE(generator_.HasQueuedFrames()); |
504 | 458 |
505 CheckPacketHasSingleStreamFrame(packet_); | 459 CheckPacketHasSingleStreamFrame(packet_); |
506 CheckPacketHasSingleStreamFrame(packet2_); | 460 CheckPacketHasSingleStreamFrame(packet2_); |
507 CheckPacketIsFec(packet3_, 1); | 461 CheckPacketIsFec(packet3_, 1); |
| 462 CheckPacketHasSingleStreamFrame(packet4_); |
| 463 EXPECT_TRUE(creator_->IsFecProtected()); |
508 | 464 |
509 CheckPacketHasSingleStreamFrame(packet4_); | 465 // The FEC packet under construction will be sent when one more packet is sent |
510 CheckPacketIsFec(packet5_, 4); | 466 // (since FEC group size is 2), or when OnFecTimeout is called. Send more data |
| 467 // with MAY_FEC_PROTECT. This packet should also be protected, and FEC packet |
| 468 // is sent since FEC group size is reached. |
| 469 { |
| 470 InSequence dummy; |
| 471 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 472 .WillOnce(SaveArg<0>(&packet5_)); |
| 473 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 474 .WillOnce(SaveArg<0>(&packet6_)); |
| 475 } |
| 476 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 477 nullptr); |
| 478 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 479 CheckPacketHasSingleStreamFrame(packet5_); |
| 480 CheckPacketIsFec(packet6_, 4); |
| 481 EXPECT_FALSE(creator_->IsFecProtected()); |
511 } | 482 } |
512 | 483 |
513 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { | 484 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnTimeout) { |
514 delegate_.SetCanWriteAnything(); | 485 delegate_.SetCanWriteAnything(); |
| 486 creator_->set_max_packets_per_fec_group(1000); |
515 | 487 |
516 // Enable FEC. | 488 // Send data with MUST_FEC_PROTECT flag. No FEC packet is emitted, but the |
| 489 // creator FEC protects all data. |
| 490 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 491 QuicConsumedData consumed = generator_.ConsumeData(3, CreateData(1u), 0, true, |
| 492 MUST_FEC_PROTECT, nullptr); |
| 493 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 494 EXPECT_TRUE(consumed.fin_consumed); |
| 495 CheckPacketHasSingleStreamFrame(packet_); |
| 496 EXPECT_TRUE(creator_->IsFecProtected()); |
| 497 |
| 498 // Send more data with MAY_FEC_PROTECT. This packet should also be protected, |
| 499 // and FEC packet is not yet sent. |
| 500 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_)); |
| 501 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 502 nullptr); |
| 503 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 504 CheckPacketHasSingleStreamFrame(packet2_); |
| 505 EXPECT_TRUE(creator_->IsFecProtected()); |
| 506 |
| 507 // Calling OnFecTimeout should cause the FEC packet to be emitted. |
| 508 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_)); |
| 509 generator_.OnFecTimeout(); |
| 510 CheckPacketIsFec(packet3_, 1); |
| 511 EXPECT_FALSE(creator_->IsFecProtected()); |
| 512 |
| 513 // Subsequent data is protected under the next FEC group. Send enough data to |
| 514 // create 2 more packets: one full and one partial. |
| 515 { |
| 516 InSequence dummy; |
| 517 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 518 .WillOnce(SaveArg<0>(&packet4_)); |
| 519 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 520 .WillOnce(SaveArg<0>(&packet5_)); |
| 521 } |
| 522 size_t data_len = kDefaultMaxPacketSize + 1; |
| 523 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
| 524 MUST_FEC_PROTECT, nullptr); |
| 525 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 526 EXPECT_TRUE(consumed.fin_consumed); |
| 527 CheckPacketHasSingleStreamFrame(packet4_); |
| 528 CheckPacketHasSingleStreamFrame(packet5_); |
| 529 EXPECT_TRUE(creator_->IsFecProtected()); |
| 530 |
| 531 // Calling OnFecTimeout should cause the FEC packet to be emitted. |
| 532 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_)); |
| 533 generator_.OnFecTimeout(); |
| 534 CheckPacketIsFec(packet6_, 4); |
| 535 EXPECT_FALSE(creator_->IsFecProtected()); |
| 536 } |
| 537 |
| 538 TEST_F(QuicPacketGeneratorTest, GetFecTimeoutFiniteOnlyOnFirstPacketInGroup) { |
| 539 delegate_.SetCanWriteAnything(); |
517 creator_->set_max_packets_per_fec_group(6); | 540 creator_->set_max_packets_per_fec_group(6); |
| 541 |
| 542 // Send enough data to create 2 packets: one full and one partial. Send with |
| 543 // MUST_FEC_PROTECT flag. No FEC packet is emitted yet, but the creator FEC |
| 544 // protects all data. |
518 { | 545 { |
519 InSequence dummy; | 546 InSequence dummy; |
520 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 547 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
521 SaveArg<0>(&packet_)); | 548 SaveArg<0>(&packet_)); |
522 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 549 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
523 SaveArg<0>(&packet2_)); | 550 SaveArg<0>(&packet2_)); |
524 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
525 SaveArg<0>(&packet3_)); | |
526 } | 551 } |
527 | |
528 // Send enough data to create 2 packets: one full and one partial. Send | |
529 // with MUST_FEC_PROTECT flag. | |
530 size_t data_len = 1 * kDefaultMaxPacketSize + 100; | 552 size_t data_len = 1 * kDefaultMaxPacketSize + 100; |
531 QuicConsumedData consumed = generator_.ConsumeData( | 553 QuicConsumedData consumed = generator_.ConsumeData( |
532 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | 554 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
533 EXPECT_EQ(data_len, consumed.bytes_consumed); | 555 EXPECT_EQ(data_len, consumed.bytes_consumed); |
534 EXPECT_TRUE(consumed.fin_consumed); | 556 EXPECT_TRUE(consumed.fin_consumed); |
535 EXPECT_FALSE(generator_.HasQueuedFrames()); | 557 EXPECT_FALSE(generator_.HasQueuedFrames()); |
536 | |
537 CheckPacketHasSingleStreamFrame(packet_); | 558 CheckPacketHasSingleStreamFrame(packet_); |
538 CheckPacketHasSingleStreamFrame(packet2_); | 559 CheckPacketHasSingleStreamFrame(packet2_); |
539 CheckPacketIsFec(packet3_, 1); | 560 EXPECT_TRUE(creator_->IsFecProtected()); |
| 561 |
| 562 // GetFecTimeout returns finite timeout only for first packet in group. |
| 563 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), |
| 564 generator_.GetFecTimeout(/*sequence_number=*/1u)); |
| 565 EXPECT_EQ(QuicTime::Delta::Infinite(), |
| 566 generator_.GetFecTimeout(/*sequence_number=*/2u)); |
| 567 |
| 568 // Send more data with MAY_FEC_PROTECT. This packet should also be protected, |
| 569 // and FEC packet is not yet sent. |
| 570 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_)); |
| 571 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 572 nullptr); |
| 573 CheckPacketHasSingleStreamFrame(packet3_); |
| 574 EXPECT_TRUE(creator_->IsFecProtected()); |
| 575 |
| 576 // GetFecTimeout returns finite timeout only for first packet in group. |
| 577 EXPECT_EQ(QuicTime::Delta::Infinite(), |
| 578 generator_.GetFecTimeout(/*sequence_number=*/3u)); |
| 579 |
| 580 // Calling OnFecTimeout should cause the FEC packet to be emitted. |
| 581 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet4_)); |
| 582 generator_.OnFecTimeout(); |
| 583 CheckPacketIsFec(packet4_, /*fec_group=*/1u); |
| 584 EXPECT_FALSE(creator_->IsFecProtected()); |
| 585 |
| 586 // Subsequent data is protected under the next FEC group. Send enough data to |
| 587 // create 2 more packets: one full and one partial. |
| 588 { |
| 589 InSequence dummy; |
| 590 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 591 .WillOnce(SaveArg<0>(&packet5_)); |
| 592 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 593 .WillOnce(SaveArg<0>(&packet6_)); |
| 594 } |
| 595 data_len = kDefaultMaxPacketSize + 1u; |
| 596 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
| 597 MUST_FEC_PROTECT, nullptr); |
| 598 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 599 EXPECT_TRUE(consumed.fin_consumed); |
| 600 CheckPacketHasSingleStreamFrame(packet5_); |
| 601 CheckPacketHasSingleStreamFrame(packet6_); |
| 602 EXPECT_TRUE(creator_->IsFecProtected()); |
| 603 |
| 604 // GetFecTimeout returns finite timeout for first packet in the new group. |
| 605 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), |
| 606 generator_.GetFecTimeout(/*sequence_number=*/5u)); |
| 607 EXPECT_EQ(QuicTime::Delta::Infinite(), |
| 608 generator_.GetFecTimeout(/*sequence_number=*/6u)); |
| 609 |
| 610 // Calling OnFecTimeout should cause the FEC packet to be emitted. |
| 611 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet7_)); |
| 612 generator_.OnFecTimeout(); |
| 613 CheckPacketIsFec(packet7_, /*fec_group=*/5u); |
| 614 EXPECT_FALSE(creator_->IsFecProtected()); |
| 615 |
| 616 // Send more data with MAY_FEC_PROTECT. No FEC protection, so GetFecTimeout |
| 617 // returns infinite. |
| 618 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet8_)); |
| 619 consumed = generator_.ConsumeData(9, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 620 nullptr); |
| 621 CheckPacketHasSingleStreamFrame(packet8_); |
| 622 EXPECT_FALSE(creator_->IsFecProtected()); |
| 623 EXPECT_EQ(QuicTime::Delta::Infinite(), |
| 624 generator_.GetFecTimeout(/*sequence_number=*/8u)); |
540 } | 625 } |
541 | 626 |
542 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { | 627 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { |
543 // Set the packet size be enough for two stream frames with 0 stream offset, | 628 // Set the packet size be enough for two stream frames with 0 stream offset, |
544 // but not enough for a stream frame of 0 offset and one with non-zero offset. | 629 // but not enough for a stream frame of 0 offset and one with non-zero offset. |
545 size_t length = | 630 size_t length = |
546 NullEncrypter().GetCiphertextSize(0) + | 631 NullEncrypter().GetCiphertextSize(0) + |
547 GetPacketHeaderSize(creator_->connection_id_length(), | 632 GetPacketHeaderSize(creator_->connection_id_length(), true, |
548 true, | |
549 creator_->next_sequence_number_length(), | 633 creator_->next_sequence_number_length(), |
550 NOT_IN_FEC_GROUP) + | 634 NOT_IN_FEC_GROUP) + |
551 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger | 635 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger |
552 // than the GetMinStreamFrameSize. | 636 // than the GetMinStreamFrameSize. |
553 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + | 637 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + |
554 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; | 638 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; |
555 creator_->set_max_packet_length(length); | 639 creator_->set_max_packet_length(length); |
556 delegate_.SetCanWriteAnything(); | 640 delegate_.SetCanWriteAnything(); |
557 { | 641 { |
558 InSequence dummy; | 642 InSequence dummy; |
(...skipping 20 matching lines...) Expand all Loading... |
579 EXPECT_EQ(3u, consumed.bytes_consumed); | 663 EXPECT_EQ(3u, consumed.bytes_consumed); |
580 EXPECT_TRUE(consumed.fin_consumed); | 664 EXPECT_TRUE(consumed.fin_consumed); |
581 EXPECT_FALSE(generator_.HasQueuedFrames()); | 665 EXPECT_FALSE(generator_.HasQueuedFrames()); |
582 | 666 |
583 PacketContents contents; | 667 PacketContents contents; |
584 contents.num_stream_frames = 1; | 668 contents.num_stream_frames = 1; |
585 CheckPacketContains(contents, packet_); | 669 CheckPacketContains(contents, packet_); |
586 CheckPacketContains(contents, packet2_); | 670 CheckPacketContains(contents, packet2_); |
587 } | 671 } |
588 | 672 |
| 673 TEST_F(QuicPacketGeneratorTest, NoFecPacketSentWhenBatchEnds) { |
| 674 delegate_.SetCanWriteAnything(); |
| 675 creator_->set_max_packets_per_fec_group(6); |
| 676 |
| 677 generator_.StartBatchOperations(); |
| 678 |
| 679 generator_.ConsumeData(3, MakeIOVector("foo"), 2, true, MUST_FEC_PROTECT, |
| 680 nullptr); |
| 681 QuicConsumedData consumed = generator_.ConsumeData( |
| 682 5, MakeIOVector("quux"), 7, false, MUST_FEC_PROTECT, nullptr); |
| 683 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 684 EXPECT_FALSE(consumed.fin_consumed); |
| 685 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 686 |
| 687 // Now both frames will be flushed out, but FEC packet is not yet sent. |
| 688 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 689 generator_.FinishBatchOperations(); |
| 690 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 691 |
| 692 PacketContents contents; |
| 693 contents.num_stream_frames = 2u; |
| 694 contents.fec_group = 1u; |
| 695 CheckPacketContains(contents, packet_); |
| 696 |
| 697 // Forcing FEC timeout causes FEC packet to be emitted. |
| 698 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_)); |
| 699 generator_.OnFecTimeout(); |
| 700 CheckPacketIsFec(packet2_, /*fec_group=*/1u); |
| 701 } |
| 702 |
589 TEST_F(QuicPacketGeneratorTest, FecTimeoutOnRttChange) { | 703 TEST_F(QuicPacketGeneratorTest, FecTimeoutOnRttChange) { |
590 EXPECT_EQ(QuicTime::Delta::Zero(), generator_.fec_timeout()); | 704 EXPECT_EQ(QuicTime::Delta::Zero(), |
| 705 QuicPacketGeneratorPeer::GetFecTimeout(&generator_)); |
591 generator_.OnRttChange(QuicTime::Delta::FromMilliseconds(300)); | 706 generator_.OnRttChange(QuicTime::Delta::FromMilliseconds(300)); |
592 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), generator_.fec_timeout()); | 707 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), |
| 708 QuicPacketGeneratorPeer::GetFecTimeout(&generator_)); |
593 } | 709 } |
594 | 710 |
595 TEST_F(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) { | 711 TEST_F(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) { |
596 delegate_.SetCanWriteAnything(); | 712 delegate_.SetCanWriteAnything(); |
597 creator_->set_max_packets_per_fec_group(50); | 713 creator_->set_max_packets_per_fec_group(50); |
598 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | 714 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
599 EXPECT_FALSE(creator_->IsFecGroupOpen()); | 715 EXPECT_FALSE(creator_->IsFecGroupOpen()); |
600 | 716 |
601 // On reduced cwnd. | 717 // On reduced cwnd. |
602 generator_.OnCongestionWindowChange(7); | 718 generator_.OnCongestionWindowChange(7); |
603 EXPECT_EQ(3u, creator_->max_packets_per_fec_group()); | 719 EXPECT_EQ(3u, creator_->max_packets_per_fec_group()); |
604 | 720 |
605 // On increased cwnd. | 721 // On increased cwnd. |
606 generator_.OnCongestionWindowChange(100); | 722 generator_.OnCongestionWindowChange(100); |
607 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | 723 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
608 | 724 |
609 // On collapsed cwnd. | 725 // On collapsed cwnd. |
610 generator_.OnCongestionWindowChange(1); | 726 generator_.OnCongestionWindowChange(1); |
611 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | 727 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); |
612 } | 728 } |
613 | 729 |
614 TEST_F(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) { | 730 TEST_F(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) { |
615 delegate_.SetCanWriteAnything(); | 731 delegate_.SetCanWriteAnything(); |
616 // TODO(jri): This starting of batch mode should not be required when | |
617 // FEC sending is separated from batching operations. | |
618 generator_.StartBatchOperations(); | 732 generator_.StartBatchOperations(); |
619 creator_->set_max_packets_per_fec_group(50); | 733 creator_->set_max_packets_per_fec_group(50); |
620 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | 734 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
621 EXPECT_FALSE(creator_->IsFecGroupOpen()); | 735 EXPECT_FALSE(creator_->IsFecGroupOpen()); |
622 | 736 |
623 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. | 737 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. 3 packets |
624 // 3 packets are sent, one is queued in the creator. | 738 // are sent, one is queued in the creator. |
625 { | 739 { |
626 InSequence dummy; | 740 InSequence dummy; |
627 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 741 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
628 SaveArg<0>(&packet_)); | 742 SaveArg<0>(&packet_)); |
629 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 743 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
630 SaveArg<0>(&packet2_)); | 744 SaveArg<0>(&packet2_)); |
631 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 745 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
632 SaveArg<0>(&packet3_)); | 746 SaveArg<0>(&packet3_)); |
633 } | 747 } |
634 size_t data_len = 3 * kDefaultMaxPacketSize + 1; | 748 size_t data_len = 3 * kDefaultMaxPacketSize + 1; |
635 QuicConsumedData consumed = generator_.ConsumeData( | 749 QuicConsumedData consumed = generator_.ConsumeData( |
636 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | 750 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
637 EXPECT_EQ(data_len, consumed.bytes_consumed); | 751 EXPECT_EQ(data_len, consumed.bytes_consumed); |
638 EXPECT_TRUE(creator_->IsFecGroupOpen()); | 752 EXPECT_TRUE(creator_->IsFecGroupOpen()); |
639 | 753 |
640 // Change FEC groupsize. | 754 // Change FEC groupsize. |
641 generator_.OnCongestionWindowChange(2); | 755 generator_.OnCongestionWindowChange(2); |
642 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | 756 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); |
643 | 757 |
644 // Send enough data to trigger one unprotected data packet, | 758 // Send enough data to trigger one unprotected data packet, causing the FEC |
645 // causing the FEC packet to also be sent. | 759 // packet to also be sent. |
646 { | 760 { |
647 InSequence dummy; | 761 InSequence dummy; |
648 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 762 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
649 SaveArg<0>(&packet4_)); | 763 SaveArg<0>(&packet4_)); |
650 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 764 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
651 SaveArg<0>(&packet5_)); | 765 SaveArg<0>(&packet5_)); |
652 } | 766 } |
653 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, | 767 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, |
654 true, MAY_FEC_PROTECT, nullptr); | 768 true, MAY_FEC_PROTECT, nullptr); |
655 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); | 769 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); |
(...skipping 24 matching lines...) Expand all Loading... |
680 { | 794 { |
681 InSequence dummy; | 795 InSequence dummy; |
682 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 796 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
683 SaveArg<0>(&packet2_)); | 797 SaveArg<0>(&packet2_)); |
684 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 798 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
685 SaveArg<0>(&packet3_)); | 799 SaveArg<0>(&packet3_)); |
686 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 800 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
687 SaveArg<0>(&packet4_)); | 801 SaveArg<0>(&packet4_)); |
688 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 802 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
689 SaveArg<0>(&packet5_)); | 803 SaveArg<0>(&packet5_)); |
690 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
691 SaveArg<0>(&packet6_)); | |
692 } | 804 } |
693 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. | 805 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. |
694 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 806 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
695 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | 807 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
696 MUST_FEC_PROTECT, nullptr); | 808 MUST_FEC_PROTECT, nullptr); |
697 EXPECT_EQ(data_len, consumed.bytes_consumed); | 809 EXPECT_EQ(data_len, consumed.bytes_consumed); |
698 EXPECT_FALSE(generator_.HasQueuedFrames()); | 810 EXPECT_FALSE(generator_.HasQueuedFrames()); |
699 | 811 |
700 // Verify that two FEC packets were sent. | 812 // Verify that packets sent were 3 data and 1 FEC. |
701 CheckPacketHasSingleStreamFrame(packet2_); | 813 CheckPacketHasSingleStreamFrame(packet2_); |
702 CheckPacketHasSingleStreamFrame(packet3_); | 814 CheckPacketHasSingleStreamFrame(packet3_); |
703 CheckPacketIsFec(packet4_, /*fec_group=*/2u); | 815 CheckPacketIsFec(packet4_, /*fec_group=*/2u); |
704 CheckPacketHasSingleStreamFrame(packet5_); | 816 CheckPacketHasSingleStreamFrame(packet5_); |
705 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. | 817 |
| 818 // Calling OnFecTimeout should emit the pending FEC packet. |
| 819 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_)); |
| 820 generator_.OnFecTimeout(); |
| 821 CheckPacketIsFec(packet6_, /*fec_group=*/5u); |
706 | 822 |
707 // Send one unprotected data packet. | 823 // Send one unprotected data packet. |
708 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 824 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
709 SaveArg<0>(&packet7_)); | 825 SaveArg<0>(&packet7_)); |
710 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT, | 826 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
711 nullptr); | 827 nullptr); |
712 EXPECT_EQ(1u, consumed.bytes_consumed); | 828 EXPECT_EQ(1u, consumed.bytes_consumed); |
713 EXPECT_FALSE(generator_.HasQueuedFrames()); | 829 EXPECT_FALSE(generator_.HasQueuedFrames()); |
714 EXPECT_FALSE(creator_->IsFecProtected()); | 830 EXPECT_FALSE(creator_->IsFecProtected()); |
715 // Verify that one unprotected data packet was sent. | 831 // Verify that one unprotected data packet was sent. |
(...skipping 27 matching lines...) Expand all Loading... |
743 EXPECT_TRUE(creator_->IsFecProtected()); | 859 EXPECT_TRUE(creator_->IsFecProtected()); |
744 EXPECT_TRUE(creator_->HasPendingFrames()); | 860 EXPECT_TRUE(creator_->HasPendingFrames()); |
745 } | 861 } |
746 | 862 |
747 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { | 863 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { |
748 // Enable FEC. | 864 // Enable FEC. |
749 creator_->set_max_packets_per_fec_group(2); | 865 creator_->set_max_packets_per_fec_group(2); |
750 | 866 |
751 // Queue control frames in generator. | 867 // Queue control frames in generator. |
752 delegate_.SetCanNotWrite(); | 868 delegate_.SetCanNotWrite(); |
753 generator_.SetShouldSendAck(true, true); | 869 generator_.SetShouldSendAck(true); |
754 delegate_.SetCanWriteAnything(); | 870 delegate_.SetCanWriteAnything(); |
755 generator_.StartBatchOperations(); | 871 generator_.StartBatchOperations(); |
756 | 872 |
757 // Set up frames to write into the creator when control frames are written. | 873 // Set up frames to write into the creator when control frames are written. |
758 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 874 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
759 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | |
760 Return(CreateFeedbackFrame())); | |
761 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( | 875 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( |
762 Return(CreateStopWaitingFrame())); | 876 Return(CreateStopWaitingFrame())); |
763 | 877 |
764 // Generator should have queued control frames, and creator should be empty. | 878 // Generator should have queued control frames, and creator should be empty. |
765 EXPECT_TRUE(generator_.HasQueuedFrames()); | 879 EXPECT_TRUE(generator_.HasQueuedFrames()); |
766 EXPECT_FALSE(creator_->HasPendingFrames()); | 880 EXPECT_FALSE(creator_->HasPendingFrames()); |
767 EXPECT_FALSE(creator_->IsFecProtected()); | 881 EXPECT_FALSE(creator_->IsFecProtected()); |
768 | 882 |
769 // Queue protected data for sending. Should cause queued frames to be flushed. | 883 // Queue protected data for sending. Should cause queued frames to be flushed. |
770 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 884 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
771 SaveArg<0>(&packet_)); | 885 SaveArg<0>(&packet_)); |
772 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 886 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
773 MUST_FEC_PROTECT, nullptr); | 887 MUST_FEC_PROTECT, nullptr); |
774 EXPECT_EQ(1u, consumed.bytes_consumed); | 888 EXPECT_EQ(1u, consumed.bytes_consumed); |
775 PacketContents contents; | 889 PacketContents contents; |
776 contents.num_ack_frames = 1; | 890 contents.num_ack_frames = 1; |
777 contents.num_feedback_frames = 1; | |
778 contents.num_stop_waiting_frames = 1; | 891 contents.num_stop_waiting_frames = 1; |
779 CheckPacketContains(contents, packet_); | 892 CheckPacketContains(contents, packet_); |
780 | 893 |
781 // FEC protection should be on in creator. | 894 // FEC protection should be on in creator. |
782 EXPECT_TRUE(creator_->IsFecProtected()); | 895 EXPECT_TRUE(creator_->IsFecProtected()); |
783 } | 896 } |
784 | 897 |
785 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { | 898 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { |
786 delegate_.SetCanWriteAnything(); | 899 delegate_.SetCanWriteAnything(); |
787 | 900 |
(...skipping 25 matching lines...) Expand all Loading... |
813 EXPECT_TRUE(creator_->IsFecProtected()); | 926 EXPECT_TRUE(creator_->IsFecProtected()); |
814 } | 927 } |
815 | 928 |
816 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { | 929 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { |
817 delegate_.SetCanWriteAnything(); | 930 delegate_.SetCanWriteAnything(); |
818 | 931 |
819 // Enable FEC. | 932 // Enable FEC. |
820 creator_->set_max_packets_per_fec_group(2); | 933 creator_->set_max_packets_per_fec_group(2); |
821 EXPECT_FALSE(creator_->IsFecProtected()); | 934 EXPECT_FALSE(creator_->IsFecProtected()); |
822 | 935 |
823 generator_.StartBatchOperations(); | |
824 // Send first packet, FEC protected. | 936 // Send first packet, FEC protected. |
825 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 937 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
826 // Write enough data to cause a packet to be emitted. | 938 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
827 size_t data_len = kDefaultMaxPacketSize; | 939 MUST_FEC_PROTECT, nullptr); |
828 QuicConsumedData consumed = generator_.ConsumeData( | 940 EXPECT_EQ(1u, consumed.bytes_consumed); |
829 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
830 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
831 PacketContents contents; | 941 PacketContents contents; |
832 contents.num_stream_frames = 1u; | 942 contents.num_stream_frames = 1u; |
833 contents.fec_group = 1u; | 943 contents.fec_group = 1u; |
834 CheckPacketContains(contents, packet_); | 944 CheckPacketContains(contents, packet_); |
835 | 945 |
836 // FEC should still be on in creator. | 946 // FEC should still be on in creator. |
837 EXPECT_TRUE(creator_->IsFecProtected()); | 947 EXPECT_TRUE(creator_->IsFecProtected()); |
838 | 948 |
839 // Send enough unprotected data to cause second packet to be sent, which gets | 949 // Send unprotected data to cause second packet to be sent, which gets |
840 // protected because it happens to fall within an open FEC group. Data packet | 950 // protected because it happens to fall within an open FEC group. Data packet |
841 // will be followed by FEC packet. | 951 // will be followed by FEC packet. |
842 { | 952 { |
843 InSequence dummy; | 953 InSequence dummy; |
844 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 954 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
845 SaveArg<0>(&packet2_)); | 955 SaveArg<0>(&packet2_)); |
846 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 956 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
847 SaveArg<0>(&packet3_)); | 957 SaveArg<0>(&packet3_)); |
848 } | 958 } |
849 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 959 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
850 MAY_FEC_PROTECT, nullptr); | 960 nullptr); |
851 EXPECT_EQ(data_len, consumed.bytes_consumed); | 961 EXPECT_EQ(1u, consumed.bytes_consumed); |
852 contents.num_stream_frames = 2u; | 962 contents.num_stream_frames = 1u; |
853 CheckPacketContains(contents, packet2_); | 963 CheckPacketContains(contents, packet2_); |
854 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 964 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
855 | 965 |
856 // FEC protection should be off in creator. | 966 // FEC protection should be off in creator. |
857 EXPECT_FALSE(creator_->IsFecProtected()); | 967 EXPECT_FALSE(creator_->IsFecProtected()); |
858 } | 968 } |
859 | 969 |
860 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { | 970 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { |
861 delegate_.SetCanWriteAnything(); | 971 delegate_.SetCanWriteAnything(); |
862 generator_.StartBatchOperations(); | 972 generator_.StartBatchOperations(); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
900 CheckPacketContains(contents, packet2_); | 1010 CheckPacketContains(contents, packet2_); |
901 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 1011 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
902 | 1012 |
903 // FEC protection should remain on in creator. | 1013 // FEC protection should remain on in creator. |
904 EXPECT_TRUE(creator_->IsFecProtected()); | 1014 EXPECT_TRUE(creator_->IsFecProtected()); |
905 } | 1015 } |
906 | 1016 |
907 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | 1017 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { |
908 delegate_.SetCanNotWrite(); | 1018 delegate_.SetCanNotWrite(); |
909 | 1019 |
910 generator_.SetShouldSendAck(true, false); | 1020 generator_.SetShouldSendAck(false); |
911 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 1021 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
912 EXPECT_TRUE(generator_.HasQueuedFrames()); | 1022 EXPECT_TRUE(generator_.HasQueuedFrames()); |
913 | 1023 |
914 delegate_.SetCanWriteAnything(); | 1024 delegate_.SetCanWriteAnything(); |
915 | 1025 |
916 generator_.StartBatchOperations(); | 1026 generator_.StartBatchOperations(); |
917 | 1027 |
918 // When the first write operation is invoked, the ack and feedback | 1028 // When the first write operation is invoked, the ack frame will be returned. |
919 // frames will be returned. | |
920 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 1029 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
921 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | |
922 Return(CreateFeedbackFrame())); | |
923 | 1030 |
924 // Send some data and a control frame | 1031 // Send some data and a control frame |
925 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, | 1032 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, |
926 nullptr); | 1033 nullptr); |
927 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 1034 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
928 | 1035 |
929 // All five frames will be flushed out in a single packet. | 1036 // All five frames will be flushed out in a single packet. |
930 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 1037 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
931 generator_.FinishBatchOperations(); | 1038 generator_.FinishBatchOperations(); |
932 EXPECT_FALSE(generator_.HasQueuedFrames()); | 1039 EXPECT_FALSE(generator_.HasQueuedFrames()); |
933 | 1040 |
934 PacketContents contents; | 1041 PacketContents contents; |
935 contents.num_ack_frames = 1; | 1042 contents.num_ack_frames = 1; |
936 contents.num_goaway_frames = 1; | 1043 contents.num_goaway_frames = 1; |
937 contents.num_feedback_frames = 1; | |
938 contents.num_rst_stream_frames = 1; | 1044 contents.num_rst_stream_frames = 1; |
939 contents.num_stream_frames = 1; | 1045 contents.num_stream_frames = 1; |
940 CheckPacketContains(contents, packet_); | 1046 CheckPacketContains(contents, packet_); |
941 } | 1047 } |
942 | 1048 |
943 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { | 1049 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { |
944 delegate_.SetCanNotWrite(); | 1050 delegate_.SetCanNotWrite(); |
945 | 1051 |
946 generator_.SetShouldSendAck(true, false); | 1052 generator_.SetShouldSendAck(false); |
947 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 1053 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
948 EXPECT_TRUE(generator_.HasQueuedFrames()); | 1054 EXPECT_TRUE(generator_.HasQueuedFrames()); |
949 | 1055 |
950 delegate_.SetCanWriteAnything(); | 1056 delegate_.SetCanWriteAnything(); |
951 | 1057 |
952 generator_.StartBatchOperations(); | 1058 generator_.StartBatchOperations(); |
953 | 1059 |
954 // When the first write operation is invoked, the ack and feedback | 1060 // When the first write operation is invoked, the ack frame will be returned. |
955 // frames will be returned. | |
956 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 1061 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
957 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | |
958 Return(CreateFeedbackFrame())); | |
959 | 1062 |
960 { | 1063 { |
961 InSequence dummy; | 1064 InSequence dummy; |
962 // All five frames will be flushed out in a single packet | 1065 // All five frames will be flushed out in a single packet |
963 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 1066 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
964 SaveArg<0>(&packet_)); | 1067 SaveArg<0>(&packet_)); |
965 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 1068 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
966 SaveArg<0>(&packet2_)); | 1069 SaveArg<0>(&packet2_)); |
967 } | 1070 } |
968 | 1071 |
969 // Send enough data to exceed one packet | 1072 // Send enough data to exceed one packet |
970 size_t data_len = kDefaultMaxPacketSize + 100; | 1073 size_t data_len = kDefaultMaxPacketSize + 100; |
971 QuicConsumedData consumed = generator_.ConsumeData( | 1074 QuicConsumedData consumed = generator_.ConsumeData( |
972 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr); | 1075 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr); |
973 EXPECT_EQ(data_len, consumed.bytes_consumed); | 1076 EXPECT_EQ(data_len, consumed.bytes_consumed); |
974 EXPECT_TRUE(consumed.fin_consumed); | 1077 EXPECT_TRUE(consumed.fin_consumed); |
975 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 1078 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
976 | 1079 |
977 generator_.FinishBatchOperations(); | 1080 generator_.FinishBatchOperations(); |
978 EXPECT_FALSE(generator_.HasQueuedFrames()); | 1081 EXPECT_FALSE(generator_.HasQueuedFrames()); |
979 | 1082 |
980 // The first packet should have the queued data and part of the stream data. | 1083 // The first packet should have the queued data and part of the stream data. |
981 PacketContents contents; | 1084 PacketContents contents; |
982 contents.num_ack_frames = 1; | 1085 contents.num_ack_frames = 1; |
983 contents.num_feedback_frames = 1; | |
984 contents.num_rst_stream_frames = 1; | 1086 contents.num_rst_stream_frames = 1; |
985 contents.num_stream_frames = 1; | 1087 contents.num_stream_frames = 1; |
986 CheckPacketContains(contents, packet_); | 1088 CheckPacketContains(contents, packet_); |
987 | 1089 |
988 // The second should have the remainder of the stream data. | 1090 // The second should have the remainder of the stream data. |
989 PacketContents contents2; | 1091 PacketContents contents2; |
990 contents2.num_goaway_frames = 1; | 1092 contents2.num_goaway_frames = 1; |
991 contents2.num_stream_frames = 1; | 1093 contents2.num_stream_frames = 1; |
992 CheckPacketContains(contents2, packet2_); | 1094 CheckPacketContains(contents2, packet2_); |
993 } | 1095 } |
(...skipping 16 matching lines...) Expand all Loading... |
1010 generator_.SetConnectionIdLength(7); | 1112 generator_.SetConnectionIdLength(7); |
1011 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 1113 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1012 generator_.SetConnectionIdLength(8); | 1114 generator_.SetConnectionIdLength(8); |
1013 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 1115 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1014 generator_.SetConnectionIdLength(9); | 1116 generator_.SetConnectionIdLength(9); |
1015 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 1117 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1016 } | 1118 } |
1017 | 1119 |
1018 } // namespace test | 1120 } // namespace test |
1019 } // namespace net | 1121 } // namespace net |
OLD | NEW |