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 16 matching lines...) Expand all Loading... |
27 using std::vector; | 27 using std::vector; |
28 using testing::InSequence; | 28 using testing::InSequence; |
29 using testing::Return; | 29 using testing::Return; |
30 using testing::StrictMock; | 30 using testing::StrictMock; |
31 using testing::_; | 31 using testing::_; |
32 | 32 |
33 namespace net { | 33 namespace net { |
34 namespace test { | 34 namespace test { |
35 namespace { | 35 namespace { |
36 | 36 |
37 const int64_t kMinFecTimeoutMs = 5u; | |
38 | |
39 static const FecSendPolicy kFecSendPolicyList[] = { | |
40 FEC_ANY_TRIGGER, FEC_ALARM_TRIGGER, | |
41 }; | |
42 | |
43 class MockDelegate : public QuicPacketGenerator::DelegateInterface { | 37 class MockDelegate : public QuicPacketGenerator::DelegateInterface { |
44 public: | 38 public: |
45 MockDelegate() {} | 39 MockDelegate() {} |
46 ~MockDelegate() override {} | 40 ~MockDelegate() override {} |
47 | 41 |
48 MOCK_METHOD2(ShouldGeneratePacket, | 42 MOCK_METHOD2(ShouldGeneratePacket, |
49 bool(HasRetransmittableData retransmittable, | 43 bool(HasRetransmittableData retransmittable, |
50 IsHandshake handshake)); | 44 IsHandshake handshake)); |
51 MOCK_METHOD1(PopulateAckFrame, void(QuicAckFrame*)); | 45 MOCK_METHOD1(PopulateAckFrame, void(QuicAckFrame*)); |
52 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*)); | 46 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*)); |
53 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); | 47 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); |
54 MOCK_METHOD2(OnUnrecoverableError, | 48 MOCK_METHOD2(OnUnrecoverableError, |
55 void(QuicErrorCode, ConnectionCloseSource)); | 49 void(QuicErrorCode, ConnectionCloseSource)); |
56 MOCK_METHOD0(OnResetFecGroup, void()); | |
57 | 50 |
58 void SetCanWriteAnything() { | 51 void SetCanWriteAnything() { |
59 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true)); | 52 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true)); |
60 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _)) | 53 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _)) |
61 .WillRepeatedly(Return(true)); | 54 .WillRepeatedly(Return(true)); |
62 } | 55 } |
63 | 56 |
64 void SetCanNotWrite() { | 57 void SetCanNotWrite() { |
65 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)) | 58 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)) |
66 .WillRepeatedly(Return(false)); | 59 .WillRepeatedly(Return(false)); |
(...skipping 18 matching lines...) Expand all Loading... |
85 // contains the expected frames. | 78 // contains the expected frames. |
86 struct PacketContents { | 79 struct PacketContents { |
87 PacketContents() | 80 PacketContents() |
88 : num_ack_frames(0), | 81 : num_ack_frames(0), |
89 num_connection_close_frames(0), | 82 num_connection_close_frames(0), |
90 num_goaway_frames(0), | 83 num_goaway_frames(0), |
91 num_rst_stream_frames(0), | 84 num_rst_stream_frames(0), |
92 num_stop_waiting_frames(0), | 85 num_stop_waiting_frames(0), |
93 num_stream_frames(0), | 86 num_stream_frames(0), |
94 num_ping_frames(0), | 87 num_ping_frames(0), |
95 num_mtu_discovery_frames(0), | 88 num_mtu_discovery_frames(0) {} |
96 fec_group(0) {} | |
97 | 89 |
98 size_t num_ack_frames; | 90 size_t num_ack_frames; |
99 size_t num_connection_close_frames; | 91 size_t num_connection_close_frames; |
100 size_t num_goaway_frames; | 92 size_t num_goaway_frames; |
101 size_t num_rst_stream_frames; | 93 size_t num_rst_stream_frames; |
102 size_t num_stop_waiting_frames; | 94 size_t num_stop_waiting_frames; |
103 size_t num_stream_frames; | 95 size_t num_stream_frames; |
104 size_t num_ping_frames; | 96 size_t num_ping_frames; |
105 size_t num_mtu_discovery_frames; | 97 size_t num_mtu_discovery_frames; |
106 | |
107 QuicFecGroupNumber fec_group; | |
108 }; | 98 }; |
109 | 99 |
110 } // namespace | 100 } // namespace |
111 | 101 |
112 class QuicPacketGeneratorTest : public ::testing::TestWithParam<FecSendPolicy> { | 102 class QuicPacketGeneratorTest : public ::testing::Test { |
113 public: | 103 public: |
114 QuicPacketGeneratorTest() | 104 QuicPacketGeneratorTest() |
115 : framer_(QuicSupportedVersions(), | 105 : framer_(QuicSupportedVersions(), |
116 QuicTime::Zero(), | 106 QuicTime::Zero(), |
117 Perspective::IS_CLIENT), | 107 Perspective::IS_CLIENT), |
118 generator_(42, &framer_, &random_, &buffer_allocator_, &delegate_), | 108 generator_(42, &framer_, &random_, &buffer_allocator_, &delegate_), |
119 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)) { | 109 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)) { |
120 generator_.set_fec_send_policy(GetParam()); | |
121 // TODO(ianswett): Fix this test so it uses a non-null encrypter. | 110 // TODO(ianswett): Fix this test so it uses a non-null encrypter. |
122 FLAGS_quic_never_write_unencrypted_data = false; | 111 FLAGS_quic_never_write_unencrypted_data = false; |
123 FLAGS_quic_no_unencrypted_fec = false; | 112 FLAGS_quic_no_unencrypted_fec = false; |
124 } | 113 } |
125 | 114 |
126 ~QuicPacketGeneratorTest() override { | 115 ~QuicPacketGeneratorTest() override { |
127 for (SerializedPacket& packet : packets_) { | 116 for (SerializedPacket& packet : packets_) { |
128 delete[] packet.encrypted_buffer; | 117 delete[] packet.encrypted_buffer; |
129 QuicUtils::ClearSerializedPacket(&packet); | 118 QuicUtils::ClearSerializedPacket(&packet); |
130 } | 119 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 EXPECT_EQ(contents.num_connection_close_frames, | 163 EXPECT_EQ(contents.num_connection_close_frames, |
175 simple_framer_.connection_close_frames().size()); | 164 simple_framer_.connection_close_frames().size()); |
176 EXPECT_EQ(contents.num_goaway_frames, | 165 EXPECT_EQ(contents.num_goaway_frames, |
177 simple_framer_.goaway_frames().size()); | 166 simple_framer_.goaway_frames().size()); |
178 EXPECT_EQ(contents.num_rst_stream_frames, | 167 EXPECT_EQ(contents.num_rst_stream_frames, |
179 simple_framer_.rst_stream_frames().size()); | 168 simple_framer_.rst_stream_frames().size()); |
180 EXPECT_EQ(contents.num_stream_frames, | 169 EXPECT_EQ(contents.num_stream_frames, |
181 simple_framer_.stream_frames().size()); | 170 simple_framer_.stream_frames().size()); |
182 EXPECT_EQ(contents.num_stop_waiting_frames, | 171 EXPECT_EQ(contents.num_stop_waiting_frames, |
183 simple_framer_.stop_waiting_frames().size()); | 172 simple_framer_.stop_waiting_frames().size()); |
184 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group); | |
185 | 173 |
186 // From the receiver's perspective, MTU discovery frames are ping frames. | 174 // From the receiver's perspective, MTU discovery frames are ping frames. |
187 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames, | 175 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames, |
188 simple_framer_.ping_frames().size()); | 176 simple_framer_.ping_frames().size()); |
189 } | 177 } |
190 | 178 |
191 void CheckPacketHasSingleStreamFrame(size_t packet_index) { | 179 void CheckPacketHasSingleStreamFrame(size_t packet_index) { |
192 ASSERT_GT(packets_.size(), packet_index); | 180 ASSERT_GT(packets_.size(), packet_index); |
193 const SerializedPacket& packet = packets_[packet_index]; | 181 const SerializedPacket& packet = packets_[packet_index]; |
194 ASSERT_FALSE(packet.retransmittable_frames.empty()); | 182 ASSERT_FALSE(packet.retransmittable_frames.empty()); |
195 EXPECT_EQ(1u, packet.retransmittable_frames.size()); | 183 EXPECT_EQ(1u, packet.retransmittable_frames.size()); |
196 ASSERT_TRUE(packet.encrypted_buffer != nullptr); | 184 ASSERT_TRUE(packet.encrypted_buffer != nullptr); |
197 ASSERT_TRUE(simple_framer_.ProcessPacket( | 185 ASSERT_TRUE(simple_framer_.ProcessPacket( |
198 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length))); | 186 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length))); |
199 EXPECT_EQ(1u, simple_framer_.num_frames()); | 187 EXPECT_EQ(1u, simple_framer_.num_frames()); |
200 EXPECT_EQ(1u, simple_framer_.stream_frames().size()); | 188 EXPECT_EQ(1u, simple_framer_.stream_frames().size()); |
201 } | 189 } |
202 | 190 |
203 void CheckAllPacketsHaveSingleStreamFrame() { | 191 void CheckAllPacketsHaveSingleStreamFrame() { |
204 for (size_t i = 0; i < packets_.size(); i++) { | 192 for (size_t i = 0; i < packets_.size(); i++) { |
205 CheckPacketHasSingleStreamFrame(i); | 193 CheckPacketHasSingleStreamFrame(i); |
206 } | 194 } |
207 } | 195 } |
208 | 196 |
209 void CheckPacketIsFec(size_t packet_index, QuicPacketNumber fec_group) { | |
210 ASSERT_GT(packets_.size(), packet_index); | |
211 const SerializedPacket& packet = packets_[packet_index]; | |
212 ASSERT_TRUE(packet.retransmittable_frames.empty()); | |
213 ASSERT_TRUE(packet.encrypted_buffer != nullptr); | |
214 ASSERT_TRUE(simple_framer_.ProcessPacket( | |
215 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length))); | |
216 EXPECT_TRUE(simple_framer_.header().fec_flag); | |
217 } | |
218 | |
219 QuicIOVector CreateData(size_t len) { | 197 QuicIOVector CreateData(size_t len) { |
220 data_array_.reset(new char[len]); | 198 data_array_.reset(new char[len]); |
221 memset(data_array_.get(), '?', len); | 199 memset(data_array_.get(), '?', len); |
222 iov_.iov_base = data_array_.get(); | 200 iov_.iov_base = data_array_.get(); |
223 iov_.iov_len = len; | 201 iov_.iov_len = len; |
224 return QuicIOVector(&iov_, 1, len); | 202 return QuicIOVector(&iov_, 1, len); |
225 } | 203 } |
226 | 204 |
227 QuicIOVector MakeIOVector(StringPiece s) { | 205 QuicIOVector MakeIOVector(StringPiece s) { |
228 return ::net::MakeIOVector(s, &iov_); | 206 return ::net::MakeIOVector(s, &iov_); |
(...skipping 11 matching lines...) Expand all Loading... |
240 private: | 218 private: |
241 scoped_ptr<char[]> data_array_; | 219 scoped_ptr<char[]> data_array_; |
242 struct iovec iov_; | 220 struct iovec iov_; |
243 }; | 221 }; |
244 | 222 |
245 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate { | 223 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate { |
246 public: | 224 public: |
247 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); | 225 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); |
248 }; | 226 }; |
249 | 227 |
250 // Run all end to end tests with all supported FEC send polocies. | 228 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { |
251 INSTANTIATE_TEST_CASE_P(FecSendPolicy, | |
252 QuicPacketGeneratorTest, | |
253 ::testing::ValuesIn(kFecSendPolicyList)); | |
254 | |
255 TEST_P(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { | |
256 delegate_.SetCanNotWrite(); | 229 delegate_.SetCanNotWrite(); |
257 | 230 |
258 generator_.SetShouldSendAck(false); | 231 generator_.SetShouldSendAck(false); |
259 EXPECT_TRUE(generator_.HasQueuedFrames()); | 232 EXPECT_TRUE(generator_.HasQueuedFrames()); |
260 } | 233 } |
261 | 234 |
262 TEST_P(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | 235 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { |
263 StrictMock<MockDebugDelegate> debug_delegate; | 236 StrictMock<MockDebugDelegate> debug_delegate; |
264 | 237 |
265 generator_.set_debug_delegate(&debug_delegate); | 238 generator_.set_debug_delegate(&debug_delegate); |
266 delegate_.SetCanWriteOnlyNonRetransmittable(); | 239 delegate_.SetCanWriteOnlyNonRetransmittable(); |
267 generator_.StartBatchOperations(); | 240 generator_.StartBatchOperations(); |
268 | 241 |
269 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 242 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
270 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | 243 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
271 | 244 |
272 generator_.SetShouldSendAck(false); | 245 generator_.SetShouldSendAck(false); |
273 EXPECT_TRUE(generator_.HasQueuedFrames()); | 246 EXPECT_TRUE(generator_.HasQueuedFrames()); |
274 } | 247 } |
275 | 248 |
276 TEST_P(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 249 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
277 delegate_.SetCanWriteOnlyNonRetransmittable(); | 250 delegate_.SetCanWriteOnlyNonRetransmittable(); |
278 | 251 |
279 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 252 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
280 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 253 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
281 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 254 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
282 | 255 |
283 generator_.SetShouldSendAck(false); | 256 generator_.SetShouldSendAck(false); |
284 EXPECT_FALSE(generator_.HasQueuedFrames()); | 257 EXPECT_FALSE(generator_.HasQueuedFrames()); |
285 | 258 |
286 PacketContents contents; | 259 PacketContents contents; |
287 contents.num_ack_frames = 1; | 260 contents.num_ack_frames = 1; |
288 CheckPacketContains(contents, 0); | 261 CheckPacketContains(contents, 0); |
289 } | 262 } |
290 | 263 |
291 TEST_P(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { | 264 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { |
292 // Make sure that calling SetShouldSendAck multiple times does not result in a | 265 // Make sure that calling SetShouldSendAck multiple times does not result in a |
293 // crash. Previously this would result in multiple QuicFrames queued in the | 266 // crash. Previously this would result in multiple QuicFrames queued in the |
294 // packet generator, with all but the last with internal pointers to freed | 267 // packet generator, with all but the last with internal pointers to freed |
295 // memory. | 268 // memory. |
296 delegate_.SetCanWriteAnything(); | 269 delegate_.SetCanWriteAnything(); |
297 | 270 |
298 // Only one AckFrame should be created. | 271 // Only one AckFrame should be created. |
299 EXPECT_CALL(delegate_, PopulateAckFrame(_)).Times(1); | 272 EXPECT_CALL(delegate_, PopulateAckFrame(_)).Times(1); |
300 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 273 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
301 .Times(1) | 274 .Times(1) |
302 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 275 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
303 | 276 |
304 generator_.StartBatchOperations(); | 277 generator_.StartBatchOperations(); |
305 generator_.SetShouldSendAck(false); | 278 generator_.SetShouldSendAck(false); |
306 generator_.SetShouldSendAck(false); | 279 generator_.SetShouldSendAck(false); |
307 generator_.FinishBatchOperations(); | 280 generator_.FinishBatchOperations(); |
308 } | 281 } |
309 | 282 |
310 TEST_P(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { | 283 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { |
311 delegate_.SetCanNotWrite(); | 284 delegate_.SetCanNotWrite(); |
312 | 285 |
313 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 286 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
314 EXPECT_TRUE(generator_.HasQueuedFrames()); | 287 EXPECT_TRUE(generator_.HasQueuedFrames()); |
315 } | 288 } |
316 | 289 |
317 TEST_P(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { | 290 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { |
318 delegate_.SetCanWriteOnlyNonRetransmittable(); | 291 delegate_.SetCanWriteOnlyNonRetransmittable(); |
319 | 292 |
320 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 293 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
321 EXPECT_TRUE(generator_.HasQueuedFrames()); | 294 EXPECT_TRUE(generator_.HasQueuedFrames()); |
322 } | 295 } |
323 | 296 |
324 TEST_P(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { | 297 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { |
325 delegate_.SetCanWriteAnything(); | 298 delegate_.SetCanWriteAnything(); |
326 generator_.StartBatchOperations(); | 299 generator_.StartBatchOperations(); |
327 | 300 |
328 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 301 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
329 EXPECT_TRUE(generator_.HasQueuedFrames()); | 302 EXPECT_TRUE(generator_.HasQueuedFrames()); |
330 } | 303 } |
331 | 304 |
332 TEST_P(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { | 305 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { |
333 delegate_.SetCanNotWrite(); | 306 delegate_.SetCanNotWrite(); |
334 generator_.StartBatchOperations(); | 307 generator_.StartBatchOperations(); |
335 | 308 |
336 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 309 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
337 EXPECT_TRUE(generator_.HasQueuedFrames()); | 310 EXPECT_TRUE(generator_.HasQueuedFrames()); |
338 generator_.FinishBatchOperations(); | 311 generator_.FinishBatchOperations(); |
339 EXPECT_TRUE(generator_.HasQueuedFrames()); | 312 EXPECT_TRUE(generator_.HasQueuedFrames()); |
340 | 313 |
341 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 314 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
342 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 315 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
343 generator_.FlushAllQueuedFrames(); | 316 generator_.FlushAllQueuedFrames(); |
344 EXPECT_FALSE(generator_.HasQueuedFrames()); | 317 EXPECT_FALSE(generator_.HasQueuedFrames()); |
345 | 318 |
346 PacketContents contents; | 319 PacketContents contents; |
347 contents.num_rst_stream_frames = 1; | 320 contents.num_rst_stream_frames = 1; |
348 CheckPacketContains(contents, 0); | 321 CheckPacketContains(contents, 0); |
349 } | 322 } |
350 | 323 |
351 TEST_P(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { | 324 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { |
352 delegate_.SetCanWriteAnything(); | 325 delegate_.SetCanWriteAnything(); |
353 | 326 |
354 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 327 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
355 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 328 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
356 | 329 |
357 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 330 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
358 EXPECT_FALSE(generator_.HasQueuedFrames()); | 331 EXPECT_FALSE(generator_.HasQueuedFrames()); |
359 | 332 |
360 PacketContents contents; | 333 PacketContents contents; |
361 contents.num_rst_stream_frames = 1; | 334 contents.num_rst_stream_frames = 1; |
362 CheckPacketContains(contents, 0); | 335 CheckPacketContains(contents, 0); |
363 } | 336 } |
364 | 337 |
365 TEST_P(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | 338 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
366 delegate_.SetCanNotWrite(); | 339 delegate_.SetCanNotWrite(); |
367 | 340 |
368 QuicConsumedData consumed = generator_.ConsumeData( | 341 QuicConsumedData consumed = generator_.ConsumeData( |
369 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); | 342 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); |
370 EXPECT_EQ(0u, consumed.bytes_consumed); | 343 EXPECT_EQ(0u, consumed.bytes_consumed); |
371 EXPECT_FALSE(consumed.fin_consumed); | 344 EXPECT_FALSE(consumed.fin_consumed); |
372 EXPECT_FALSE(generator_.HasQueuedFrames()); | 345 EXPECT_FALSE(generator_.HasQueuedFrames()); |
373 } | 346 } |
374 | 347 |
375 TEST_P(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { | 348 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { |
376 delegate_.SetCanWriteAnything(); | 349 delegate_.SetCanWriteAnything(); |
377 generator_.StartBatchOperations(); | 350 generator_.StartBatchOperations(); |
378 | 351 |
379 QuicConsumedData consumed = generator_.ConsumeData( | 352 QuicConsumedData consumed = generator_.ConsumeData( |
380 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); | 353 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); |
381 EXPECT_EQ(3u, consumed.bytes_consumed); | 354 EXPECT_EQ(3u, consumed.bytes_consumed); |
382 EXPECT_TRUE(consumed.fin_consumed); | 355 EXPECT_TRUE(consumed.fin_consumed); |
383 EXPECT_TRUE(generator_.HasQueuedFrames()); | 356 EXPECT_TRUE(generator_.HasQueuedFrames()); |
384 } | 357 } |
385 | 358 |
386 TEST_P(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | 359 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
387 delegate_.SetCanWriteAnything(); | 360 delegate_.SetCanWriteAnything(); |
388 | 361 |
389 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 362 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
390 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 363 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
391 QuicConsumedData consumed = generator_.ConsumeData( | 364 QuicConsumedData consumed = generator_.ConsumeData( |
392 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); | 365 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); |
393 EXPECT_EQ(3u, consumed.bytes_consumed); | 366 EXPECT_EQ(3u, consumed.bytes_consumed); |
394 EXPECT_TRUE(consumed.fin_consumed); | 367 EXPECT_TRUE(consumed.fin_consumed); |
395 EXPECT_FALSE(generator_.HasQueuedFrames()); | 368 EXPECT_FALSE(generator_.HasQueuedFrames()); |
396 | 369 |
397 PacketContents contents; | 370 PacketContents contents; |
398 contents.num_stream_frames = 1; | 371 contents.num_stream_frames = 1; |
399 CheckPacketContains(contents, 0); | 372 CheckPacketContains(contents, 0); |
400 } | 373 } |
401 | 374 |
402 // Test the behavior of ConsumeData when the data consumed is for the crypto | 375 // Test the behavior of ConsumeData when the data consumed is for the crypto |
403 // handshake stream. Ensure that the packet is always sent and padded even if | 376 // handshake stream. Ensure that the packet is always sent and padded even if |
404 // the generator operates in batch mode. | 377 // the generator operates in batch mode. |
405 TEST_P(QuicPacketGeneratorTest, ConsumeData_Handshake) { | 378 TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake) { |
406 delegate_.SetCanWriteAnything(); | 379 delegate_.SetCanWriteAnything(); |
407 generator_.StartBatchOperations(); | 380 generator_.StartBatchOperations(); |
408 | 381 |
409 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 382 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
410 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 383 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
411 QuicConsumedData consumed = generator_.ConsumeData( | 384 QuicConsumedData consumed = generator_.ConsumeData( |
412 kCryptoStreamId, MakeIOVector("foo"), 0, false, MAY_FEC_PROTECT, nullptr); | 385 kCryptoStreamId, MakeIOVector("foo"), 0, false, nullptr); |
413 EXPECT_EQ(3u, consumed.bytes_consumed); | 386 EXPECT_EQ(3u, consumed.bytes_consumed); |
414 EXPECT_FALSE(generator_.HasQueuedFrames()); | 387 EXPECT_FALSE(generator_.HasQueuedFrames()); |
415 | 388 |
416 PacketContents contents; | 389 PacketContents contents; |
417 contents.num_stream_frames = 1; | 390 contents.num_stream_frames = 1; |
418 CheckPacketContains(contents, 0); | 391 CheckPacketContains(contents, 0); |
419 | 392 |
420 ASSERT_EQ(1u, packets_.size()); | 393 ASSERT_EQ(1u, packets_.size()); |
421 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetMaxPacketLength()); | 394 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetMaxPacketLength()); |
422 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 395 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
423 } | 396 } |
424 | 397 |
425 TEST_P(QuicPacketGeneratorTest, ConsumeData_EmptyData) { | 398 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { |
426 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, | 399 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, |
427 false, MAY_FEC_PROTECT, nullptr), | 400 false, nullptr), |
428 "Attempt to consume empty data without FIN."); | 401 "Attempt to consume empty data without FIN."); |
429 } | 402 } |
430 | 403 |
431 TEST_P(QuicPacketGeneratorTest, | 404 TEST_F(QuicPacketGeneratorTest, |
432 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { | 405 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { |
433 delegate_.SetCanWriteAnything(); | 406 delegate_.SetCanWriteAnything(); |
434 generator_.StartBatchOperations(); | 407 generator_.StartBatchOperations(); |
435 | 408 |
436 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | 409 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, |
437 MAY_FEC_PROTECT, nullptr); | 410 nullptr); |
438 QuicConsumedData consumed = generator_.ConsumeData( | 411 QuicConsumedData consumed = |
439 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr); | 412 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr); |
440 EXPECT_EQ(4u, consumed.bytes_consumed); | 413 EXPECT_EQ(4u, consumed.bytes_consumed); |
441 EXPECT_FALSE(consumed.fin_consumed); | 414 EXPECT_FALSE(consumed.fin_consumed); |
442 EXPECT_TRUE(generator_.HasQueuedFrames()); | 415 EXPECT_TRUE(generator_.HasQueuedFrames()); |
443 } | 416 } |
444 | 417 |
445 TEST_P(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { | 418 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { |
446 delegate_.SetCanWriteAnything(); | 419 delegate_.SetCanWriteAnything(); |
447 generator_.StartBatchOperations(); | 420 generator_.StartBatchOperations(); |
448 | 421 |
449 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | 422 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, |
450 MAY_FEC_PROTECT, nullptr); | 423 nullptr); |
451 QuicConsumedData consumed = generator_.ConsumeData( | 424 QuicConsumedData consumed = |
452 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr); | 425 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr); |
453 EXPECT_EQ(4u, consumed.bytes_consumed); | 426 EXPECT_EQ(4u, consumed.bytes_consumed); |
454 EXPECT_FALSE(consumed.fin_consumed); | 427 EXPECT_FALSE(consumed.fin_consumed); |
455 EXPECT_TRUE(generator_.HasQueuedFrames()); | 428 EXPECT_TRUE(generator_.HasQueuedFrames()); |
456 | 429 |
457 // Now both frames will be flushed out. | 430 // Now both frames will be flushed out. |
458 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 431 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
459 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 432 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
460 generator_.FinishBatchOperations(); | 433 generator_.FinishBatchOperations(); |
461 EXPECT_FALSE(generator_.HasQueuedFrames()); | 434 EXPECT_FALSE(generator_.HasQueuedFrames()); |
462 | 435 |
463 PacketContents contents; | 436 PacketContents contents; |
464 contents.num_stream_frames = 2; | 437 contents.num_stream_frames = 2; |
465 CheckPacketContains(contents, 0); | 438 CheckPacketContains(contents, 0); |
466 } | 439 } |
467 | 440 |
468 TEST_P(QuicPacketGeneratorTest, ConsumeDataFecOnMaxGroupSize) { | 441 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { |
469 delegate_.SetCanWriteAnything(); | |
470 | |
471 // Send FEC every two packets. | |
472 creator_->set_max_packets_per_fec_group(2); | |
473 | |
474 { | |
475 InSequence dummy; | |
476 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
477 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
478 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
479 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
480 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
481 // FEC packet is not sent when send policy is FEC_ALARM_TRIGGER, but FEC | |
482 // group is closed. | |
483 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
484 } else { | |
485 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
486 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
487 } | |
488 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
489 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
490 } | |
491 | |
492 // Send enough data to create 3 packets: two full and one partial. Send with | |
493 // MUST_FEC_PROTECT flag. | |
494 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | |
495 QuicConsumedData consumed = generator_.ConsumeData( | |
496 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
497 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
498 EXPECT_TRUE(consumed.fin_consumed); | |
499 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
500 | |
501 CheckPacketHasSingleStreamFrame(0); | |
502 CheckPacketHasSingleStreamFrame(1); | |
503 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
504 // FEC packet is not sent when send policy is FEC_ALARM_TRIGGER. | |
505 CheckPacketHasSingleStreamFrame(2); | |
506 } else { | |
507 CheckPacketIsFec(2, 1); | |
508 CheckPacketHasSingleStreamFrame(3); | |
509 } | |
510 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
511 | |
512 // If FEC send policy is FEC_ANY_TRIGGER, then the FEC packet under | |
513 // construction will be sent when one more packet is sent (since FEC group | |
514 // size is 2), or when OnFecTimeout is called. Send more data with | |
515 // MAY_FEC_PROTECT. This packet should also be protected, and FEC packet is | |
516 // sent since FEC group size is reached. | |
517 // | |
518 // If FEC send policy is FEC_ALARM_TRIGGER, FEC group is closed when the group | |
519 // size is reached. FEC packet is not sent. | |
520 { | |
521 InSequence dummy; | |
522 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
523 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
524 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
525 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
526 } else { | |
527 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
528 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
529 } | |
530 } | |
531 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
532 nullptr); | |
533 EXPECT_EQ(1u, consumed.bytes_consumed); | |
534 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
535 CheckPacketHasSingleStreamFrame(3); | |
536 } else { | |
537 CheckPacketHasSingleStreamFrame(4); | |
538 CheckPacketIsFec(5, 4); | |
539 } | |
540 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
541 } | |
542 | |
543 TEST_P(QuicPacketGeneratorTest, ConsumeDataSendsFecOnTimeout) { | |
544 delegate_.SetCanWriteAnything(); | |
545 creator_->set_max_packets_per_fec_group(1000); | |
546 | |
547 // Send data with MUST_FEC_PROTECT flag. No FEC packet is emitted, but the | |
548 // creator FEC protects all data. | |
549 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
550 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
551 QuicConsumedData consumed = generator_.ConsumeData(3, CreateData(1u), 0, true, | |
552 MUST_FEC_PROTECT, nullptr); | |
553 EXPECT_EQ(1u, consumed.bytes_consumed); | |
554 EXPECT_TRUE(consumed.fin_consumed); | |
555 CheckPacketHasSingleStreamFrame(0); | |
556 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
557 | |
558 // Send more data with MAY_FEC_PROTECT. This packet should also be protected, | |
559 // and FEC packet is not yet sent. | |
560 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
561 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
562 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
563 nullptr); | |
564 EXPECT_EQ(1u, consumed.bytes_consumed); | |
565 CheckPacketHasSingleStreamFrame(1); | |
566 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
567 | |
568 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
569 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
570 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
571 generator_.OnFecTimeout(); | |
572 CheckPacketIsFec(2, 1); | |
573 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
574 | |
575 // Subsequent data is protected under the next FEC group. Send enough data to | |
576 // create 2 more packets: one full and one partial. | |
577 { | |
578 InSequence dummy; | |
579 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
580 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
581 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
582 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
583 } | |
584 size_t data_len = kDefaultMaxPacketSize + 1; | |
585 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | |
586 MUST_FEC_PROTECT, nullptr); | |
587 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
588 EXPECT_TRUE(consumed.fin_consumed); | |
589 CheckPacketHasSingleStreamFrame(3); | |
590 CheckPacketHasSingleStreamFrame(4); | |
591 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
592 | |
593 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
594 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
595 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
596 generator_.OnFecTimeout(); | |
597 CheckPacketIsFec(5, 4); | |
598 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
599 } | |
600 | |
601 TEST_P(QuicPacketGeneratorTest, GetFecTimeoutFiniteOnlyOnFirstPacketInGroup) { | |
602 delegate_.SetCanWriteAnything(); | |
603 creator_->set_max_packets_per_fec_group(6); | |
604 | |
605 // Send enough data to create 2 packets: one full and one partial. Send with | |
606 // MUST_FEC_PROTECT flag. No FEC packet is emitted yet, but the creator FEC | |
607 // protects all data. | |
608 { | |
609 InSequence dummy; | |
610 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
611 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
612 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
613 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
614 } | |
615 size_t data_len = 1 * kDefaultMaxPacketSize + 100; | |
616 QuicConsumedData consumed = generator_.ConsumeData( | |
617 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
618 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
619 EXPECT_TRUE(consumed.fin_consumed); | |
620 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
621 CheckPacketHasSingleStreamFrame(0); | |
622 CheckPacketHasSingleStreamFrame(1); | |
623 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
624 | |
625 // GetFecTimeout returns finite timeout only for first packet in group. | |
626 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), | |
627 generator_.GetFecTimeout(/*packet_number=*/1u)); | |
628 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
629 generator_.GetFecTimeout(/*packet_number=*/2u)); | |
630 | |
631 // Send more data with MAY_FEC_PROTECT. This packet should also be protected, | |
632 // and FEC packet is not yet sent. | |
633 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
634 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
635 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
636 nullptr); | |
637 CheckPacketHasSingleStreamFrame(2); | |
638 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
639 | |
640 // GetFecTimeout returns finite timeout only for first packet in group. | |
641 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
642 generator_.GetFecTimeout(/*packet_number=*/3u)); | |
643 | |
644 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
645 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
646 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
647 generator_.OnFecTimeout(); | |
648 CheckPacketIsFec(3, /*fec_group=*/1u); | |
649 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
650 | |
651 // Subsequent data is protected under the next FEC group. Send enough data to | |
652 // create 2 more packets: one full and one partial. | |
653 { | |
654 InSequence dummy; | |
655 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
656 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
657 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
658 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
659 } | |
660 data_len = kDefaultMaxPacketSize + 1u; | |
661 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | |
662 MUST_FEC_PROTECT, nullptr); | |
663 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
664 EXPECT_TRUE(consumed.fin_consumed); | |
665 CheckPacketHasSingleStreamFrame(4); | |
666 CheckPacketHasSingleStreamFrame(5); | |
667 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
668 | |
669 // GetFecTimeout returns finite timeout for first packet in the new group. | |
670 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), | |
671 generator_.GetFecTimeout(/*packet_number=*/5u)); | |
672 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
673 generator_.GetFecTimeout(/*packet_number=*/6u)); | |
674 | |
675 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
676 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
677 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
678 generator_.OnFecTimeout(); | |
679 CheckPacketIsFec(6, /*fec_group=*/5u); | |
680 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
681 | |
682 // Send more data with MAY_FEC_PROTECT. No FEC protection, so GetFecTimeout | |
683 // returns infinite. | |
684 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
685 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
686 consumed = generator_.ConsumeData(9, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
687 nullptr); | |
688 CheckPacketHasSingleStreamFrame(7); | |
689 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
690 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
691 generator_.GetFecTimeout(/*packet_number=*/8u)); | |
692 } | |
693 | |
694 TEST_P(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { | |
695 // Set the packet size be enough for two stream frames with 0 stream offset, | 442 // Set the packet size be enough for two stream frames with 0 stream offset, |
696 // but not enough for a stream frame of 0 offset and one with non-zero offset. | 443 // but not enough for a stream frame of 0 offset and one with non-zero offset. |
697 size_t length = | 444 size_t length = |
698 NullEncrypter().GetCiphertextSize(0) + | 445 NullEncrypter().GetCiphertextSize(0) + |
699 GetPacketHeaderSize( | 446 GetPacketHeaderSize( |
700 creator_->connection_id_length(), kIncludeVersion, !kIncludePathId, | 447 creator_->connection_id_length(), kIncludeVersion, !kIncludePathId, |
701 QuicPacketCreatorPeer::NextPacketNumberLength(creator_), | 448 QuicPacketCreatorPeer::NextPacketNumberLength(creator_), |
702 NOT_IN_FEC_GROUP) + | 449 NOT_IN_FEC_GROUP) + |
703 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger | 450 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger |
704 // than the GetMinStreamFrameSize. | 451 // than the GetMinStreamFrameSize. |
705 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + | 452 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + |
706 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; | 453 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; |
707 generator_.SetMaxPacketLength(length, /*force=*/false); | 454 generator_.SetMaxPacketLength(length, /*force=*/false); |
708 delegate_.SetCanWriteAnything(); | 455 delegate_.SetCanWriteAnything(); |
709 { | 456 { |
710 InSequence dummy; | 457 InSequence dummy; |
711 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 458 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
712 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 459 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
713 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 460 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
714 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 461 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
715 } | 462 } |
716 generator_.StartBatchOperations(); | 463 generator_.StartBatchOperations(); |
717 // Queue enough data to prevent a stream frame with a non-zero offset from | 464 // Queue enough data to prevent a stream frame with a non-zero offset from |
718 // fitting. | 465 // fitting. |
719 QuicConsumedData consumed = | 466 QuicConsumedData consumed = generator_.ConsumeData( |
720 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 0, false, | 467 kHeadersStreamId, MakeIOVector("foo"), 0, false, nullptr); |
721 MAY_FEC_PROTECT, nullptr); | |
722 EXPECT_EQ(3u, consumed.bytes_consumed); | 468 EXPECT_EQ(3u, consumed.bytes_consumed); |
723 EXPECT_FALSE(consumed.fin_consumed); | 469 EXPECT_FALSE(consumed.fin_consumed); |
724 EXPECT_TRUE(generator_.HasQueuedFrames()); | 470 EXPECT_TRUE(generator_.HasQueuedFrames()); |
725 | 471 |
726 // This frame will not fit with the existing frame, causing the queued frame | 472 // This frame will not fit with the existing frame, causing the queued frame |
727 // to be serialized, and it will be added to a new open packet. | 473 // to be serialized, and it will be added to a new open packet. |
728 consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3, | 474 consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3, |
729 true, MAY_FEC_PROTECT, nullptr); | 475 true, nullptr); |
730 EXPECT_EQ(3u, consumed.bytes_consumed); | 476 EXPECT_EQ(3u, consumed.bytes_consumed); |
731 EXPECT_TRUE(consumed.fin_consumed); | 477 EXPECT_TRUE(consumed.fin_consumed); |
732 EXPECT_TRUE(generator_.HasQueuedFrames()); | 478 EXPECT_TRUE(generator_.HasQueuedFrames()); |
733 | 479 |
734 creator_->Flush(); | 480 creator_->Flush(); |
735 EXPECT_FALSE(generator_.HasQueuedFrames()); | 481 EXPECT_FALSE(generator_.HasQueuedFrames()); |
736 | 482 |
737 PacketContents contents; | 483 PacketContents contents; |
738 contents.num_stream_frames = 1; | 484 contents.num_stream_frames = 1; |
739 CheckPacketContains(contents, 0); | 485 CheckPacketContains(contents, 0); |
740 CheckPacketContains(contents, 1); | 486 CheckPacketContains(contents, 1); |
741 } | 487 } |
742 | 488 |
743 TEST_P(QuicPacketGeneratorTest, NoFecPacketSentWhenBatchEnds) { | 489 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { |
744 delegate_.SetCanWriteAnything(); | |
745 creator_->set_max_packets_per_fec_group(6); | |
746 | |
747 generator_.StartBatchOperations(); | |
748 | |
749 generator_.ConsumeData(3, MakeIOVector("foo"), 2, true, MUST_FEC_PROTECT, | |
750 nullptr); | |
751 QuicConsumedData consumed = generator_.ConsumeData( | |
752 5, MakeIOVector("quux"), 7, false, MUST_FEC_PROTECT, nullptr); | |
753 EXPECT_EQ(4u, consumed.bytes_consumed); | |
754 EXPECT_FALSE(consumed.fin_consumed); | |
755 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
756 | |
757 // Now both frames will be flushed out, but FEC packet is not yet sent. | |
758 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
759 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
760 generator_.FinishBatchOperations(); | |
761 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
762 | |
763 PacketContents contents; | |
764 contents.num_stream_frames = 2u; | |
765 contents.fec_group = 1u; | |
766 CheckPacketContains(contents, 0); | |
767 | |
768 // Forcing FEC timeout causes FEC packet to be emitted. | |
769 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
770 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
771 generator_.OnFecTimeout(); | |
772 CheckPacketIsFec(1, /*fec_group=*/1u); | |
773 } | |
774 | |
775 TEST_P(QuicPacketGeneratorTest, FecTimeoutOnRttChange) { | |
776 EXPECT_EQ(QuicTime::Delta::Zero(), | |
777 QuicPacketCreatorPeer::GetFecTimeout(creator_)); | |
778 generator_.OnRttChange(QuicTime::Delta::FromMilliseconds(300)); | |
779 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), | |
780 QuicPacketCreatorPeer::GetFecTimeout(creator_)); | |
781 } | |
782 | |
783 TEST_P(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) { | |
784 delegate_.SetCanWriteAnything(); | |
785 creator_->set_max_packets_per_fec_group(50); | |
786 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | |
787 EXPECT_FALSE(creator_->IsFecGroupOpen()); | |
788 | |
789 // On reduced cwnd. | |
790 generator_.OnCongestionWindowChange(7); | |
791 EXPECT_EQ(3u, creator_->max_packets_per_fec_group()); | |
792 | |
793 // On increased cwnd. | |
794 generator_.OnCongestionWindowChange(100); | |
795 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | |
796 | |
797 // On collapsed cwnd. | |
798 generator_.OnCongestionWindowChange(1); | |
799 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | |
800 } | |
801 | |
802 TEST_P(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) { | |
803 delegate_.SetCanWriteAnything(); | |
804 generator_.StartBatchOperations(); | |
805 creator_->set_max_packets_per_fec_group(50); | |
806 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | |
807 EXPECT_FALSE(creator_->IsFecGroupOpen()); | |
808 | |
809 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. 3 packets | |
810 // are sent, one is queued in the creator. | |
811 { | |
812 InSequence dummy; | |
813 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
814 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
815 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
816 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
817 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
818 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
819 } | |
820 size_t data_len = 3 * kDefaultMaxPacketSize + 1; | |
821 QuicConsumedData consumed = generator_.ConsumeData( | |
822 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
823 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
824 EXPECT_TRUE(creator_->IsFecGroupOpen()); | |
825 | |
826 // Change FEC groupsize. | |
827 generator_.OnCongestionWindowChange(2); | |
828 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | |
829 | |
830 // If FEC send policy is FEC_ANY_TRIGGER, then send enough data to trigger one | |
831 // unprotected data packet, causing the FEC packet to also be sent. | |
832 // | |
833 // If FEC send policy is FEC_ALARM_TRIGGER, FEC group is closed and FEC packet | |
834 // is not sent. | |
835 { | |
836 InSequence dummy; | |
837 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
838 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
839 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
840 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
841 } else { | |
842 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
843 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
844 } | |
845 } | |
846 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, | |
847 true, MAY_FEC_PROTECT, nullptr); | |
848 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); | |
849 if (generator_.fec_send_policy() == FEC_ANY_TRIGGER) { | |
850 // Verify that one FEC packet was sent. | |
851 CheckPacketIsFec(4, /*fec_group=*/1u); | |
852 } | |
853 EXPECT_FALSE(creator_->IsFecGroupOpen()); | |
854 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
855 } | |
856 | |
857 TEST_P(QuicPacketGeneratorTest, SwitchFecOnOff) { | |
858 delegate_.SetCanWriteAnything(); | |
859 creator_->set_max_packets_per_fec_group(2); | |
860 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
861 | |
862 // Send one unprotected data packet. | |
863 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
864 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
865 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
866 MAY_FEC_PROTECT, nullptr); | |
867 EXPECT_EQ(1u, consumed.bytes_consumed); | |
868 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
869 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
870 // Verify that one data packet was sent. | |
871 PacketContents contents; | |
872 contents.num_stream_frames = 1; | |
873 CheckPacketContains(contents, 0); | |
874 | |
875 { | |
876 InSequence dummy; | |
877 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
878 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
879 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
880 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
881 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
882 // If FEC send policy is FEC_ALARM_TRIGGER, FEC group is closed. | |
883 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
884 } else { | |
885 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
886 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
887 } | |
888 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
889 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
890 } | |
891 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. | |
892 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | |
893 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | |
894 MUST_FEC_PROTECT, nullptr); | |
895 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
896 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
897 | |
898 // If FEC send policy is FEC_ANY_TRIGGER, verify that packets sent were 3 data | |
899 // and 1 FEC. | |
900 // | |
901 // If FEC send policy is FEC_ALARM_TRIGGER, verify that packets sent were 3 | |
902 // data and FEC group is closed. | |
903 CheckPacketHasSingleStreamFrame(1); | |
904 CheckPacketHasSingleStreamFrame(2); | |
905 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
906 CheckPacketHasSingleStreamFrame(3); | |
907 } else { | |
908 CheckPacketIsFec(3, /*fec_group=*/2u); | |
909 CheckPacketHasSingleStreamFrame(4); | |
910 } | |
911 | |
912 // Calling OnFecTimeout should emit the pending FEC packet. | |
913 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
914 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
915 generator_.OnFecTimeout(); | |
916 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
917 CheckPacketIsFec(4, /*fec_group=*/4u); | |
918 } else { | |
919 CheckPacketIsFec(5, /*fec_group=*/5u); | |
920 } | |
921 | |
922 // Send one unprotected data packet. | |
923 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
924 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
925 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
926 nullptr); | |
927 EXPECT_EQ(1u, consumed.bytes_consumed); | |
928 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
929 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
930 // Verify that one unprotected data packet was sent. | |
931 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
932 CheckPacketContains(contents, 5); | |
933 } else { | |
934 CheckPacketContains(contents, 6); | |
935 } | |
936 } | |
937 | |
938 TEST_P(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { | |
939 delegate_.SetCanWriteAnything(); | |
940 // Enable FEC. | |
941 creator_->set_max_packets_per_fec_group(2); | |
942 | |
943 generator_.StartBatchOperations(); | |
944 // Queue enough data to prevent a stream frame with a non-zero offset from | |
945 // fitting. | |
946 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | |
947 MAY_FEC_PROTECT, nullptr); | |
948 EXPECT_EQ(1u, consumed.bytes_consumed); | |
949 EXPECT_TRUE(creator_->HasPendingFrames()); | |
950 | |
951 // Queue protected data for sending. Should cause queued frames to be flushed. | |
952 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
953 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
954 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
955 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | |
956 MUST_FEC_PROTECT, nullptr); | |
957 EXPECT_EQ(1u, consumed.bytes_consumed); | |
958 PacketContents contents; | |
959 contents.num_stream_frames = 1; | |
960 // Transmitted packet was not FEC protected. | |
961 CheckPacketContains(contents, 0); | |
962 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
963 EXPECT_TRUE(creator_->HasPendingFrames()); | |
964 } | |
965 | |
966 TEST_P(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { | |
967 // Enable FEC. | |
968 creator_->set_max_packets_per_fec_group(2); | |
969 | |
970 // Queue control frames in generator. | |
971 delegate_.SetCanNotWrite(); | |
972 generator_.SetShouldSendAck(true); | |
973 delegate_.SetCanWriteAnything(); | |
974 generator_.StartBatchOperations(); | |
975 | |
976 // Set up frames to write into the creator when control frames are written. | |
977 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | |
978 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); | |
979 | |
980 // Generator should have queued control frames, and creator should be empty. | |
981 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
982 EXPECT_FALSE(creator_->HasPendingFrames()); | |
983 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
984 | |
985 // Queue protected data for sending. Should cause queued frames to be flushed. | |
986 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
987 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
988 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | |
989 MUST_FEC_PROTECT, nullptr); | |
990 EXPECT_EQ(1u, consumed.bytes_consumed); | |
991 PacketContents contents; | |
992 contents.num_ack_frames = 1; | |
993 contents.num_stop_waiting_frames = 1; | |
994 CheckPacketContains(contents, 0); | |
995 | |
996 // FEC protection should be on in creator. | |
997 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
998 } | |
999 | |
1000 TEST_P(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { | |
1001 delegate_.SetCanWriteAnything(); | |
1002 | |
1003 // Enable FEC. | |
1004 creator_->set_max_packets_per_fec_group(2); | |
1005 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1006 | |
1007 // Queue stream frame to be protected in creator. | |
1008 generator_.StartBatchOperations(); | |
1009 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
1010 MUST_FEC_PROTECT, nullptr); | |
1011 EXPECT_EQ(1u, consumed.bytes_consumed); | |
1012 // Creator has a pending protected frame. | |
1013 EXPECT_TRUE(creator_->HasPendingFrames()); | |
1014 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1015 | |
1016 // Add enough unprotected data to exceed size of current packet, so that | |
1017 // current packet is sent. Both frames will be sent out in a single packet. | |
1018 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1019 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1020 size_t data_len = kDefaultMaxPacketSize; | |
1021 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | |
1022 MAY_FEC_PROTECT, nullptr); | |
1023 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
1024 PacketContents contents; | |
1025 contents.num_stream_frames = 2u; | |
1026 contents.fec_group = 1u; | |
1027 CheckPacketContains(contents, 0); | |
1028 // FEC protection should still be on in creator. | |
1029 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1030 } | |
1031 | |
1032 TEST_P(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { | |
1033 delegate_.SetCanWriteAnything(); | |
1034 | |
1035 // Enable FEC. | |
1036 creator_->set_max_packets_per_fec_group(2); | |
1037 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1038 | |
1039 // Send first packet, FEC protected. | |
1040 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1041 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1042 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
1043 MUST_FEC_PROTECT, nullptr); | |
1044 EXPECT_EQ(1u, consumed.bytes_consumed); | |
1045 PacketContents contents; | |
1046 contents.num_stream_frames = 1u; | |
1047 contents.fec_group = 1u; | |
1048 CheckPacketContains(contents, 0); | |
1049 | |
1050 // FEC should still be on in creator. | |
1051 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1052 | |
1053 // Send unprotected data to cause second packet to be sent, which gets | |
1054 // protected because it happens to fall within an open FEC group. Data packet | |
1055 // will be followed by FEC packet. | |
1056 { | |
1057 InSequence dummy; | |
1058 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1059 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1060 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
1061 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
1062 } else { | |
1063 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1064 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1065 } | |
1066 } | |
1067 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
1068 nullptr); | |
1069 EXPECT_EQ(1u, consumed.bytes_consumed); | |
1070 contents.num_stream_frames = 1u; | |
1071 CheckPacketContains(contents, 1); | |
1072 if (generator_.fec_send_policy() == FEC_ANY_TRIGGER) { | |
1073 // FEC packet is sent when send policy is FEC_ANY_TRIGGER. | |
1074 CheckPacketIsFec(2, /*fec_group=*/1u); | |
1075 } | |
1076 | |
1077 // FEC protection should be off in creator. | |
1078 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1079 } | |
1080 | |
1081 TEST_P(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { | |
1082 delegate_.SetCanWriteAnything(); | |
1083 generator_.StartBatchOperations(); | |
1084 | |
1085 // Enable FEC. | |
1086 creator_->set_max_packets_per_fec_group(2); | |
1087 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1088 | |
1089 // Queue one byte of FEC protected data. | |
1090 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
1091 MUST_FEC_PROTECT, nullptr); | |
1092 EXPECT_TRUE(creator_->HasPendingFrames()); | |
1093 | |
1094 // Add more unprotected data causing first packet to be sent, FEC protected. | |
1095 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1096 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1097 size_t data_len = kDefaultMaxPacketSize; | |
1098 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | |
1099 MAY_FEC_PROTECT, nullptr); | |
1100 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
1101 PacketContents contents; | |
1102 contents.num_stream_frames = 2u; | |
1103 contents.fec_group = 1u; | |
1104 CheckPacketContains(contents, 0); | |
1105 | |
1106 // FEC group is still open in creator. | |
1107 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1108 | |
1109 // Add data that should be protected, large enough to cause second packet to | |
1110 // be sent. Data packet should be followed by FEC packet. | |
1111 { | |
1112 InSequence dummy; | |
1113 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1114 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1115 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
1116 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
1117 } else { | |
1118 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1119 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1120 } | |
1121 } | |
1122 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | |
1123 MUST_FEC_PROTECT, nullptr); | |
1124 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
1125 CheckPacketContains(contents, 1); | |
1126 if (generator_.fec_send_policy() == FEC_ANY_TRIGGER) { | |
1127 // FEC packet is sent when send policy is FEC_ANY_TRIGGER. | |
1128 CheckPacketIsFec(2, /*fec_group=*/1u); | |
1129 } | |
1130 | |
1131 // FEC protection should remain on in creator. | |
1132 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1133 } | |
1134 | |
1135 TEST_P(QuicPacketGeneratorTest, ResetFecGroupNoTimeout) { | |
1136 delegate_.SetCanWriteAnything(); | |
1137 // Send FEC packet after 2 packets. | |
1138 creator_->set_max_packets_per_fec_group(2); | |
1139 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1140 | |
1141 // Send two packets so that when this data is consumed, two packets are sent | |
1142 // out. In FEC_TRIGGER_ANY, this will cause an FEC packet to be sent out and | |
1143 // with FEC_TRIGGER_ALARM, this will cause a Reset to be called. In both | |
1144 // cases, the creator's fec protection will be turned off afterwards. | |
1145 { | |
1146 InSequence dummy; | |
1147 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1148 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1149 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1150 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1151 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
1152 // FEC packet is not sent when send policy is FEC_ALARM_TRIGGER, but FEC | |
1153 // group is closed. | |
1154 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
1155 } else { | |
1156 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1157 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1158 } | |
1159 // Fin Packet. | |
1160 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1161 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1162 } | |
1163 size_t data_len = 2 * kDefaultMaxPacketSize; | |
1164 QuicConsumedData consumed = generator_.ConsumeData( | |
1165 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
1166 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
1167 EXPECT_TRUE(consumed.fin_consumed); | |
1168 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
1169 CheckPacketHasSingleStreamFrame(0); | |
1170 CheckPacketHasSingleStreamFrame(1); | |
1171 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
1172 // FEC packet is not sent when send policy is FEC_ALARM_TRIGGER. | |
1173 CheckPacketHasSingleStreamFrame(2); | |
1174 } else { | |
1175 // FEC packet is sent after 2 packets and when send policy is | |
1176 // FEC_ANY_TRIGGER. | |
1177 CheckPacketIsFec(2, 1); | |
1178 CheckPacketHasSingleStreamFrame(3); | |
1179 } | |
1180 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1181 | |
1182 // Do the same send (with MUST_FEC_PROTECT) on a different stream id. | |
1183 { | |
1184 InSequence dummy; | |
1185 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1186 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1187 // FEC packet is sent after 2 packets and when send policy is | |
1188 // FEC_ANY_TRIGGER. When policy is FEC_ALARM_TRIGGER, FEC group is closed | |
1189 // and FEC packet is not sent. | |
1190 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
1191 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
1192 } else { | |
1193 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1194 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1195 } | |
1196 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1197 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1198 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1199 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1200 // FEC packet is sent after 2 packets and when send policy is | |
1201 // FEC_ANY_TRIGGER. When policy is FEC_ALARM_TRIGGER, FEC group is closed | |
1202 // and FEC packet is not sent. | |
1203 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
1204 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
1205 } else { | |
1206 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1207 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1208 } | |
1209 } | |
1210 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | |
1211 MUST_FEC_PROTECT, nullptr); | |
1212 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
1213 EXPECT_TRUE(consumed.fin_consumed); | |
1214 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
1215 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
1216 CheckPacketHasSingleStreamFrame(3); | |
1217 CheckPacketHasSingleStreamFrame(4); | |
1218 CheckPacketHasSingleStreamFrame(5); | |
1219 } else { | |
1220 CheckPacketHasSingleStreamFrame(4); | |
1221 // FEC packet is sent after 2 packets and when send policy is | |
1222 // FEC_ANY_TRIGGER. | |
1223 CheckPacketIsFec(5, 4); | |
1224 CheckPacketHasSingleStreamFrame(6); | |
1225 CheckPacketHasSingleStreamFrame(7); | |
1226 // FEC packet is sent after 2 packets and when send policy is | |
1227 // FEC_ANY_TRIGGER. | |
1228 CheckPacketIsFec(8, 7); | |
1229 } | |
1230 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1231 | |
1232 // Do the another send (with MAY_FEC_PROTECT) on a different stream id, which | |
1233 // should not produce an FEC packet because the last FEC group has been | |
1234 // closed. | |
1235 { | |
1236 InSequence dummy; | |
1237 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1238 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1239 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1240 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1241 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1242 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1243 } | |
1244 consumed = generator_.ConsumeData(9, CreateData(data_len), 0, true, | |
1245 MAY_FEC_PROTECT, nullptr); | |
1246 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
1247 EXPECT_TRUE(consumed.fin_consumed); | |
1248 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
1249 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
1250 CheckPacketHasSingleStreamFrame(6); | |
1251 CheckPacketHasSingleStreamFrame(7); | |
1252 CheckPacketHasSingleStreamFrame(8); | |
1253 } else { | |
1254 CheckPacketHasSingleStreamFrame(9); | |
1255 CheckPacketHasSingleStreamFrame(10); | |
1256 CheckPacketHasSingleStreamFrame(11); | |
1257 } | |
1258 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1259 } | |
1260 | |
1261 // 1. Create and send one packet with MUST_FEC_PROTECT. | |
1262 // 2. Call FecTimeout, expect FEC packet is sent. | |
1263 // 3. Do the same thing over again, with a different stream id. | |
1264 TEST_P(QuicPacketGeneratorTest, FecPacketSentOnFecTimeout) { | |
1265 delegate_.SetCanWriteAnything(); | |
1266 creator_->set_max_packets_per_fec_group(1000); | |
1267 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1268 | |
1269 for (int i = 1; i < 4; i = i + 2) { | |
1270 // Send data with MUST_FEC_PROTECT flag. No FEC packet is emitted, but the | |
1271 // creator FEC protects all data. | |
1272 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1273 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1274 QuicConsumedData consumed = generator_.ConsumeData( | |
1275 i + 2, CreateData(1u), 0, true, MUST_FEC_PROTECT, nullptr); | |
1276 EXPECT_EQ(1u, consumed.bytes_consumed); | |
1277 EXPECT_TRUE(consumed.fin_consumed); | |
1278 CheckPacketHasSingleStreamFrame(0); | |
1279 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1280 | |
1281 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
1282 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1283 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
1284 generator_.OnFecTimeout(); | |
1285 CheckPacketIsFec(i, i); | |
1286 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
1287 } | |
1288 } | |
1289 | |
1290 TEST_P(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | |
1291 delegate_.SetCanNotWrite(); | 490 delegate_.SetCanNotWrite(); |
1292 | 491 |
1293 generator_.SetShouldSendAck(false); | 492 generator_.SetShouldSendAck(false); |
1294 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 493 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
1295 EXPECT_TRUE(generator_.HasQueuedFrames()); | 494 EXPECT_TRUE(generator_.HasQueuedFrames()); |
1296 | 495 |
1297 delegate_.SetCanWriteAnything(); | 496 delegate_.SetCanWriteAnything(); |
1298 | 497 |
1299 generator_.StartBatchOperations(); | 498 generator_.StartBatchOperations(); |
1300 | 499 |
1301 // When the first write operation is invoked, the ack frame will be returned. | 500 // When the first write operation is invoked, the ack frame will be returned. |
1302 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 501 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
1303 | 502 |
1304 // Send some data and a control frame | 503 // Send some data and a control frame |
1305 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, | 504 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr); |
1306 nullptr); | |
1307 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 505 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
1308 | 506 |
1309 // All five frames will be flushed out in a single packet. | 507 // All five frames will be flushed out in a single packet. |
1310 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 508 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1311 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 509 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
1312 generator_.FinishBatchOperations(); | 510 generator_.FinishBatchOperations(); |
1313 EXPECT_FALSE(generator_.HasQueuedFrames()); | 511 EXPECT_FALSE(generator_.HasQueuedFrames()); |
1314 | 512 |
1315 PacketContents contents; | 513 PacketContents contents; |
1316 contents.num_ack_frames = 1; | 514 contents.num_ack_frames = 1; |
1317 contents.num_goaway_frames = 1; | 515 contents.num_goaway_frames = 1; |
1318 contents.num_rst_stream_frames = 1; | 516 contents.num_rst_stream_frames = 1; |
1319 contents.num_stream_frames = 1; | 517 contents.num_stream_frames = 1; |
1320 CheckPacketContains(contents, 0); | 518 CheckPacketContains(contents, 0); |
1321 } | 519 } |
1322 | 520 |
1323 TEST_P(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { | 521 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { |
1324 delegate_.SetCanNotWrite(); | 522 delegate_.SetCanNotWrite(); |
1325 | 523 |
1326 generator_.SetShouldSendAck(false); | 524 generator_.SetShouldSendAck(false); |
1327 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 525 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
1328 EXPECT_TRUE(generator_.HasQueuedFrames()); | 526 EXPECT_TRUE(generator_.HasQueuedFrames()); |
1329 | 527 |
1330 delegate_.SetCanWriteAnything(); | 528 delegate_.SetCanWriteAnything(); |
1331 | 529 |
1332 generator_.StartBatchOperations(); | 530 generator_.StartBatchOperations(); |
1333 | 531 |
1334 // When the first write operation is invoked, the ack frame will be returned. | 532 // When the first write operation is invoked, the ack frame will be returned. |
1335 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 533 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
1336 | 534 |
1337 { | 535 { |
1338 InSequence dummy; | 536 InSequence dummy; |
1339 // All five frames will be flushed out in a single packet | 537 // All five frames will be flushed out in a single packet |
1340 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 538 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1341 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 539 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
1342 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 540 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1343 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 541 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
1344 } | 542 } |
1345 | 543 |
1346 // Send enough data to exceed one packet | 544 // Send enough data to exceed one packet |
1347 size_t data_len = kDefaultMaxPacketSize + 100; | 545 size_t data_len = kDefaultMaxPacketSize + 100; |
1348 QuicConsumedData consumed = generator_.ConsumeData( | 546 QuicConsumedData consumed = |
1349 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr); | 547 generator_.ConsumeData(3, CreateData(data_len), 0, true, nullptr); |
1350 EXPECT_EQ(data_len, consumed.bytes_consumed); | 548 EXPECT_EQ(data_len, consumed.bytes_consumed); |
1351 EXPECT_TRUE(consumed.fin_consumed); | 549 EXPECT_TRUE(consumed.fin_consumed); |
1352 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 550 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
1353 | 551 |
1354 generator_.FinishBatchOperations(); | 552 generator_.FinishBatchOperations(); |
1355 EXPECT_FALSE(generator_.HasQueuedFrames()); | 553 EXPECT_FALSE(generator_.HasQueuedFrames()); |
1356 | 554 |
1357 // The first packet should have the queued data and part of the stream data. | 555 // The first packet should have the queued data and part of the stream data. |
1358 PacketContents contents; | 556 PacketContents contents; |
1359 contents.num_ack_frames = 1; | 557 contents.num_ack_frames = 1; |
1360 contents.num_rst_stream_frames = 1; | 558 contents.num_rst_stream_frames = 1; |
1361 contents.num_stream_frames = 1; | 559 contents.num_stream_frames = 1; |
1362 CheckPacketContains(contents, 0); | 560 CheckPacketContains(contents, 0); |
1363 | 561 |
1364 // The second should have the remainder of the stream data. | 562 // The second should have the remainder of the stream data. |
1365 PacketContents contents2; | 563 PacketContents contents2; |
1366 contents2.num_goaway_frames = 1; | 564 contents2.num_goaway_frames = 1; |
1367 contents2.num_stream_frames = 1; | 565 contents2.num_stream_frames = 1; |
1368 CheckPacketContains(contents2, 1); | 566 CheckPacketContains(contents2, 1); |
1369 } | 567 } |
1370 | 568 |
1371 TEST_P(QuicPacketGeneratorTest, TestConnectionIdLength) { | 569 TEST_F(QuicPacketGeneratorTest, TestConnectionIdLength) { |
1372 generator_.SetConnectionIdLength(0); | 570 generator_.SetConnectionIdLength(0); |
1373 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID, creator_->connection_id_length()); | 571 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1374 generator_.SetConnectionIdLength(1); | 572 generator_.SetConnectionIdLength(1); |
1375 EXPECT_EQ(PACKET_1BYTE_CONNECTION_ID, creator_->connection_id_length()); | 573 EXPECT_EQ(PACKET_1BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1376 generator_.SetConnectionIdLength(2); | 574 generator_.SetConnectionIdLength(2); |
1377 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); | 575 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1378 generator_.SetConnectionIdLength(3); | 576 generator_.SetConnectionIdLength(3); |
1379 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); | 577 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1380 generator_.SetConnectionIdLength(4); | 578 generator_.SetConnectionIdLength(4); |
1381 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); | 579 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1382 generator_.SetConnectionIdLength(5); | 580 generator_.SetConnectionIdLength(5); |
1383 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 581 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1384 generator_.SetConnectionIdLength(6); | 582 generator_.SetConnectionIdLength(6); |
1385 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 583 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1386 generator_.SetConnectionIdLength(7); | 584 generator_.SetConnectionIdLength(7); |
1387 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 585 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1388 generator_.SetConnectionIdLength(8); | 586 generator_.SetConnectionIdLength(8); |
1389 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 587 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1390 generator_.SetConnectionIdLength(9); | 588 generator_.SetConnectionIdLength(9); |
1391 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 589 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
1392 } | 590 } |
1393 | 591 |
1394 // Test whether SetMaxPacketLength() works in the situation when the queue is | 592 // Test whether SetMaxPacketLength() works in the situation when the queue is |
1395 // empty, and we send three packets worth of data. | 593 // empty, and we send three packets worth of data. |
1396 TEST_P(QuicPacketGeneratorTest, SetMaxPacketLength_Initial) { | 594 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Initial) { |
1397 delegate_.SetCanWriteAnything(); | 595 delegate_.SetCanWriteAnything(); |
1398 | 596 |
1399 // Send enough data for three packets. | 597 // Send enough data for three packets. |
1400 size_t data_len = 3 * kDefaultMaxPacketSize + 1; | 598 size_t data_len = 3 * kDefaultMaxPacketSize + 1; |
1401 size_t packet_len = kDefaultMaxPacketSize + 100; | 599 size_t packet_len = kDefaultMaxPacketSize + 100; |
1402 ASSERT_LE(packet_len, kMaxPacketSize); | 600 ASSERT_LE(packet_len, kMaxPacketSize); |
1403 generator_.SetMaxPacketLength(packet_len, /*force=*/false); | 601 generator_.SetMaxPacketLength(packet_len, /*force=*/false); |
1404 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 602 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
1405 | 603 |
1406 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 604 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1407 .Times(3) | 605 .Times(3) |
1408 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 606 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
1409 QuicConsumedData consumed = | 607 QuicConsumedData consumed = |
1410 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 608 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
1411 /*offset=*/2, | 609 /*offset=*/2, |
1412 /*fin=*/true, MAY_FEC_PROTECT, nullptr); | 610 /*fin=*/true, nullptr); |
1413 EXPECT_EQ(data_len, consumed.bytes_consumed); | 611 EXPECT_EQ(data_len, consumed.bytes_consumed); |
1414 EXPECT_TRUE(consumed.fin_consumed); | 612 EXPECT_TRUE(consumed.fin_consumed); |
1415 EXPECT_FALSE(generator_.HasQueuedFrames()); | 613 EXPECT_FALSE(generator_.HasQueuedFrames()); |
1416 | 614 |
1417 // We expect three packets, and first two of them have to be of packet_len | 615 // We expect three packets, and first two of them have to be of packet_len |
1418 // size. We check multiple packets (instead of just one) because we want to | 616 // size. We check multiple packets (instead of just one) because we want to |
1419 // ensure that |max_packet_length_| does not get changed incorrectly by the | 617 // ensure that |max_packet_length_| does not get changed incorrectly by the |
1420 // generator after first packet is serialized. | 618 // generator after first packet is serialized. |
1421 ASSERT_EQ(3u, packets_.size()); | 619 ASSERT_EQ(3u, packets_.size()); |
1422 EXPECT_EQ(packet_len, packets_[0].encrypted_length); | 620 EXPECT_EQ(packet_len, packets_[0].encrypted_length); |
1423 EXPECT_EQ(packet_len, packets_[1].encrypted_length); | 621 EXPECT_EQ(packet_len, packets_[1].encrypted_length); |
1424 CheckAllPacketsHaveSingleStreamFrame(); | 622 CheckAllPacketsHaveSingleStreamFrame(); |
1425 } | 623 } |
1426 | 624 |
1427 // Test whether SetMaxPacketLength() works in the situation when we first write | 625 // Test whether SetMaxPacketLength() works in the situation when we first write |
1428 // data, then change packet size, then write data again. | 626 // data, then change packet size, then write data again. |
1429 TEST_P(QuicPacketGeneratorTest, SetMaxPacketLength_Middle) { | 627 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Middle) { |
1430 delegate_.SetCanWriteAnything(); | 628 delegate_.SetCanWriteAnything(); |
1431 | 629 |
1432 // We send enough data to overflow default packet length, but not the altered | 630 // We send enough data to overflow default packet length, but not the altered |
1433 // one. | 631 // one. |
1434 size_t data_len = kDefaultMaxPacketSize; | 632 size_t data_len = kDefaultMaxPacketSize; |
1435 size_t packet_len = kDefaultMaxPacketSize + 100; | 633 size_t packet_len = kDefaultMaxPacketSize + 100; |
1436 ASSERT_LE(packet_len, kMaxPacketSize); | 634 ASSERT_LE(packet_len, kMaxPacketSize); |
1437 | 635 |
1438 // We expect to see three packets in total. | 636 // We expect to see three packets in total. |
1439 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 637 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1440 .Times(3) | 638 .Times(3) |
1441 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 639 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
1442 | 640 |
1443 // Send two packets before packet size change. | 641 // Send two packets before packet size change. |
1444 QuicConsumedData consumed = | 642 QuicConsumedData consumed = |
1445 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 643 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
1446 /*offset=*/2, | 644 /*offset=*/2, |
1447 /*fin=*/false, MAY_FEC_PROTECT, nullptr); | 645 /*fin=*/false, nullptr); |
1448 EXPECT_EQ(data_len, consumed.bytes_consumed); | 646 EXPECT_EQ(data_len, consumed.bytes_consumed); |
1449 EXPECT_FALSE(consumed.fin_consumed); | 647 EXPECT_FALSE(consumed.fin_consumed); |
1450 EXPECT_FALSE(generator_.HasQueuedFrames()); | 648 EXPECT_FALSE(generator_.HasQueuedFrames()); |
1451 | 649 |
1452 // Make sure we already have two packets. | 650 // Make sure we already have two packets. |
1453 ASSERT_EQ(2u, packets_.size()); | 651 ASSERT_EQ(2u, packets_.size()); |
1454 | 652 |
1455 // Increase packet size. | 653 // Increase packet size. |
1456 generator_.SetMaxPacketLength(packet_len, /*force=*/false); | 654 generator_.SetMaxPacketLength(packet_len, /*force=*/false); |
1457 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 655 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
1458 | 656 |
1459 // Send a packet after packet size change. | 657 // Send a packet after packet size change. |
1460 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 658 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
1461 2 + data_len, | 659 2 + data_len, |
1462 /*fin=*/true, MAY_FEC_PROTECT, nullptr); | 660 /*fin=*/true, nullptr); |
1463 EXPECT_EQ(data_len, consumed.bytes_consumed); | 661 EXPECT_EQ(data_len, consumed.bytes_consumed); |
1464 EXPECT_TRUE(consumed.fin_consumed); | 662 EXPECT_TRUE(consumed.fin_consumed); |
1465 EXPECT_FALSE(generator_.HasQueuedFrames()); | 663 EXPECT_FALSE(generator_.HasQueuedFrames()); |
1466 | 664 |
1467 // We expect first data chunk to get fragmented, but the second one to fit | 665 // We expect first data chunk to get fragmented, but the second one to fit |
1468 // into a single packet. | 666 // into a single packet. |
1469 ASSERT_EQ(3u, packets_.size()); | 667 ASSERT_EQ(3u, packets_.size()); |
1470 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 668 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
1471 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length); | 669 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length); |
1472 CheckAllPacketsHaveSingleStreamFrame(); | 670 CheckAllPacketsHaveSingleStreamFrame(); |
1473 } | 671 } |
1474 | 672 |
1475 // Test whether SetMaxPacketLength() works correctly when we change the packet | 673 // Test whether SetMaxPacketLength() works correctly when we change the packet |
1476 // size in the middle of the batched packet. | 674 // size in the middle of the batched packet. |
1477 TEST_P(QuicPacketGeneratorTest, SetMaxPacketLength_Midpacket) { | 675 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Midpacket) { |
1478 delegate_.SetCanWriteAnything(); | 676 delegate_.SetCanWriteAnything(); |
1479 generator_.StartBatchOperations(); | 677 generator_.StartBatchOperations(); |
1480 | 678 |
1481 size_t first_write_len = kDefaultMaxPacketSize / 2; | 679 size_t first_write_len = kDefaultMaxPacketSize / 2; |
1482 size_t second_write_len = kDefaultMaxPacketSize; | 680 size_t second_write_len = kDefaultMaxPacketSize; |
1483 size_t packet_len = kDefaultMaxPacketSize + 100; | 681 size_t packet_len = kDefaultMaxPacketSize + 100; |
1484 ASSERT_LE(packet_len, kMaxPacketSize); | 682 ASSERT_LE(packet_len, kMaxPacketSize); |
1485 | 683 |
1486 // First send half of the packet worth of data. We are in the batch mode, so | 684 // First send half of the packet worth of data. We are in the batch mode, so |
1487 // should not cause packet serialization. | 685 // should not cause packet serialization. |
1488 QuicConsumedData consumed = | 686 QuicConsumedData consumed = |
1489 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), | 687 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), |
1490 /*offset=*/2, | 688 /*offset=*/2, |
1491 /*fin=*/false, MAY_FEC_PROTECT, nullptr); | 689 /*fin=*/false, nullptr); |
1492 EXPECT_EQ(first_write_len, consumed.bytes_consumed); | 690 EXPECT_EQ(first_write_len, consumed.bytes_consumed); |
1493 EXPECT_FALSE(consumed.fin_consumed); | 691 EXPECT_FALSE(consumed.fin_consumed); |
1494 EXPECT_TRUE(generator_.HasQueuedFrames()); | 692 EXPECT_TRUE(generator_.HasQueuedFrames()); |
1495 | 693 |
1496 // Make sure we have no packets so far. | 694 // Make sure we have no packets so far. |
1497 ASSERT_EQ(0u, packets_.size()); | 695 ASSERT_EQ(0u, packets_.size()); |
1498 | 696 |
1499 // Increase packet size. Ensure it's not immediately enacted. | 697 // Increase packet size. Ensure it's not immediately enacted. |
1500 generator_.SetMaxPacketLength(packet_len, /*force=*/false); | 698 generator_.SetMaxPacketLength(packet_len, /*force=*/false); |
1501 EXPECT_EQ(packet_len, generator_.GetMaxPacketLength()); | 699 EXPECT_EQ(packet_len, generator_.GetMaxPacketLength()); |
1502 EXPECT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength()); | 700 EXPECT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength()); |
1503 | 701 |
1504 // We expect to see exactly one packet serialized after that, since we are in | 702 // We expect to see exactly one packet serialized after that, since we are in |
1505 // batch mode and we have sent approximately 3/2 of our MTU. | 703 // batch mode and we have sent approximately 3/2 of our MTU. |
1506 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 704 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1507 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 705 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
1508 | 706 |
1509 // Send a packet worth of data to the same stream. This should trigger | 707 // Send a packet worth of data to the same stream. This should trigger |
1510 // serialization of other packet. | 708 // serialization of other packet. |
1511 consumed = | 709 consumed = |
1512 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), | 710 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), |
1513 /*offset=*/2 + first_write_len, | 711 /*offset=*/2 + first_write_len, |
1514 /*fin=*/true, MAY_FEC_PROTECT, nullptr); | 712 /*fin=*/true, nullptr); |
1515 EXPECT_EQ(second_write_len, consumed.bytes_consumed); | 713 EXPECT_EQ(second_write_len, consumed.bytes_consumed); |
1516 EXPECT_TRUE(consumed.fin_consumed); | 714 EXPECT_TRUE(consumed.fin_consumed); |
1517 EXPECT_TRUE(generator_.HasQueuedFrames()); | 715 EXPECT_TRUE(generator_.HasQueuedFrames()); |
1518 | 716 |
1519 // We expect the first packet to contain two frames, and to not reflect the | 717 // We expect the first packet to contain two frames, and to not reflect the |
1520 // packet size change. | 718 // packet size change. |
1521 ASSERT_EQ(1u, packets_.size()); | 719 ASSERT_EQ(1u, packets_.size()); |
1522 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 720 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
1523 | 721 |
1524 PacketContents contents; | 722 PacketContents contents; |
1525 contents.num_stream_frames = 2; | 723 contents.num_stream_frames = 2; |
1526 CheckPacketContains(contents, 0); | 724 CheckPacketContains(contents, 0); |
1527 } | 725 } |
1528 | 726 |
1529 // Test whether SetMaxPacketLength() works correctly when we force the change of | 727 // Test whether SetMaxPacketLength() works correctly when we force the change of |
1530 // the packet size in the middle of the batched packet. | 728 // the packet size in the middle of the batched packet. |
1531 TEST_P(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) { | 729 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) { |
1532 delegate_.SetCanWriteAnything(); | 730 delegate_.SetCanWriteAnything(); |
1533 generator_.StartBatchOperations(); | 731 generator_.StartBatchOperations(); |
1534 | 732 |
1535 size_t first_write_len = kDefaultMaxPacketSize / 2; | 733 size_t first_write_len = kDefaultMaxPacketSize / 2; |
1536 size_t packet_len = kDefaultMaxPacketSize + 100; | 734 size_t packet_len = kDefaultMaxPacketSize + 100; |
1537 size_t second_write_len = packet_len + 1; | 735 size_t second_write_len = packet_len + 1; |
1538 ASSERT_LE(packet_len, kMaxPacketSize); | 736 ASSERT_LE(packet_len, kMaxPacketSize); |
1539 | 737 |
1540 // First send half of the packet worth of data. We are in the batch mode, so | 738 // First send half of the packet worth of data. We are in the batch mode, so |
1541 // should not cause packet serialization. | 739 // should not cause packet serialization. |
1542 QuicConsumedData consumed = | 740 QuicConsumedData consumed = |
1543 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), | 741 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), |
1544 /*offset=*/2, | 742 /*offset=*/2, |
1545 /*fin=*/false, MAY_FEC_PROTECT, nullptr); | 743 /*fin=*/false, nullptr); |
1546 EXPECT_EQ(first_write_len, consumed.bytes_consumed); | 744 EXPECT_EQ(first_write_len, consumed.bytes_consumed); |
1547 EXPECT_FALSE(consumed.fin_consumed); | 745 EXPECT_FALSE(consumed.fin_consumed); |
1548 EXPECT_TRUE(generator_.HasQueuedFrames()); | 746 EXPECT_TRUE(generator_.HasQueuedFrames()); |
1549 | 747 |
1550 // Make sure we have no packets so far. | 748 // Make sure we have no packets so far. |
1551 ASSERT_EQ(0u, packets_.size()); | 749 ASSERT_EQ(0u, packets_.size()); |
1552 | 750 |
1553 // Expect a packet to be flushed. | 751 // Expect a packet to be flushed. |
1554 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 752 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1555 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 753 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
1556 | 754 |
1557 // Increase packet size. Ensure it's immediately enacted. | 755 // Increase packet size. Ensure it's immediately enacted. |
1558 generator_.SetMaxPacketLength(packet_len, /*force=*/true); | 756 generator_.SetMaxPacketLength(packet_len, /*force=*/true); |
1559 EXPECT_EQ(packet_len, generator_.GetMaxPacketLength()); | 757 EXPECT_EQ(packet_len, generator_.GetMaxPacketLength()); |
1560 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 758 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
1561 EXPECT_FALSE(generator_.HasQueuedFrames()); | 759 EXPECT_FALSE(generator_.HasQueuedFrames()); |
1562 | 760 |
1563 // We expect to see exactly one packet serialized after that, because we send | 761 // We expect to see exactly one packet serialized after that, because we send |
1564 // a value somewhat exceeding new max packet size, and the tail data does not | 762 // a value somewhat exceeding new max packet size, and the tail data does not |
1565 // get serialized because we are still in the batch mode. | 763 // get serialized because we are still in the batch mode. |
1566 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 764 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1567 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 765 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
1568 | 766 |
1569 // Send a more than a packet worth of data to the same stream. This should | 767 // Send a more than a packet worth of data to the same stream. This should |
1570 // trigger serialization of one packet, and queue another one. | 768 // trigger serialization of one packet, and queue another one. |
1571 consumed = | 769 consumed = |
1572 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), | 770 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), |
1573 /*offset=*/2 + first_write_len, | 771 /*offset=*/2 + first_write_len, |
1574 /*fin=*/true, MAY_FEC_PROTECT, nullptr); | 772 /*fin=*/true, nullptr); |
1575 EXPECT_EQ(second_write_len, consumed.bytes_consumed); | 773 EXPECT_EQ(second_write_len, consumed.bytes_consumed); |
1576 EXPECT_TRUE(consumed.fin_consumed); | 774 EXPECT_TRUE(consumed.fin_consumed); |
1577 EXPECT_TRUE(generator_.HasQueuedFrames()); | 775 EXPECT_TRUE(generator_.HasQueuedFrames()); |
1578 | 776 |
1579 // We expect the first packet to be underfilled, and the second packet be up | 777 // We expect the first packet to be underfilled, and the second packet be up |
1580 // to the new max packet size. | 778 // to the new max packet size. |
1581 ASSERT_EQ(2u, packets_.size()); | 779 ASSERT_EQ(2u, packets_.size()); |
1582 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 780 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
1583 EXPECT_EQ(packet_len, packets_[1].encrypted_length); | 781 EXPECT_EQ(packet_len, packets_[1].encrypted_length); |
1584 | 782 |
1585 CheckAllPacketsHaveSingleStreamFrame(); | 783 CheckAllPacketsHaveSingleStreamFrame(); |
1586 } | 784 } |
1587 | 785 |
1588 // Test sending an MTU probe, without any surrounding data. | 786 // Test sending an MTU probe, without any surrounding data. |
1589 TEST_P(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_Simple) { | 787 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_Simple) { |
1590 delegate_.SetCanWriteAnything(); | 788 delegate_.SetCanWriteAnything(); |
1591 | 789 |
1592 const size_t target_mtu = kDefaultMaxPacketSize + 100; | 790 const size_t target_mtu = kDefaultMaxPacketSize + 100; |
1593 static_assert(target_mtu < kMaxPacketSize, | 791 static_assert(target_mtu < kMaxPacketSize, |
1594 "The MTU probe used by the test exceeds maximum packet size"); | 792 "The MTU probe used by the test exceeds maximum packet size"); |
1595 | 793 |
1596 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 794 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1597 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 795 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
1598 | 796 |
1599 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | 797 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); |
1600 | 798 |
1601 EXPECT_FALSE(generator_.HasQueuedFrames()); | 799 EXPECT_FALSE(generator_.HasQueuedFrames()); |
1602 ASSERT_EQ(1u, packets_.size()); | 800 ASSERT_EQ(1u, packets_.size()); |
1603 EXPECT_EQ(target_mtu, packets_[0].encrypted_length); | 801 EXPECT_EQ(target_mtu, packets_[0].encrypted_length); |
1604 | 802 |
1605 PacketContents contents; | 803 PacketContents contents; |
1606 contents.num_mtu_discovery_frames = 1; | 804 contents.num_mtu_discovery_frames = 1; |
1607 CheckPacketContains(contents, 0); | 805 CheckPacketContains(contents, 0); |
1608 } | 806 } |
1609 | 807 |
1610 // Test sending an MTU probe. Surround it with data, to ensure that it resets | 808 // Test sending an MTU probe. Surround it with data, to ensure that it resets |
1611 // the MTU to the value before the probe was sent. | 809 // the MTU to the value before the probe was sent. |
1612 TEST_P(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_SurroundedByData) { | 810 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_SurroundedByData) { |
1613 delegate_.SetCanWriteAnything(); | 811 delegate_.SetCanWriteAnything(); |
1614 | 812 |
1615 const size_t target_mtu = kDefaultMaxPacketSize + 100; | 813 const size_t target_mtu = kDefaultMaxPacketSize + 100; |
1616 static_assert(target_mtu < kMaxPacketSize, | 814 static_assert(target_mtu < kMaxPacketSize, |
1617 "The MTU probe used by the test exceeds maximum packet size"); | 815 "The MTU probe used by the test exceeds maximum packet size"); |
1618 | 816 |
1619 // Send enough data so it would always cause two packets to be sent. | 817 // Send enough data so it would always cause two packets to be sent. |
1620 const size_t data_len = target_mtu + 1; | 818 const size_t data_len = target_mtu + 1; |
1621 | 819 |
1622 // Send a total of five packets: two packets before the probe, the probe | 820 // Send a total of five packets: two packets before the probe, the probe |
1623 // itself, and two packets after the probe. | 821 // itself, and two packets after the probe. |
1624 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 822 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1625 .Times(5) | 823 .Times(5) |
1626 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 824 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
1627 | 825 |
1628 // Send data before the MTU probe. | 826 // Send data before the MTU probe. |
1629 QuicConsumedData consumed = | 827 QuicConsumedData consumed = |
1630 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 828 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
1631 /*offset=*/2, | 829 /*offset=*/2, |
1632 /*fin=*/false, MAY_FEC_PROTECT, nullptr); | 830 /*fin=*/false, nullptr); |
1633 EXPECT_EQ(data_len, consumed.bytes_consumed); | 831 EXPECT_EQ(data_len, consumed.bytes_consumed); |
1634 EXPECT_FALSE(consumed.fin_consumed); | 832 EXPECT_FALSE(consumed.fin_consumed); |
1635 EXPECT_FALSE(generator_.HasQueuedFrames()); | 833 EXPECT_FALSE(generator_.HasQueuedFrames()); |
1636 | 834 |
1637 // Send the MTU probe. | 835 // Send the MTU probe. |
1638 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | 836 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); |
1639 EXPECT_FALSE(generator_.HasQueuedFrames()); | 837 EXPECT_FALSE(generator_.HasQueuedFrames()); |
1640 | 838 |
1641 // Send data after the MTU probe. | 839 // Send data after the MTU probe. |
1642 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 840 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
1643 /*offset=*/2 + data_len, | 841 /*offset=*/2 + data_len, |
1644 /*fin=*/true, MAY_FEC_PROTECT, nullptr); | 842 /*fin=*/true, nullptr); |
1645 EXPECT_EQ(data_len, consumed.bytes_consumed); | 843 EXPECT_EQ(data_len, consumed.bytes_consumed); |
1646 EXPECT_TRUE(consumed.fin_consumed); | 844 EXPECT_TRUE(consumed.fin_consumed); |
1647 EXPECT_FALSE(generator_.HasQueuedFrames()); | 845 EXPECT_FALSE(generator_.HasQueuedFrames()); |
1648 | 846 |
1649 ASSERT_EQ(5u, packets_.size()); | 847 ASSERT_EQ(5u, packets_.size()); |
1650 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 848 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
1651 EXPECT_EQ(target_mtu, packets_[2].encrypted_length); | 849 EXPECT_EQ(target_mtu, packets_[2].encrypted_length); |
1652 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length); | 850 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length); |
1653 | 851 |
1654 PacketContents probe_contents; | 852 PacketContents probe_contents; |
1655 probe_contents.num_mtu_discovery_frames = 1; | 853 probe_contents.num_mtu_discovery_frames = 1; |
1656 | 854 |
1657 CheckPacketHasSingleStreamFrame(0); | 855 CheckPacketHasSingleStreamFrame(0); |
1658 CheckPacketHasSingleStreamFrame(1); | 856 CheckPacketHasSingleStreamFrame(1); |
1659 CheckPacketContains(probe_contents, 2); | 857 CheckPacketContains(probe_contents, 2); |
1660 CheckPacketHasSingleStreamFrame(3); | 858 CheckPacketHasSingleStreamFrame(3); |
1661 CheckPacketHasSingleStreamFrame(4); | 859 CheckPacketHasSingleStreamFrame(4); |
1662 } | 860 } |
1663 | 861 |
1664 TEST_P(QuicPacketGeneratorTest, DontCrashOnInvalidStopWaiting) { | 862 TEST_F(QuicPacketGeneratorTest, DontCrashOnInvalidStopWaiting) { |
1665 // Test added to ensure the generator does not crash when an invalid frame is | 863 // Test added to ensure the generator does not crash when an invalid frame is |
1666 // added. Because this is an indication of internal programming errors, | 864 // added. Because this is an indication of internal programming errors, |
1667 // DFATALs are expected. | 865 // DFATALs are expected. |
1668 // A 1 byte packet number length can't encode a gap of 1000. | 866 // A 1 byte packet number length can't encode a gap of 1000. |
1669 QuicPacketCreatorPeer::SetPacketNumber(creator_, 1000); | 867 QuicPacketCreatorPeer::SetPacketNumber(creator_, 1000); |
1670 | 868 |
1671 delegate_.SetCanNotWrite(); | 869 delegate_.SetCanNotWrite(); |
1672 generator_.SetShouldSendAck(true); | 870 generator_.SetShouldSendAck(true); |
1673 delegate_.SetCanWriteAnything(); | 871 delegate_.SetCanWriteAnything(); |
1674 generator_.StartBatchOperations(); | 872 generator_.StartBatchOperations(); |
1675 | 873 |
1676 // Set up frames to write into the creator when control frames are written. | 874 // Set up frames to write into the creator when control frames are written. |
1677 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 875 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
1678 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); | 876 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); |
1679 // Generator should have queued control frames, and creator should be empty. | 877 // Generator should have queued control frames, and creator should be empty. |
1680 EXPECT_TRUE(generator_.HasQueuedFrames()); | 878 EXPECT_TRUE(generator_.HasQueuedFrames()); |
1681 EXPECT_FALSE(creator_->HasPendingFrames()); | 879 EXPECT_FALSE(creator_->HasPendingFrames()); |
1682 | 880 |
1683 // This will not serialize any packets, because of the invalid frame. | 881 // This will not serialize any packets, because of the invalid frame. |
1684 EXPECT_CALL(delegate_, | 882 EXPECT_CALL(delegate_, |
1685 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, | 883 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, |
1686 ConnectionCloseSource::FROM_SELF)); | 884 ConnectionCloseSource::FROM_SELF)); |
1687 EXPECT_DFATAL(generator_.FinishBatchOperations(), | 885 EXPECT_DFATAL(generator_.FinishBatchOperations(), |
1688 "packet_number_length 1 is too small " | 886 "packet_number_length 1 is too small " |
1689 "for least_unacked_delta: 1001"); | 887 "for least_unacked_delta: 1001"); |
1690 } | 888 } |
1691 | 889 |
1692 TEST_P(QuicPacketGeneratorTest, SetCurrentPath) { | 890 TEST_F(QuicPacketGeneratorTest, SetCurrentPath) { |
1693 delegate_.SetCanWriteAnything(); | 891 delegate_.SetCanWriteAnything(); |
1694 generator_.StartBatchOperations(); | 892 generator_.StartBatchOperations(); |
1695 | 893 |
1696 QuicConsumedData consumed = generator_.ConsumeData( | 894 QuicConsumedData consumed = generator_.ConsumeData( |
1697 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); | 895 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); |
1698 EXPECT_EQ(3u, consumed.bytes_consumed); | 896 EXPECT_EQ(3u, consumed.bytes_consumed); |
1699 EXPECT_TRUE(consumed.fin_consumed); | 897 EXPECT_TRUE(consumed.fin_consumed); |
1700 EXPECT_TRUE(generator_.HasQueuedFrames()); | 898 EXPECT_TRUE(generator_.HasQueuedFrames()); |
1701 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | 899 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); |
1702 // Does not change current path. | 900 // Does not change current path. |
1703 generator_.SetCurrentPath(kDefaultPathId, 1, 0); | 901 generator_.SetCurrentPath(kDefaultPathId, 1, 0); |
1704 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | 902 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); |
1705 | 903 |
1706 // Try to switch path when a packet is under construction. | 904 // Try to switch path when a packet is under construction. |
1707 QuicPathId kTestPathId1 = 1; | 905 QuicPathId kTestPathId1 = 1; |
1708 EXPECT_DFATAL(generator_.SetCurrentPath(kTestPathId1, 1, 0), | 906 EXPECT_DFATAL(generator_.SetCurrentPath(kTestPathId1, 1, 0), |
1709 "Unable to change paths when a packet is under construction"); | 907 "Unable to change paths when a packet is under construction"); |
1710 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | 908 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); |
1711 | 909 |
1712 // Try to switch path after current open packet gets serialized. | 910 // Try to switch path after current open packet gets serialized. |
1713 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 911 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1714 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 912 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
1715 generator_.FlushAllQueuedFrames(); | 913 generator_.FlushAllQueuedFrames(); |
1716 EXPECT_FALSE(generator_.HasQueuedFrames()); | 914 EXPECT_FALSE(generator_.HasQueuedFrames()); |
1717 generator_.SetCurrentPath(kTestPathId1, 1, 0); | 915 generator_.SetCurrentPath(kTestPathId1, 1, 0); |
1718 EXPECT_EQ(kTestPathId1, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | 916 EXPECT_EQ(kTestPathId1, QuicPacketCreatorPeer::GetCurrentPath(creator_)); |
1719 } | 917 } |
1720 | 918 |
1721 } // namespace test | 919 } // namespace test |
1722 } // namespace net | 920 } // namespace net |
OLD | NEW |