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

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

Issue 2193073003: Move shared files in net/quic/ into net/quic/core/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: io_thread_unittest.cc Created 4 years, 4 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_packet_writer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "net/quic/quic_packet_generator.h"
6
7 #include <cstdint>
8 #include <memory>
9 #include <string>
10
11 #include "base/macros.h"
12 #include "net/quic/crypto/crypto_protocol.h"
13 #include "net/quic/crypto/null_encrypter.h"
14 #include "net/quic/crypto/quic_decrypter.h"
15 #include "net/quic/crypto/quic_encrypter.h"
16 #include "net/quic/quic_flags.h"
17 #include "net/quic/quic_simple_buffer_allocator.h"
18 #include "net/quic/quic_utils.h"
19 #include "net/quic/test_tools/quic_packet_creator_peer.h"
20 #include "net/quic/test_tools/quic_packet_generator_peer.h"
21 #include "net/quic/test_tools/quic_test_utils.h"
22 #include "net/quic/test_tools/simple_quic_framer.h"
23 #include "net/test/gtest_util.h"
24 #include "testing/gmock/include/gmock/gmock.h"
25 #include "testing/gtest/include/gtest/gtest.h"
26
27 using base::StringPiece;
28 using std::string;
29 using std::vector;
30 using testing::InSequence;
31 using testing::Return;
32 using testing::StrictMock;
33 using testing::_;
34
35 namespace net {
36 namespace test {
37 namespace {
38
39 class MockDelegate : public QuicPacketGenerator::DelegateInterface {
40 public:
41 MockDelegate() {}
42 ~MockDelegate() override {}
43
44 MOCK_METHOD2(ShouldGeneratePacket,
45 bool(HasRetransmittableData retransmittable,
46 IsHandshake handshake));
47 MOCK_METHOD0(GetUpdatedAckFrame, const QuicFrame());
48 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*));
49 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet));
50 MOCK_METHOD3(OnUnrecoverableError,
51 void(QuicErrorCode, const string&, ConnectionCloseSource));
52
53 void SetCanWriteAnything() {
54 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true));
55 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
56 .WillRepeatedly(Return(true));
57 }
58
59 void SetCanNotWrite() {
60 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
61 .WillRepeatedly(Return(false));
62 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
63 .WillRepeatedly(Return(false));
64 }
65
66 // Use this when only ack frames should be allowed to be written.
67 void SetCanWriteOnlyNonRetransmittable() {
68 EXPECT_CALL(*this, ShouldGeneratePacket(_, _))
69 .WillRepeatedly(Return(false));
70 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _))
71 .WillRepeatedly(Return(true));
72 }
73
74 private:
75 DISALLOW_COPY_AND_ASSIGN(MockDelegate);
76 };
77
78 // Simple struct for describing the contents of a packet.
79 // Useful in conjunction with a SimpleQuicFrame for validating that a packet
80 // contains the expected frames.
81 struct PacketContents {
82 PacketContents()
83 : num_ack_frames(0),
84 num_connection_close_frames(0),
85 num_goaway_frames(0),
86 num_rst_stream_frames(0),
87 num_stop_waiting_frames(0),
88 num_stream_frames(0),
89 num_ping_frames(0),
90 num_mtu_discovery_frames(0) {}
91
92 size_t num_ack_frames;
93 size_t num_connection_close_frames;
94 size_t num_goaway_frames;
95 size_t num_rst_stream_frames;
96 size_t num_stop_waiting_frames;
97 size_t num_stream_frames;
98 size_t num_ping_frames;
99 size_t num_mtu_discovery_frames;
100 };
101
102 } // namespace
103
104 class QuicPacketGeneratorTest : public ::testing::Test {
105 public:
106 QuicPacketGeneratorTest()
107 : framer_(QuicSupportedVersions(),
108 QuicTime::Zero(),
109 Perspective::IS_CLIENT),
110 generator_(42, &framer_, &random_, &buffer_allocator_, &delegate_),
111 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)) {
112 // TODO(ianswett): Fix this test so it uses a non-null encrypter.
113 FLAGS_quic_never_write_unencrypted_data = false;
114 }
115
116 ~QuicPacketGeneratorTest() override {
117 for (SerializedPacket& packet : packets_) {
118 delete[] packet.encrypted_buffer;
119 QuicUtils::ClearSerializedPacket(&packet);
120 }
121 }
122
123 void SavePacket(SerializedPacket* packet) {
124 packet->encrypted_buffer = QuicUtils::CopyBuffer(*packet);
125 packets_.push_back(*packet);
126 packet->encrypted_buffer = nullptr;
127 packet->retransmittable_frames.clear();
128 }
129
130 protected:
131 QuicRstStreamFrame* CreateRstStreamFrame() {
132 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0);
133 }
134
135 QuicGoAwayFrame* CreateGoAwayFrame() {
136 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string());
137 }
138
139 void CheckPacketContains(const PacketContents& contents,
140 size_t packet_index) {
141 ASSERT_GT(packets_.size(), packet_index);
142 const SerializedPacket& packet = packets_[packet_index];
143 size_t num_retransmittable_frames =
144 contents.num_connection_close_frames + contents.num_goaway_frames +
145 contents.num_rst_stream_frames + contents.num_stream_frames +
146 contents.num_ping_frames;
147 size_t num_frames =
148 contents.num_ack_frames + contents.num_stop_waiting_frames +
149 contents.num_mtu_discovery_frames + num_retransmittable_frames;
150
151 if (num_retransmittable_frames == 0) {
152 ASSERT_TRUE(packet.retransmittable_frames.empty());
153 } else {
154 ASSERT_FALSE(packet.retransmittable_frames.empty());
155 EXPECT_EQ(num_retransmittable_frames,
156 packet.retransmittable_frames.size());
157 }
158
159 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
160 ASSERT_TRUE(simple_framer_.ProcessPacket(
161 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
162 EXPECT_EQ(num_frames, simple_framer_.num_frames());
163 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size());
164 EXPECT_EQ(contents.num_connection_close_frames,
165 simple_framer_.connection_close_frames().size());
166 EXPECT_EQ(contents.num_goaway_frames,
167 simple_framer_.goaway_frames().size());
168 EXPECT_EQ(contents.num_rst_stream_frames,
169 simple_framer_.rst_stream_frames().size());
170 EXPECT_EQ(contents.num_stream_frames,
171 simple_framer_.stream_frames().size());
172 EXPECT_EQ(contents.num_stop_waiting_frames,
173 simple_framer_.stop_waiting_frames().size());
174
175 // From the receiver's perspective, MTU discovery frames are ping frames.
176 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames,
177 simple_framer_.ping_frames().size());
178 }
179
180 void CheckPacketHasSingleStreamFrame(size_t packet_index) {
181 ASSERT_GT(packets_.size(), packet_index);
182 const SerializedPacket& packet = packets_[packet_index];
183 ASSERT_FALSE(packet.retransmittable_frames.empty());
184 EXPECT_EQ(1u, packet.retransmittable_frames.size());
185 ASSERT_TRUE(packet.encrypted_buffer != nullptr);
186 ASSERT_TRUE(simple_framer_.ProcessPacket(
187 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length)));
188 EXPECT_EQ(1u, simple_framer_.num_frames());
189 EXPECT_EQ(1u, simple_framer_.stream_frames().size());
190 }
191
192 void CheckAllPacketsHaveSingleStreamFrame() {
193 for (size_t i = 0; i < packets_.size(); i++) {
194 CheckPacketHasSingleStreamFrame(i);
195 }
196 }
197
198 QuicIOVector CreateData(size_t len) {
199 data_array_.reset(new char[len]);
200 memset(data_array_.get(), '?', len);
201 iov_.iov_base = data_array_.get();
202 iov_.iov_len = len;
203 return QuicIOVector(&iov_, 1, len);
204 }
205
206 QuicIOVector MakeIOVector(StringPiece s) {
207 return ::net::MakeIOVector(s, &iov_);
208 }
209
210 QuicFramer framer_;
211 MockRandom random_;
212 SimpleBufferAllocator buffer_allocator_;
213 StrictMock<MockDelegate> delegate_;
214 QuicPacketGenerator generator_;
215 QuicPacketCreator* creator_;
216 SimpleQuicFramer simple_framer_;
217 vector<SerializedPacket> packets_;
218 QuicAckFrame ack_frame_;
219
220 private:
221 std::unique_ptr<char[]> data_array_;
222 struct iovec iov_;
223 };
224
225 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate {
226 public:
227 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&));
228 };
229
230 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) {
231 delegate_.SetCanNotWrite();
232
233 generator_.SetShouldSendAck(false);
234 EXPECT_TRUE(generator_.HasQueuedFrames());
235 }
236
237 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) {
238 StrictMock<MockDebugDelegate> debug_delegate;
239
240 generator_.set_debug_delegate(&debug_delegate);
241 delegate_.SetCanWriteOnlyNonRetransmittable();
242 generator_.StartBatchOperations();
243
244 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
245 .WillOnce(Return(QuicFrame(&ack_frame_)));
246 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1);
247
248 generator_.SetShouldSendAck(false);
249 EXPECT_TRUE(generator_.HasQueuedFrames());
250 }
251
252 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) {
253 delegate_.SetCanWriteOnlyNonRetransmittable();
254
255 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
256 .WillOnce(Return(QuicFrame(&ack_frame_)));
257 EXPECT_CALL(delegate_, OnSerializedPacket(_))
258 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
259
260 generator_.SetShouldSendAck(false);
261 EXPECT_FALSE(generator_.HasQueuedFrames());
262
263 PacketContents contents;
264 contents.num_ack_frames = 1;
265 CheckPacketContains(contents, 0);
266 }
267
268 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) {
269 // Make sure that calling SetShouldSendAck multiple times does not result in a
270 // crash. Previously this would result in multiple QuicFrames queued in the
271 // packet generator, with all but the last with internal pointers to freed
272 // memory.
273 delegate_.SetCanWriteAnything();
274
275 // Only one AckFrame should be created.
276 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
277 .WillOnce(Return(QuicFrame(&ack_frame_)));
278 EXPECT_CALL(delegate_, OnSerializedPacket(_))
279 .Times(1)
280 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
281
282 generator_.StartBatchOperations();
283 generator_.SetShouldSendAck(false);
284 generator_.SetShouldSendAck(false);
285 generator_.FinishBatchOperations();
286 }
287
288 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) {
289 delegate_.SetCanNotWrite();
290
291 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
292 EXPECT_TRUE(generator_.HasQueuedFrames());
293 }
294
295 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) {
296 delegate_.SetCanWriteOnlyNonRetransmittable();
297
298 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
299 EXPECT_TRUE(generator_.HasQueuedFrames());
300 }
301
302 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) {
303 delegate_.SetCanWriteAnything();
304 generator_.StartBatchOperations();
305
306 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
307 EXPECT_TRUE(generator_.HasQueuedFrames());
308 }
309
310 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) {
311 delegate_.SetCanNotWrite();
312 generator_.StartBatchOperations();
313
314 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
315 EXPECT_TRUE(generator_.HasQueuedFrames());
316 generator_.FinishBatchOperations();
317 EXPECT_TRUE(generator_.HasQueuedFrames());
318
319 EXPECT_CALL(delegate_, OnSerializedPacket(_))
320 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
321 generator_.FlushAllQueuedFrames();
322 EXPECT_FALSE(generator_.HasQueuedFrames());
323
324 PacketContents contents;
325 contents.num_rst_stream_frames = 1;
326 CheckPacketContains(contents, 0);
327 }
328
329 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) {
330 delegate_.SetCanWriteAnything();
331
332 EXPECT_CALL(delegate_, OnSerializedPacket(_))
333 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
334
335 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
336 EXPECT_FALSE(generator_.HasQueuedFrames());
337
338 PacketContents contents;
339 contents.num_rst_stream_frames = 1;
340 CheckPacketContains(contents, 0);
341 }
342
343 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) {
344 delegate_.SetCanNotWrite();
345
346 QuicConsumedData consumed = generator_.ConsumeData(
347 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr);
348 EXPECT_EQ(0u, consumed.bytes_consumed);
349 EXPECT_FALSE(consumed.fin_consumed);
350 EXPECT_FALSE(generator_.HasQueuedFrames());
351 }
352
353 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) {
354 delegate_.SetCanWriteAnything();
355 generator_.StartBatchOperations();
356
357 QuicConsumedData consumed = generator_.ConsumeData(
358 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr);
359 EXPECT_EQ(3u, consumed.bytes_consumed);
360 EXPECT_TRUE(consumed.fin_consumed);
361 EXPECT_TRUE(generator_.HasQueuedFrames());
362 }
363
364 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) {
365 delegate_.SetCanWriteAnything();
366
367 EXPECT_CALL(delegate_, OnSerializedPacket(_))
368 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
369 QuicConsumedData consumed = generator_.ConsumeData(
370 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr);
371 EXPECT_EQ(3u, consumed.bytes_consumed);
372 EXPECT_TRUE(consumed.fin_consumed);
373 EXPECT_FALSE(generator_.HasQueuedFrames());
374
375 PacketContents contents;
376 contents.num_stream_frames = 1;
377 CheckPacketContains(contents, 0);
378 }
379
380 // Test the behavior of ConsumeData when the data consumed is for the crypto
381 // handshake stream. Ensure that the packet is always sent and padded even if
382 // the generator operates in batch mode.
383 TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake) {
384 delegate_.SetCanWriteAnything();
385 generator_.StartBatchOperations();
386
387 EXPECT_CALL(delegate_, OnSerializedPacket(_))
388 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
389 QuicConsumedData consumed = generator_.ConsumeData(
390 kCryptoStreamId, MakeIOVector("foo"), 0, false, nullptr);
391 EXPECT_EQ(3u, consumed.bytes_consumed);
392 EXPECT_FALSE(generator_.HasQueuedFrames());
393
394 PacketContents contents;
395 contents.num_stream_frames = 1;
396 CheckPacketContains(contents, 0);
397
398 ASSERT_EQ(1u, packets_.size());
399 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength());
400 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
401 }
402
403 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) {
404 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0,
405 false, nullptr),
406 "Attempt to consume empty data without FIN.");
407 }
408
409 TEST_F(QuicPacketGeneratorTest,
410 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
411 delegate_.SetCanWriteAnything();
412 generator_.StartBatchOperations();
413
414 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true,
415 nullptr);
416 QuicConsumedData consumed =
417 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr);
418 EXPECT_EQ(4u, consumed.bytes_consumed);
419 EXPECT_FALSE(consumed.fin_consumed);
420 EXPECT_TRUE(generator_.HasQueuedFrames());
421 }
422
423 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) {
424 delegate_.SetCanWriteAnything();
425 generator_.StartBatchOperations();
426
427 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true,
428 nullptr);
429 QuicConsumedData consumed =
430 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr);
431 EXPECT_EQ(4u, consumed.bytes_consumed);
432 EXPECT_FALSE(consumed.fin_consumed);
433 EXPECT_TRUE(generator_.HasQueuedFrames());
434
435 // Now both frames will be flushed out.
436 EXPECT_CALL(delegate_, OnSerializedPacket(_))
437 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
438 generator_.FinishBatchOperations();
439 EXPECT_FALSE(generator_.HasQueuedFrames());
440
441 PacketContents contents;
442 contents.num_stream_frames = 2;
443 CheckPacketContains(contents, 0);
444 }
445
446 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) {
447 // Set the packet size be enough for two stream frames with 0 stream offset,
448 // but not enough for a stream frame of 0 offset and one with non-zero offset.
449 size_t length =
450 NullEncrypter().GetCiphertextSize(0) +
451 GetPacketHeaderSize(
452 framer_.version(), creator_->connection_id_length(), kIncludeVersion,
453 !kIncludePathId, !kIncludeDiversificationNonce,
454 QuicPacketCreatorPeer::NextPacketNumberLength(creator_)) +
455 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger
456 // than the GetMinStreamFrameSize.
457 QuicFramer::GetMinStreamFrameSize(1, 0, false) + 3 +
458 QuicFramer::GetMinStreamFrameSize(1, 0, true) + 1;
459 generator_.SetMaxPacketLength(length);
460 delegate_.SetCanWriteAnything();
461 {
462 InSequence dummy;
463 EXPECT_CALL(delegate_, OnSerializedPacket(_))
464 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
465 EXPECT_CALL(delegate_, OnSerializedPacket(_))
466 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
467 }
468 generator_.StartBatchOperations();
469 // Queue enough data to prevent a stream frame with a non-zero offset from
470 // fitting.
471 QuicConsumedData consumed = generator_.ConsumeData(
472 kHeadersStreamId, MakeIOVector("foo"), 0, false, nullptr);
473 EXPECT_EQ(3u, consumed.bytes_consumed);
474 EXPECT_FALSE(consumed.fin_consumed);
475 EXPECT_TRUE(generator_.HasQueuedFrames());
476
477 // This frame will not fit with the existing frame, causing the queued frame
478 // to be serialized, and it will be added to a new open packet.
479 consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3,
480 true, nullptr);
481 EXPECT_EQ(3u, consumed.bytes_consumed);
482 EXPECT_TRUE(consumed.fin_consumed);
483 EXPECT_TRUE(generator_.HasQueuedFrames());
484
485 creator_->Flush();
486 EXPECT_FALSE(generator_.HasQueuedFrames());
487
488 PacketContents contents;
489 contents.num_stream_frames = 1;
490 CheckPacketContains(contents, 0);
491 CheckPacketContains(contents, 1);
492 }
493
494 TEST_F(QuicPacketGeneratorTest, ConsumeDataFastPath) {
495 delegate_.SetCanWriteAnything();
496
497 // Create a 10000 byte IOVector.
498 QuicIOVector iov(CreateData(10000));
499 EXPECT_CALL(delegate_, OnSerializedPacket(_))
500 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
501 QuicConsumedData consumed =
502 generator_.ConsumeDataFastPath(kHeadersStreamId, iov, 0, true, nullptr);
503 EXPECT_EQ(10000u, consumed.bytes_consumed);
504 EXPECT_TRUE(consumed.fin_consumed);
505 EXPECT_FALSE(generator_.HasQueuedFrames());
506
507 PacketContents contents;
508 contents.num_stream_frames = 1;
509 CheckPacketContains(contents, 0);
510 }
511
512 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) {
513 delegate_.SetCanNotWrite();
514
515 generator_.SetShouldSendAck(false);
516 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
517 EXPECT_TRUE(generator_.HasQueuedFrames());
518
519 delegate_.SetCanWriteAnything();
520
521 generator_.StartBatchOperations();
522
523 // When the first write operation is invoked, the ack frame will be returned.
524 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
525 .WillOnce(Return(QuicFrame(&ack_frame_)));
526
527 // Send some data and a control frame
528 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr);
529 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
530
531 // All five frames will be flushed out in a single packet.
532 EXPECT_CALL(delegate_, OnSerializedPacket(_))
533 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
534 generator_.FinishBatchOperations();
535 EXPECT_FALSE(generator_.HasQueuedFrames());
536
537 PacketContents contents;
538 contents.num_ack_frames = 1;
539 contents.num_goaway_frames = 1;
540 contents.num_rst_stream_frames = 1;
541 contents.num_stream_frames = 1;
542 CheckPacketContains(contents, 0);
543 }
544
545 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) {
546 delegate_.SetCanNotWrite();
547
548 generator_.SetShouldSendAck(false);
549 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
550 EXPECT_TRUE(generator_.HasQueuedFrames());
551
552 delegate_.SetCanWriteAnything();
553
554 generator_.StartBatchOperations();
555
556 // When the first write operation is invoked, the ack frame will be returned.
557 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
558 .WillOnce(Return(QuicFrame(&ack_frame_)));
559
560 {
561 InSequence dummy;
562 // All five frames will be flushed out in a single packet
563 EXPECT_CALL(delegate_, OnSerializedPacket(_))
564 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
565 EXPECT_CALL(delegate_, OnSerializedPacket(_))
566 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
567 }
568
569 // Send enough data to exceed one packet
570 size_t data_len = kDefaultMaxPacketSize + 100;
571 QuicConsumedData consumed =
572 generator_.ConsumeData(3, CreateData(data_len), 0, true, nullptr);
573 EXPECT_EQ(data_len, consumed.bytes_consumed);
574 EXPECT_TRUE(consumed.fin_consumed);
575 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
576
577 generator_.FinishBatchOperations();
578 EXPECT_FALSE(generator_.HasQueuedFrames());
579
580 // The first packet should have the queued data and part of the stream data.
581 PacketContents contents;
582 contents.num_ack_frames = 1;
583 contents.num_rst_stream_frames = 1;
584 contents.num_stream_frames = 1;
585 CheckPacketContains(contents, 0);
586
587 // The second should have the remainder of the stream data.
588 PacketContents contents2;
589 contents2.num_goaway_frames = 1;
590 contents2.num_stream_frames = 1;
591 CheckPacketContains(contents2, 1);
592 }
593
594 TEST_F(QuicPacketGeneratorTest, TestConnectionIdLength) {
595 generator_.SetConnectionIdLength(0);
596 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID, creator_->connection_id_length());
597
598 for (size_t i = 1; i < 10; i++) {
599 generator_.SetConnectionIdLength(i);
600 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length());
601 }
602 }
603
604 // Test whether SetMaxPacketLength() works in the situation when the queue is
605 // empty, and we send three packets worth of data.
606 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Initial) {
607 delegate_.SetCanWriteAnything();
608
609 // Send enough data for three packets.
610 size_t data_len = 3 * kDefaultMaxPacketSize + 1;
611 size_t packet_len = kDefaultMaxPacketSize + 100;
612 ASSERT_LE(packet_len, kMaxPacketSize);
613 generator_.SetMaxPacketLength(packet_len);
614 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength());
615
616 EXPECT_CALL(delegate_, OnSerializedPacket(_))
617 .Times(3)
618 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
619 QuicConsumedData consumed =
620 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len),
621 /*offset=*/2,
622 /*fin=*/true, nullptr);
623 EXPECT_EQ(data_len, consumed.bytes_consumed);
624 EXPECT_TRUE(consumed.fin_consumed);
625 EXPECT_FALSE(generator_.HasQueuedFrames());
626
627 // We expect three packets, and first two of them have to be of packet_len
628 // size. We check multiple packets (instead of just one) because we want to
629 // ensure that |max_packet_length_| does not get changed incorrectly by the
630 // generator after first packet is serialized.
631 ASSERT_EQ(3u, packets_.size());
632 EXPECT_EQ(packet_len, packets_[0].encrypted_length);
633 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
634 CheckAllPacketsHaveSingleStreamFrame();
635 }
636
637 // Test whether SetMaxPacketLength() works in the situation when we first write
638 // data, then change packet size, then write data again.
639 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Middle) {
640 delegate_.SetCanWriteAnything();
641
642 // We send enough data to overflow default packet length, but not the altered
643 // one.
644 size_t data_len = kDefaultMaxPacketSize;
645 size_t packet_len = kDefaultMaxPacketSize + 100;
646 ASSERT_LE(packet_len, kMaxPacketSize);
647
648 // We expect to see three packets in total.
649 EXPECT_CALL(delegate_, OnSerializedPacket(_))
650 .Times(3)
651 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
652
653 // Send two packets before packet size change.
654 QuicConsumedData consumed =
655 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len),
656 /*offset=*/2,
657 /*fin=*/false, nullptr);
658 EXPECT_EQ(data_len, consumed.bytes_consumed);
659 EXPECT_FALSE(consumed.fin_consumed);
660 EXPECT_FALSE(generator_.HasQueuedFrames());
661
662 // Make sure we already have two packets.
663 ASSERT_EQ(2u, packets_.size());
664
665 // Increase packet size.
666 generator_.SetMaxPacketLength(packet_len);
667 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength());
668
669 // Send a packet after packet size change.
670 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len),
671 2 + data_len,
672 /*fin=*/true, nullptr);
673 EXPECT_EQ(data_len, consumed.bytes_consumed);
674 EXPECT_TRUE(consumed.fin_consumed);
675 EXPECT_FALSE(generator_.HasQueuedFrames());
676
677 // We expect first data chunk to get fragmented, but the second one to fit
678 // into a single packet.
679 ASSERT_EQ(3u, packets_.size());
680 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
681 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length);
682 CheckAllPacketsHaveSingleStreamFrame();
683 }
684
685 // Test whether SetMaxPacketLength() works correctly when we force the change of
686 // the packet size in the middle of the batched packet.
687 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) {
688 delegate_.SetCanWriteAnything();
689 generator_.StartBatchOperations();
690
691 size_t first_write_len = kDefaultMaxPacketSize / 2;
692 size_t packet_len = kDefaultMaxPacketSize + 100;
693 size_t second_write_len = packet_len + 1;
694 ASSERT_LE(packet_len, kMaxPacketSize);
695
696 // First send half of the packet worth of data. We are in the batch mode, so
697 // should not cause packet serialization.
698 QuicConsumedData consumed =
699 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len),
700 /*offset=*/2,
701 /*fin=*/false, nullptr);
702 EXPECT_EQ(first_write_len, consumed.bytes_consumed);
703 EXPECT_FALSE(consumed.fin_consumed);
704 EXPECT_TRUE(generator_.HasQueuedFrames());
705
706 // Make sure we have no packets so far.
707 ASSERT_EQ(0u, packets_.size());
708
709 // Expect a packet to be flushed.
710 EXPECT_CALL(delegate_, OnSerializedPacket(_))
711 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
712
713 // Increase packet size after flushing all frames.
714 // Ensure it's immediately enacted.
715 generator_.FlushAllQueuedFrames();
716 generator_.SetMaxPacketLength(packet_len);
717 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength());
718 EXPECT_FALSE(generator_.HasQueuedFrames());
719
720 // We expect to see exactly one packet serialized after that, because we send
721 // a value somewhat exceeding new max packet size, and the tail data does not
722 // get serialized because we are still in the batch mode.
723 EXPECT_CALL(delegate_, OnSerializedPacket(_))
724 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
725
726 // Send a more than a packet worth of data to the same stream. This should
727 // trigger serialization of one packet, and queue another one.
728 consumed =
729 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len),
730 /*offset=*/2 + first_write_len,
731 /*fin=*/true, nullptr);
732 EXPECT_EQ(second_write_len, consumed.bytes_consumed);
733 EXPECT_TRUE(consumed.fin_consumed);
734 EXPECT_TRUE(generator_.HasQueuedFrames());
735
736 // We expect the first packet to be underfilled, and the second packet be up
737 // to the new max packet size.
738 ASSERT_EQ(2u, packets_.size());
739 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length);
740 EXPECT_EQ(packet_len, packets_[1].encrypted_length);
741
742 CheckAllPacketsHaveSingleStreamFrame();
743 }
744
745 // Test sending an MTU probe, without any surrounding data.
746 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_Simple) {
747 delegate_.SetCanWriteAnything();
748
749 const size_t target_mtu = kDefaultMaxPacketSize + 100;
750 static_assert(target_mtu < kMaxPacketSize,
751 "The MTU probe used by the test exceeds maximum packet size");
752
753 EXPECT_CALL(delegate_, OnSerializedPacket(_))
754 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
755
756 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr);
757
758 EXPECT_FALSE(generator_.HasQueuedFrames());
759 ASSERT_EQ(1u, packets_.size());
760 EXPECT_EQ(target_mtu, packets_[0].encrypted_length);
761
762 PacketContents contents;
763 contents.num_mtu_discovery_frames = 1;
764 CheckPacketContains(contents, 0);
765 }
766
767 // Test sending an MTU probe. Surround it with data, to ensure that it resets
768 // the MTU to the value before the probe was sent.
769 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_SurroundedByData) {
770 delegate_.SetCanWriteAnything();
771
772 const size_t target_mtu = kDefaultMaxPacketSize + 100;
773 static_assert(target_mtu < kMaxPacketSize,
774 "The MTU probe used by the test exceeds maximum packet size");
775
776 // Send enough data so it would always cause two packets to be sent.
777 const size_t data_len = target_mtu + 1;
778
779 // Send a total of five packets: two packets before the probe, the probe
780 // itself, and two packets after the probe.
781 EXPECT_CALL(delegate_, OnSerializedPacket(_))
782 .Times(5)
783 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
784
785 // Send data before the MTU probe.
786 QuicConsumedData consumed =
787 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len),
788 /*offset=*/2,
789 /*fin=*/false, nullptr);
790 EXPECT_EQ(data_len, consumed.bytes_consumed);
791 EXPECT_FALSE(consumed.fin_consumed);
792 EXPECT_FALSE(generator_.HasQueuedFrames());
793
794 // Send the MTU probe.
795 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr);
796 EXPECT_FALSE(generator_.HasQueuedFrames());
797
798 // Send data after the MTU probe.
799 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len),
800 /*offset=*/2 + data_len,
801 /*fin=*/true, nullptr);
802 EXPECT_EQ(data_len, consumed.bytes_consumed);
803 EXPECT_TRUE(consumed.fin_consumed);
804 EXPECT_FALSE(generator_.HasQueuedFrames());
805
806 ASSERT_EQ(5u, packets_.size());
807 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length);
808 EXPECT_EQ(target_mtu, packets_[2].encrypted_length);
809 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length);
810
811 PacketContents probe_contents;
812 probe_contents.num_mtu_discovery_frames = 1;
813
814 CheckPacketHasSingleStreamFrame(0);
815 CheckPacketHasSingleStreamFrame(1);
816 CheckPacketContains(probe_contents, 2);
817 CheckPacketHasSingleStreamFrame(3);
818 CheckPacketHasSingleStreamFrame(4);
819 }
820
821 TEST_F(QuicPacketGeneratorTest, DontCrashOnInvalidStopWaiting) {
822 // Test added to ensure the generator does not crash when an invalid frame is
823 // added. Because this is an indication of internal programming errors,
824 // DFATALs are expected.
825 // A 1 byte packet number length can't encode a gap of 1000.
826 QuicPacketCreatorPeer::SetPacketNumber(creator_, 1000);
827
828 delegate_.SetCanNotWrite();
829 generator_.SetShouldSendAck(true);
830 delegate_.SetCanWriteAnything();
831 generator_.StartBatchOperations();
832
833 // Set up frames to write into the creator when control frames are written.
834 EXPECT_CALL(delegate_, GetUpdatedAckFrame())
835 .WillOnce(Return(QuicFrame(&ack_frame_)));
836 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_));
837 // Generator should have queued control frames, and creator should be empty.
838 EXPECT_TRUE(generator_.HasQueuedFrames());
839 EXPECT_FALSE(creator_->HasPendingFrames());
840
841 // This will not serialize any packets, because of the invalid frame.
842 EXPECT_CALL(delegate_,
843 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _,
844 ConnectionCloseSource::FROM_SELF));
845 EXPECT_DFATAL(generator_.FinishBatchOperations(),
846 "packet_number_length 1 is too small "
847 "for least_unacked_delta: 1001");
848 }
849
850 TEST_F(QuicPacketGeneratorTest, SetCurrentPath) {
851 delegate_.SetCanWriteAnything();
852 generator_.StartBatchOperations();
853
854 QuicConsumedData consumed = generator_.ConsumeData(
855 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr);
856 EXPECT_EQ(3u, consumed.bytes_consumed);
857 EXPECT_TRUE(consumed.fin_consumed);
858 EXPECT_TRUE(generator_.HasQueuedFrames());
859 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_));
860 // Does not change current path.
861 generator_.SetCurrentPath(kDefaultPathId, 1, 0);
862 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_));
863
864 // Try to switch path when a packet is under construction.
865 QuicPathId kTestPathId1 = 1;
866 EXPECT_DFATAL(generator_.SetCurrentPath(kTestPathId1, 1, 0),
867 "Unable to change paths when a packet is under construction");
868 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_));
869
870 // Try to switch path after current open packet gets serialized.
871 EXPECT_CALL(delegate_, OnSerializedPacket(_))
872 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
873 generator_.FlushAllQueuedFrames();
874 EXPECT_FALSE(generator_.HasQueuedFrames());
875 generator_.SetCurrentPath(kTestPathId1, 1, 0);
876 EXPECT_EQ(kTestPathId1, QuicPacketCreatorPeer::GetCurrentPath(creator_));
877 }
878
879 } // namespace test
880 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_packet_generator.cc ('k') | net/quic/quic_packet_writer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698