Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(519)

Side by Side Diff: net/quic/quic_packet_generator_test.cc

Issue 1784903003: Remove FEC from send path. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@114770052
Patch Set: Restore accidentally removed OnRttChanged call Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_packet_generator.cc ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_packet_generator.cc ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698