OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_packet_creator.h" | 5 #include "net/quic/quic_packet_creator.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "net/quic/crypto/null_encrypter.h" | 8 #include "net/quic/crypto/null_encrypter.h" |
9 #include "net/quic/crypto/quic_decrypter.h" | 9 #include "net/quic/crypto/quic_decrypter.h" |
10 #include "net/quic/crypto/quic_encrypter.h" | 10 #include "net/quic/crypto/quic_encrypter.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 using testing::Return; | 24 using testing::Return; |
25 using testing::SaveArg; | 25 using testing::SaveArg; |
26 using testing::_; | 26 using testing::_; |
27 | 27 |
28 namespace net { | 28 namespace net { |
29 namespace test { | 29 namespace test { |
30 namespace { | 30 namespace { |
31 | 31 |
32 // Run tests with combinations of {QuicVersion, ToggleVersionSerialization}. | 32 // Run tests with combinations of {QuicVersion, ToggleVersionSerialization}. |
33 struct TestParams { | 33 struct TestParams { |
34 TestParams(QuicVersion version, | 34 TestParams(QuicVersion version, bool version_serialization) |
35 bool version_serialization) | 35 : version(version), version_serialization(version_serialization) {} |
36 : version(version), | |
37 version_serialization(version_serialization) { | |
38 } | |
39 | 36 |
40 friend ostream& operator<<(ostream& os, const TestParams& p) { | 37 friend ostream& operator<<(ostream& os, const TestParams& p) { |
41 os << "{ client_version: " << QuicVersionToString(p.version) | 38 os << "{ client_version: " << QuicVersionToString(p.version) |
42 << " include version: " << p.version_serialization << " }"; | 39 << " include version: " << p.version_serialization << " }"; |
43 return os; | 40 return os; |
44 } | 41 } |
45 | 42 |
46 QuicVersion version; | 43 QuicVersion version; |
47 bool version_serialization; | 44 bool version_serialization; |
48 }; | 45 }; |
49 | 46 |
50 // Constructs various test permutations. | 47 // Constructs various test permutations. |
51 vector<TestParams> GetTestParams() { | 48 vector<TestParams> GetTestParams() { |
52 vector<TestParams> params; | 49 vector<TestParams> params; |
53 QuicVersionVector all_supported_versions = QuicSupportedVersions(); | 50 QuicVersionVector all_supported_versions = QuicSupportedVersions(); |
54 for (size_t i = 0; i < all_supported_versions.size(); ++i) { | 51 for (size_t i = 0; i < all_supported_versions.size(); ++i) { |
55 params.push_back(TestParams(all_supported_versions[i], true)); | 52 params.push_back(TestParams(all_supported_versions[i], true)); |
56 params.push_back(TestParams(all_supported_versions[i], false)); | 53 params.push_back(TestParams(all_supported_versions[i], false)); |
57 } | 54 } |
58 return params; | 55 return params; |
59 } | 56 } |
60 | 57 |
61 class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> { | 58 class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> { |
62 protected: | 59 protected: |
63 QuicPacketCreatorTest() | 60 QuicPacketCreatorTest() |
64 : server_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(), | 61 : server_framer_(SupportedVersions(GetParam().version), |
| 62 QuicTime::Zero(), |
65 true), | 63 true), |
66 client_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(), | 64 client_framer_(SupportedVersions(GetParam().version), |
| 65 QuicTime::Zero(), |
67 false), | 66 false), |
68 sequence_number_(0), | 67 sequence_number_(0), |
69 connection_id_(2), | 68 connection_id_(2), |
70 data_("foo"), | 69 data_("foo"), |
71 creator_(connection_id_, &client_framer_, &mock_random_, false) { | 70 creator_(connection_id_, &client_framer_, &mock_random_, false) { |
72 client_framer_.set_visitor(&framer_visitor_); | 71 client_framer_.set_visitor(&framer_visitor_); |
73 server_framer_.set_visitor(&framer_visitor_); | 72 server_framer_.set_visitor(&framer_visitor_); |
74 } | 73 } |
75 ~QuicPacketCreatorTest() { | 74 ~QuicPacketCreatorTest() {} |
76 } | |
77 | 75 |
78 void ProcessPacket(QuicPacket* packet) { | 76 void ProcessPacket(QuicPacket* packet) { |
79 scoped_ptr<QuicEncryptedPacket> encrypted( | 77 scoped_ptr<QuicEncryptedPacket> encrypted(server_framer_.EncryptPacket( |
80 server_framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number_, | 78 ENCRYPTION_NONE, sequence_number_, *packet)); |
81 *packet)); | |
82 server_framer_.ProcessPacket(*encrypted); | 79 server_framer_.ProcessPacket(*encrypted); |
83 } | 80 } |
84 | 81 |
85 void CheckStreamFrame(const QuicFrame& frame, | 82 void CheckStreamFrame(const QuicFrame& frame, |
86 QuicStreamId stream_id, | 83 QuicStreamId stream_id, |
87 const string& data, | 84 const string& data, |
88 QuicStreamOffset offset, | 85 QuicStreamOffset offset, |
89 bool fin) { | 86 bool fin) { |
90 EXPECT_EQ(STREAM_FRAME, frame.type); | 87 EXPECT_EQ(STREAM_FRAME, frame.type); |
91 ASSERT_TRUE(frame.stream_frame); | 88 ASSERT_TRUE(frame.stream_frame); |
(...skipping 10 matching lines...) Expand all Loading... |
102 return GetPacketHeaderSize(creator_.options()->send_connection_id_length, | 99 return GetPacketHeaderSize(creator_.options()->send_connection_id_length, |
103 kIncludeVersion, | 100 kIncludeVersion, |
104 creator_.options()->send_sequence_number_length, | 101 creator_.options()->send_sequence_number_length, |
105 is_in_fec_group); | 102 is_in_fec_group); |
106 } | 103 } |
107 | 104 |
108 // Returns the number of bytes of overhead that will be added to a packet | 105 // Returns the number of bytes of overhead that will be added to a packet |
109 // of maximum length. | 106 // of maximum length. |
110 size_t GetEncryptionOverhead() { | 107 size_t GetEncryptionOverhead() { |
111 return creator_.options()->max_packet_length - | 108 return creator_.options()->max_packet_length - |
112 client_framer_.GetMaxPlaintextSize( | 109 client_framer_.GetMaxPlaintextSize( |
113 creator_.options()->max_packet_length); | 110 creator_.options()->max_packet_length); |
114 } | 111 } |
115 | 112 |
116 // Returns the number of bytes consumed by the non-data fields of a stream | 113 // Returns the number of bytes consumed by the non-data fields of a stream |
117 // frame, assuming it is the last frame in the packet | 114 // frame, assuming it is the last frame in the packet |
118 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) { | 115 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) { |
119 return QuicFramer::GetMinStreamFrameSize( | 116 return QuicFramer::GetMinStreamFrameSize( |
120 client_framer_.version(), kStreamId, kOffset, true, is_in_fec_group); | 117 client_framer_.version(), kStreamId, kOffset, true, is_in_fec_group); |
121 } | 118 } |
122 | 119 |
123 static const QuicStreamId kStreamId = 1u; | 120 static const QuicStreamId kStreamId = 1u; |
124 static const QuicStreamOffset kOffset = 1u; | 121 static const QuicStreamOffset kOffset = 1u; |
125 | 122 |
126 QuicFrames frames_; | 123 QuicFrames frames_; |
127 QuicFramer server_framer_; | 124 QuicFramer server_framer_; |
128 QuicFramer client_framer_; | 125 QuicFramer client_framer_; |
129 testing::StrictMock<MockFramerVisitor> framer_visitor_; | 126 testing::StrictMock<MockFramerVisitor> framer_visitor_; |
130 QuicPacketSequenceNumber sequence_number_; | 127 QuicPacketSequenceNumber sequence_number_; |
131 QuicConnectionId connection_id_; | 128 QuicConnectionId connection_id_; |
132 string data_; | 129 string data_; |
133 MockRandom mock_random_; | 130 MockRandom mock_random_; |
134 QuicPacketCreator creator_; | 131 QuicPacketCreator creator_; |
135 }; | 132 }; |
136 | 133 |
137 // Run all packet creator tests with all supported versions of QUIC, and with | 134 // Run all packet creator tests with all supported versions of QUIC, and with |
138 // and without version in the packet header. | 135 // and without version in the packet header. |
139 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, | 136 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, |
140 QuicPacketCreatorTest, | 137 QuicPacketCreatorTest, |
141 ::testing::ValuesIn(GetTestParams())); | 138 ::testing::ValuesIn(GetTestParams())); |
142 | 139 |
143 | |
144 TEST_P(QuicPacketCreatorTest, SerializeFrames) { | 140 TEST_P(QuicPacketCreatorTest, SerializeFrames) { |
145 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); | 141 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); |
146 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 142 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
147 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector()))); | 143 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector()))); |
148 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 144 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
149 delete frames_[0].ack_frame; | 145 delete frames_[0].ack_frame; |
150 delete frames_[1].stream_frame; | 146 delete frames_[1].stream_frame; |
151 delete frames_[2].stream_frame; | 147 delete frames_[2].stream_frame; |
152 | 148 |
153 { | 149 { |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 382 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
387 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); | 383 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); |
388 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 384 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
389 | 385 |
390 ProcessPacket(serialized.packet); | 386 ProcessPacket(serialized.packet); |
391 delete serialized.packet; | 387 delete serialized.packet; |
392 } | 388 } |
393 | 389 |
394 TEST_P(QuicPacketCreatorTest, CreateStreamFrame) { | 390 TEST_P(QuicPacketCreatorTest, CreateStreamFrame) { |
395 QuicFrame frame; | 391 QuicFrame frame; |
396 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, | 392 size_t consumed = |
397 false, &frame); | 393 creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, false, &frame); |
398 EXPECT_EQ(4u, consumed); | 394 EXPECT_EQ(4u, consumed); |
399 CheckStreamFrame(frame, 1u, "test", 0u, false); | 395 CheckStreamFrame(frame, 1u, "test", 0u, false); |
400 delete frame.stream_frame; | 396 delete frame.stream_frame; |
401 } | 397 } |
402 | 398 |
403 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFin) { | 399 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFin) { |
404 QuicFrame frame; | 400 QuicFrame frame; |
405 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 10u, | 401 size_t consumed = |
406 true, &frame); | 402 creator_.CreateStreamFrame(1u, MakeIOVector("test"), 10u, true, &frame); |
407 EXPECT_EQ(4u, consumed); | 403 EXPECT_EQ(4u, consumed); |
408 CheckStreamFrame(frame, 1u, "test", 10u, true); | 404 CheckStreamFrame(frame, 1u, "test", 10u, true); |
409 delete frame.stream_frame; | 405 delete frame.stream_frame; |
410 } | 406 } |
411 | 407 |
412 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFinOnly) { | 408 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFinOnly) { |
413 QuicFrame frame; | 409 QuicFrame frame; |
414 size_t consumed = creator_.CreateStreamFrame(1u, IOVector(), 0u, true, | 410 size_t consumed = |
415 &frame); | 411 creator_.CreateStreamFrame(1u, IOVector(), 0u, true, &frame); |
416 EXPECT_EQ(0u, consumed); | 412 EXPECT_EQ(0u, consumed); |
417 CheckStreamFrame(frame, 1u, string(), 0u, true); | 413 CheckStreamFrame(frame, 1u, string(), 0u, true); |
418 delete frame.stream_frame; | 414 delete frame.stream_frame; |
419 } | 415 } |
420 | 416 |
421 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { | 417 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { |
422 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 418 const size_t overhead = |
423 + GetEncryptionOverhead(); | 419 GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + GetEncryptionOverhead(); |
424 for (size_t i = overhead; i < overhead + 100; ++i) { | 420 for (size_t i = overhead; i < overhead + 100; ++i) { |
425 creator_.options()->max_packet_length = i; | 421 creator_.options()->max_packet_length = i; |
426 const bool should_have_room = i > overhead + GetStreamFrameOverhead( | 422 const bool should_have_room = |
427 NOT_IN_FEC_GROUP); | 423 i > overhead + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
428 ASSERT_EQ(should_have_room, | 424 ASSERT_EQ(should_have_room, |
429 creator_.HasRoomForStreamFrame(kStreamId, kOffset)); | 425 creator_.HasRoomForStreamFrame(kStreamId, kOffset)); |
430 if (should_have_room) { | 426 if (should_have_room) { |
431 QuicFrame frame; | 427 QuicFrame frame; |
432 size_t bytes_consumed = creator_.CreateStreamFrame( | 428 size_t bytes_consumed = creator_.CreateStreamFrame( |
433 kStreamId, MakeIOVector("testdata"), kOffset, false, &frame); | 429 kStreamId, MakeIOVector("testdata"), kOffset, false, &frame); |
434 EXPECT_LT(0u, bytes_consumed); | 430 EXPECT_LT(0u, bytes_consumed); |
435 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 431 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
436 SerializedPacket serialized_packet = creator_.SerializePacket(); | 432 SerializedPacket serialized_packet = creator_.SerializePacket(); |
437 ASSERT_TRUE(serialized_packet.packet); | 433 ASSERT_TRUE(serialized_packet.packet); |
438 delete serialized_packet.packet; | 434 delete serialized_packet.packet; |
439 delete serialized_packet.retransmittable_frames; | 435 delete serialized_packet.retransmittable_frames; |
440 } | 436 } |
441 } | 437 } |
442 } | 438 } |
443 | 439 |
444 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { | 440 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { |
445 // Compute the total overhead for a single frame in packet. | 441 // Compute the total overhead for a single frame in packet. |
446 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 442 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + |
447 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 443 GetEncryptionOverhead() + |
| 444 GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
448 size_t capacity = kDefaultMaxPacketSize - overhead; | 445 size_t capacity = kDefaultMaxPacketSize - overhead; |
449 // Now, test various sizes around this size. | 446 // Now, test various sizes around this size. |
450 for (int delta = -5; delta <= 5; ++delta) { | 447 for (int delta = -5; delta <= 5; ++delta) { |
451 string data(capacity + delta, 'A'); | 448 string data(capacity + delta, 'A'); |
452 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 449 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
453 QuicFrame frame; | 450 QuicFrame frame; |
454 size_t bytes_consumed = creator_.CreateStreamFrame( | 451 size_t bytes_consumed = creator_.CreateStreamFrame( |
455 kStreamId, MakeIOVector(data), kOffset, false, &frame); | 452 kStreamId, MakeIOVector(data), kOffset, false, &frame); |
456 EXPECT_EQ(capacity - bytes_free, bytes_consumed); | 453 EXPECT_EQ(capacity - bytes_free, bytes_consumed); |
457 | 454 |
458 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 455 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
459 // BytesFree() returns bytes available for the next frame, which will | 456 // BytesFree() returns bytes available for the next frame, which will |
460 // be two bytes smaller since the stream frame would need to be grown. | 457 // be two bytes smaller since the stream frame would need to be grown. |
461 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); | 458 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); |
462 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; | 459 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; |
463 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | 460 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
464 SerializedPacket serialized_packet = creator_.SerializePacket(); | 461 SerializedPacket serialized_packet = creator_.SerializePacket(); |
465 ASSERT_TRUE(serialized_packet.packet); | 462 ASSERT_TRUE(serialized_packet.packet); |
466 delete serialized_packet.packet; | 463 delete serialized_packet.packet; |
467 delete serialized_packet.retransmittable_frames; | 464 delete serialized_packet.retransmittable_frames; |
468 } | 465 } |
469 } | 466 } |
470 | 467 |
471 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { | 468 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { |
472 // Turn on FEC protection. | 469 // Turn on FEC protection. |
473 creator_.options()->max_packets_per_fec_group = 6; | 470 creator_.options()->max_packets_per_fec_group = 6; |
474 // Compute the total overhead for a single frame in packet. | 471 // Compute the total overhead for a single frame in packet. |
475 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) | 472 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) + |
476 + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP); | 473 GetEncryptionOverhead() + |
| 474 GetStreamFrameOverhead(IN_FEC_GROUP); |
477 size_t capacity = kDefaultMaxPacketSize - overhead; | 475 size_t capacity = kDefaultMaxPacketSize - overhead; |
478 // Now, test various sizes around this size. | 476 // Now, test various sizes around this size. |
479 for (int delta = -5; delta <= 5; ++delta) { | 477 for (int delta = -5; delta <= 5; ++delta) { |
480 string data(capacity + delta, 'A'); | 478 string data(capacity + delta, 'A'); |
481 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 479 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
482 QuicFrame frame; | 480 QuicFrame frame; |
483 size_t bytes_consumed = creator_.CreateStreamFrame( | 481 size_t bytes_consumed = creator_.CreateStreamFrame( |
484 kStreamId, MakeIOVector(data), kOffset, false, &frame); | 482 kStreamId, MakeIOVector(data), kOffset, false, &frame); |
485 EXPECT_EQ(capacity - bytes_free, bytes_consumed); | 483 EXPECT_EQ(capacity - bytes_free, bytes_consumed); |
486 | 484 |
487 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 485 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
488 // BytesFree() returns bytes available for the next frame. Since stream | 486 // BytesFree() returns bytes available for the next frame. Since stream |
489 // frame does not grow for FEC protected packets, this should be the same | 487 // frame does not grow for FEC protected packets, this should be the same |
490 // as bytes_free (bound by 0). | 488 // as bytes_free (bound by 0). |
491 EXPECT_EQ(0u, creator_.ExpansionOnNewFrame()); | 489 EXPECT_EQ(0u, creator_.ExpansionOnNewFrame()); |
492 size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0; | 490 size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0; |
493 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | 491 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
494 SerializedPacket serialized_packet = creator_.SerializePacket(); | 492 SerializedPacket serialized_packet = creator_.SerializePacket(); |
495 ASSERT_TRUE(serialized_packet.packet); | 493 ASSERT_TRUE(serialized_packet.packet); |
496 delete serialized_packet.packet; | 494 delete serialized_packet.packet; |
497 delete serialized_packet.retransmittable_frames; | 495 delete serialized_packet.retransmittable_frames; |
498 } | 496 } |
499 } | 497 } |
500 | 498 |
501 TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) { | 499 TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) { |
502 // Compute the total overhead for a single frame in packet. | 500 // Compute the total overhead for a single frame in packet. |
503 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 501 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + |
504 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 502 GetEncryptionOverhead() + |
| 503 GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
505 ASSERT_GT(kMaxPacketSize, overhead); | 504 ASSERT_GT(kMaxPacketSize, overhead); |
506 size_t capacity = kDefaultMaxPacketSize - overhead; | 505 size_t capacity = kDefaultMaxPacketSize - overhead; |
507 // Now, test various sizes around this size. | 506 // Now, test various sizes around this size. |
508 for (int delta = -5; delta <= 5; ++delta) { | 507 for (int delta = -5; delta <= 5; ++delta) { |
509 string data(capacity + delta, 'A'); | 508 string data(capacity + delta, 'A'); |
510 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 509 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
511 | 510 |
512 QuicFrame frame; | 511 QuicFrame frame; |
513 size_t bytes_consumed = creator_.CreateStreamFrame( | 512 size_t bytes_consumed = creator_.CreateStreamFrame( |
514 kStreamId, MakeIOVector(data), kOffset, false, &frame); | 513 kStreamId, MakeIOVector(data), kOffset, false, &frame); |
515 EXPECT_LT(0u, bytes_consumed); | 514 EXPECT_LT(0u, bytes_consumed); |
516 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 515 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
517 SerializedPacket serialized_packet = creator_.SerializePacket(); | 516 SerializedPacket serialized_packet = creator_.SerializePacket(); |
518 ASSERT_TRUE(serialized_packet.packet); | 517 ASSERT_TRUE(serialized_packet.packet); |
519 // If there is not enough space in the packet to fit a padding frame | 518 // If there is not enough space in the packet to fit a padding frame |
520 // (1 byte) and to expand the stream frame (another 2 bytes) the packet | 519 // (1 byte) and to expand the stream frame (another 2 bytes) the packet |
521 // will not be padded. | 520 // will not be padded. |
522 if (bytes_free < 3) { | 521 if (bytes_free < 3) { |
523 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) | 522 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) - |
524 - bytes_free, serialized_packet.packet->length()); | 523 bytes_free, |
| 524 serialized_packet.packet->length()); |
525 } else { | 525 } else { |
526 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), | 526 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), |
527 serialized_packet.packet->length()); | 527 serialized_packet.packet->length()); |
528 } | 528 } |
529 delete serialized_packet.packet; | 529 delete serialized_packet.packet; |
530 delete serialized_packet.retransmittable_frames; | 530 delete serialized_packet.retransmittable_frames; |
531 } | 531 } |
532 } | 532 } |
533 | 533 |
534 TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) { | 534 TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) { |
535 // Compute the total overhead for a single frame in packet. | 535 // Compute the total overhead for a single frame in packet. |
536 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 536 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + |
537 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 537 GetEncryptionOverhead() + |
| 538 GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
538 ASSERT_GT(kDefaultMaxPacketSize, overhead); | 539 ASSERT_GT(kDefaultMaxPacketSize, overhead); |
539 size_t capacity = kDefaultMaxPacketSize - overhead; | 540 size_t capacity = kDefaultMaxPacketSize - overhead; |
540 // Now, test various sizes around this size. | 541 // Now, test various sizes around this size. |
541 for (int delta = -5; delta <= 5; ++delta) { | 542 for (int delta = -5; delta <= 5; ++delta) { |
542 string data(capacity + delta, 'A'); | 543 string data(capacity + delta, 'A'); |
543 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 544 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
544 | 545 |
545 QuicFrame frame; | 546 QuicFrame frame; |
546 size_t bytes_consumed = creator_.CreateStreamFrame( | 547 size_t bytes_consumed = creator_.CreateStreamFrame( |
547 kStreamId + 2, MakeIOVector(data), kOffset, false, &frame); | 548 kStreamId + 2, MakeIOVector(data), kOffset, false, &frame); |
548 EXPECT_LT(0u, bytes_consumed); | 549 EXPECT_LT(0u, bytes_consumed); |
549 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | 550 ASSERT_TRUE(creator_.AddSavedFrame(frame)); |
550 SerializedPacket serialized_packet = creator_.SerializePacket(); | 551 SerializedPacket serialized_packet = creator_.SerializePacket(); |
551 ASSERT_TRUE(serialized_packet.packet); | 552 ASSERT_TRUE(serialized_packet.packet); |
552 if (bytes_free > 0) { | 553 if (bytes_free > 0) { |
553 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) | 554 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize) - |
554 - bytes_free, serialized_packet.packet->length()); | 555 bytes_free, |
| 556 serialized_packet.packet->length()); |
555 } else { | 557 } else { |
556 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), | 558 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize), |
557 serialized_packet.packet->length()); | 559 serialized_packet.packet->length()); |
558 } | 560 } |
559 delete serialized_packet.packet; | 561 delete serialized_packet.packet; |
560 delete serialized_packet.retransmittable_frames; | 562 delete serialized_packet.retransmittable_frames; |
561 } | 563 } |
562 } | 564 } |
563 | 565 |
564 TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) { | 566 TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 650 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
649 delete frames_[0].stream_frame; | 651 delete frames_[0].stream_frame; |
650 | 652 |
651 QuicPacketHeader header; | 653 QuicPacketHeader header; |
652 { | 654 { |
653 InSequence s; | 655 InSequence s; |
654 EXPECT_CALL(framer_visitor_, OnPacket()); | 656 EXPECT_CALL(framer_visitor_, OnPacket()); |
655 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 657 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
656 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 658 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
657 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); | 659 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); |
658 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce( | 660 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)) |
659 DoAll(SaveArg<0>(&header), Return(true))); | 661 .WillOnce(DoAll(SaveArg<0>(&header), Return(true))); |
660 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 662 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
661 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 663 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
662 } | 664 } |
663 ProcessPacket(serialized.packet); | 665 ProcessPacket(serialized.packet); |
664 EXPECT_EQ(GetParam().version_serialization, | 666 EXPECT_EQ(GetParam().version_serialization, |
665 header.public_header.version_flag); | 667 header.public_header.version_flag); |
666 delete serialized.packet; | 668 delete serialized.packet; |
667 } | 669 } |
668 | 670 |
669 TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) { | 671 TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) { |
670 if (!GetParam().version_serialization) { | 672 if (!GetParam().version_serialization) { |
671 creator_.StopSendingVersion(); | 673 creator_.StopSendingVersion(); |
672 } | 674 } |
673 // A string larger than fits into a frame. | 675 // A string larger than fits into a frame. |
674 size_t payload_length; | 676 size_t payload_length; |
675 creator_.options()->max_packet_length = GetPacketLengthForOneStream( | 677 creator_.options()->max_packet_length = GetPacketLengthForOneStream( |
676 client_framer_.version(), | 678 client_framer_.version(), |
677 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 679 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
678 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP, &payload_length); | 680 PACKET_1BYTE_SEQUENCE_NUMBER, |
| 681 NOT_IN_FEC_GROUP, |
| 682 &payload_length); |
679 QuicFrame frame; | 683 QuicFrame frame; |
680 const string too_long_payload(payload_length * 2, 'a'); | 684 const string too_long_payload(payload_length * 2, 'a'); |
681 size_t consumed = creator_.CreateStreamFrame( | 685 size_t consumed = creator_.CreateStreamFrame( |
682 1u, MakeIOVector(too_long_payload), 0u, true, &frame); | 686 1u, MakeIOVector(too_long_payload), 0u, true, &frame); |
683 EXPECT_EQ(payload_length, consumed); | 687 EXPECT_EQ(payload_length, consumed); |
684 const string payload(payload_length, 'a'); | 688 const string payload(payload_length, 'a'); |
685 CheckStreamFrame(frame, 1u, payload, 0u, false); | 689 CheckStreamFrame(frame, 1u, payload, 0u, false); |
686 delete frame.stream_frame; | 690 delete frame.stream_frame; |
687 } | 691 } |
688 | 692 |
689 TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) { | 693 TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) { |
690 if (!GetParam().version_serialization) { | 694 if (!GetParam().version_serialization) { |
691 creator_.StopSendingVersion(); | 695 creator_.StopSendingVersion(); |
692 } | 696 } |
693 const size_t max_plaintext_size = | 697 const size_t max_plaintext_size = |
694 client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length); | 698 client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length); |
695 EXPECT_FALSE(creator_.HasPendingFrames()); | 699 EXPECT_FALSE(creator_.HasPendingFrames()); |
696 EXPECT_EQ(max_plaintext_size - | 700 EXPECT_EQ(max_plaintext_size - |
697 GetPacketHeaderSize( | 701 GetPacketHeaderSize( |
698 creator_.options()->send_connection_id_length, | 702 creator_.options()->send_connection_id_length, |
699 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 703 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
700 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 704 PACKET_1BYTE_SEQUENCE_NUMBER, |
| 705 NOT_IN_FEC_GROUP), |
701 creator_.BytesFree()); | 706 creator_.BytesFree()); |
702 | 707 |
703 // Add a variety of frame types and then a padding frame. | 708 // Add a variety of frame types and then a padding frame. |
704 QuicAckFrame ack_frame(MakeAckFrame(0u, 0u)); | 709 QuicAckFrame ack_frame(MakeAckFrame(0u, 0u)); |
705 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); | 710 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
706 EXPECT_TRUE(creator_.HasPendingFrames()); | 711 EXPECT_TRUE(creator_.HasPendingFrames()); |
707 | 712 |
708 QuicCongestionFeedbackFrame congestion_feedback; | 713 QuicCongestionFeedbackFrame congestion_feedback; |
709 congestion_feedback.type = kFixRate; | 714 congestion_feedback.type = kFixRate; |
710 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback))); | 715 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback))); |
711 EXPECT_TRUE(creator_.HasPendingFrames()); | 716 EXPECT_TRUE(creator_.HasPendingFrames()); |
712 | 717 |
713 QuicFrame frame; | 718 QuicFrame frame; |
714 size_t consumed = creator_.CreateStreamFrame( | 719 size_t consumed = |
715 1u, MakeIOVector("test"), 0u, false, &frame); | 720 creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u, false, &frame); |
716 EXPECT_EQ(4u, consumed); | 721 EXPECT_EQ(4u, consumed); |
717 ASSERT_TRUE(frame.stream_frame); | 722 ASSERT_TRUE(frame.stream_frame); |
718 EXPECT_TRUE(creator_.AddSavedFrame(frame)); | 723 EXPECT_TRUE(creator_.AddSavedFrame(frame)); |
719 EXPECT_TRUE(creator_.HasPendingFrames()); | 724 EXPECT_TRUE(creator_.HasPendingFrames()); |
720 | 725 |
721 QuicPaddingFrame padding_frame; | 726 QuicPaddingFrame padding_frame; |
722 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&padding_frame))); | 727 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&padding_frame))); |
723 EXPECT_TRUE(creator_.HasPendingFrames()); | 728 EXPECT_TRUE(creator_.HasPendingFrames()); |
724 EXPECT_EQ(0u, creator_.BytesFree()); | 729 EXPECT_EQ(0u, creator_.BytesFree()); |
725 | 730 |
726 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); | 731 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
727 | 732 |
728 // Ensure the packet is successfully created. | 733 // Ensure the packet is successfully created. |
729 SerializedPacket serialized = creator_.SerializePacket(); | 734 SerializedPacket serialized = creator_.SerializePacket(); |
730 ASSERT_TRUE(serialized.packet); | 735 ASSERT_TRUE(serialized.packet); |
731 delete serialized.packet; | 736 delete serialized.packet; |
732 ASSERT_TRUE(serialized.retransmittable_frames); | 737 ASSERT_TRUE(serialized.retransmittable_frames); |
733 RetransmittableFrames* retransmittable = serialized.retransmittable_frames; | 738 RetransmittableFrames* retransmittable = serialized.retransmittable_frames; |
734 ASSERT_EQ(1u, retransmittable->frames().size()); | 739 ASSERT_EQ(1u, retransmittable->frames().size()); |
735 EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type); | 740 EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type); |
736 ASSERT_TRUE(retransmittable->frames()[0].stream_frame); | 741 ASSERT_TRUE(retransmittable->frames()[0].stream_frame); |
737 delete serialized.retransmittable_frames; | 742 delete serialized.retransmittable_frames; |
738 | 743 |
739 EXPECT_FALSE(creator_.HasPendingFrames()); | 744 EXPECT_FALSE(creator_.HasPendingFrames()); |
740 EXPECT_EQ(max_plaintext_size - | 745 EXPECT_EQ(max_plaintext_size - |
741 GetPacketHeaderSize( | 746 GetPacketHeaderSize( |
742 creator_.options()->send_connection_id_length, | 747 creator_.options()->send_connection_id_length, |
743 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 748 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
744 PACKET_1BYTE_SEQUENCE_NUMBER, | 749 PACKET_1BYTE_SEQUENCE_NUMBER, |
745 NOT_IN_FEC_GROUP), | 750 NOT_IN_FEC_GROUP), |
746 creator_.BytesFree()); | 751 creator_.BytesFree()); |
747 } | 752 } |
748 | 753 |
749 TEST_P(QuicPacketCreatorTest, EntropyFlag) { | 754 TEST_P(QuicPacketCreatorTest, EntropyFlag) { |
750 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); | 755 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); |
751 | 756 |
752 for (int i = 0; i < 2; ++i) { | 757 for (int i = 0; i < 2; ++i) { |
753 for (int j = 0; j < 64; ++j) { | 758 for (int j = 0; j < 64; ++j) { |
754 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); | 759 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); |
755 // Verify both BoolSource and hash algorithm. | 760 // Verify both BoolSource and hash algorithm. |
756 bool expected_rand_bool = | 761 bool expected_rand_bool = |
757 (mock_random_.RandUint64() & (GG_UINT64_C(1) << j)) != 0; | 762 (mock_random_.RandUint64() & (GG_UINT64_C(1) << j)) != 0; |
758 bool observed_rand_bool = | 763 bool observed_rand_bool = |
759 (serialized.entropy_hash & (1 << ((j+1) % 8))) != 0; | 764 (serialized.entropy_hash & (1 << ((j + 1) % 8))) != 0; |
760 uint8 rest_of_hash = serialized.entropy_hash & ~(1 << ((j+1) % 8)); | 765 uint8 rest_of_hash = serialized.entropy_hash & ~(1 << ((j + 1) % 8)); |
761 EXPECT_EQ(expected_rand_bool, observed_rand_bool); | 766 EXPECT_EQ(expected_rand_bool, observed_rand_bool); |
762 EXPECT_EQ(0, rest_of_hash); | 767 EXPECT_EQ(0, rest_of_hash); |
763 delete serialized.packet; | 768 delete serialized.packet; |
764 } | 769 } |
765 // After 64 calls, BoolSource will refresh the bucket - make sure it does. | 770 // After 64 calls, BoolSource will refresh the bucket - make sure it does. |
766 mock_random_.ChangeValue(); | 771 mock_random_.ChangeValue(); |
767 } | 772 } |
768 | 773 |
769 delete frames_[0].stream_frame; | 774 delete frames_[0].stream_frame; |
770 } | 775 } |
771 | 776 |
772 } // namespace | 777 } // namespace |
773 } // namespace test | 778 } // namespace test |
774 } // namespace net | 779 } // namespace net |
OLD | NEW |