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/core/quic_packet_creator.h" | 5 #include "net/quic/core/quic_packet_creator.h" |
6 | 6 |
7 #include <cstdint> | 7 #include <cstdint> |
8 #include <memory> | 8 #include <memory> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 &buffer_allocator_, | 131 &buffer_allocator_, |
132 &delegate_), | 132 &delegate_), |
133 serialized_packet_(creator_.NoPacket()) { | 133 serialized_packet_(creator_.NoPacket()) { |
134 creator_.set_connection_id_length(GetParam().connection_id_length); | 134 creator_.set_connection_id_length(GetParam().connection_id_length); |
135 | 135 |
136 creator_.SetEncrypter(ENCRYPTION_INITIAL, new NullEncrypter()); | 136 creator_.SetEncrypter(ENCRYPTION_INITIAL, new NullEncrypter()); |
137 creator_.SetEncrypter(ENCRYPTION_FORWARD_SECURE, new NullEncrypter()); | 137 creator_.SetEncrypter(ENCRYPTION_FORWARD_SECURE, new NullEncrypter()); |
138 client_framer_.set_visitor(&framer_visitor_); | 138 client_framer_.set_visitor(&framer_visitor_); |
139 client_framer_.set_received_entropy_calculator(&entropy_calculator_); | 139 client_framer_.set_received_entropy_calculator(&entropy_calculator_); |
140 server_framer_.set_visitor(&framer_visitor_); | 140 server_framer_.set_visitor(&framer_visitor_); |
141 // TODO(ianswett): Fix this test so it uses a non-null encrypter. | |
142 FLAGS_quic_never_write_unencrypted_data = false; | |
143 } | 141 } |
144 | 142 |
145 ~QuicPacketCreatorTest() override { | 143 ~QuicPacketCreatorTest() override { |
146 delete[] serialized_packet_.encrypted_buffer; | 144 delete[] serialized_packet_.encrypted_buffer; |
147 ClearSerializedPacket(&serialized_packet_); | 145 ClearSerializedPacket(&serialized_packet_); |
148 } | 146 } |
149 | 147 |
150 SerializedPacket SerializeAllFrames(const QuicFrames& frames) { | 148 SerializedPacket SerializeAllFrames(const QuicFrames& frames) { |
151 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames( | 149 SerializedPacket packet = QuicPacketCreatorPeer::SerializeAllFrames( |
152 &creator_, frames, buffer_, kMaxPacketSize); | 150 &creator_, frames, buffer_, kMaxPacketSize); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 // length of truncated connection id. | 243 // length of truncated connection id. |
246 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, | 244 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, |
247 QuicPacketCreatorTest, | 245 QuicPacketCreatorTest, |
248 ::testing::ValuesIn(GetTestParams())); | 246 ::testing::ValuesIn(GetTestParams())); |
249 | 247 |
250 TEST_P(QuicPacketCreatorTest, SerializeFrames) { | 248 TEST_P(QuicPacketCreatorTest, SerializeFrames) { |
251 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; ++i) { | 249 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; ++i) { |
252 EncryptionLevel level = static_cast<EncryptionLevel>(i); | 250 EncryptionLevel level = static_cast<EncryptionLevel>(i); |
253 creator_.set_encryption_level(level); | 251 creator_.set_encryption_level(level); |
254 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u)))); | 252 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u)))); |
255 frames_.push_back( | 253 frames_.push_back(QuicFrame( |
256 QuicFrame(new QuicStreamFrame(0u, false, 0u, StringPiece()))); | 254 new QuicStreamFrame(kCryptoStreamId, false, 0u, StringPiece()))); |
257 frames_.push_back( | 255 frames_.push_back(QuicFrame( |
258 QuicFrame(new QuicStreamFrame(0u, true, 0u, StringPiece()))); | 256 new QuicStreamFrame(kCryptoStreamId, true, 0u, StringPiece()))); |
259 SerializedPacket serialized = SerializeAllFrames(frames_); | 257 SerializedPacket serialized = SerializeAllFrames(frames_); |
260 EXPECT_EQ(level, serialized.encryption_level); | 258 EXPECT_EQ(level, serialized.encryption_level); |
261 delete frames_[0].ack_frame; | 259 delete frames_[0].ack_frame; |
262 delete frames_[1].stream_frame; | 260 delete frames_[1].stream_frame; |
263 delete frames_[2].stream_frame; | 261 delete frames_[2].stream_frame; |
264 frames_.clear(); | 262 frames_.clear(); |
265 | 263 |
266 { | 264 { |
267 InSequence s; | 265 InSequence s; |
268 EXPECT_CALL(framer_visitor_, OnPacket()); | 266 EXPECT_CALL(framer_visitor_, OnPacket()); |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 632 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
635 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); | 633 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); |
636 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 634 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
637 | 635 |
638 ProcessPacket(serialized); | 636 ProcessPacket(serialized); |
639 } | 637 } |
640 | 638 |
641 TEST_P(QuicPacketCreatorTest, ConsumeData) { | 639 TEST_P(QuicPacketCreatorTest, ConsumeData) { |
642 QuicFrame frame; | 640 QuicFrame frame; |
643 QuicIOVector io_vector(MakeIOVector("test")); | 641 QuicIOVector io_vector(MakeIOVector("test")); |
644 ASSERT_TRUE( | 642 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, false, |
645 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); | 643 false, &frame)); |
646 ASSERT_TRUE(frame.stream_frame); | 644 ASSERT_TRUE(frame.stream_frame); |
647 size_t consumed = frame.stream_frame->data_length; | 645 size_t consumed = frame.stream_frame->data_length; |
648 EXPECT_EQ(4u, consumed); | 646 EXPECT_EQ(4u, consumed); |
649 CheckStreamFrame(frame, 1u, "test", 0u, false); | 647 CheckStreamFrame(frame, 1u, "test", 0u, false); |
650 EXPECT_TRUE(creator_.HasPendingFrames()); | 648 EXPECT_TRUE(creator_.HasPendingFrames()); |
651 } | 649 } |
652 | 650 |
653 TEST_P(QuicPacketCreatorTest, ConsumeDataFin) { | 651 TEST_P(QuicPacketCreatorTest, ConsumeDataFin) { |
654 QuicFrame frame; | 652 QuicFrame frame; |
655 QuicIOVector io_vector(MakeIOVector("test")); | 653 QuicIOVector io_vector(MakeIOVector("test")); |
656 ASSERT_TRUE( | 654 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 10u, true, |
657 creator_.ConsumeData(1u, io_vector, 0u, 10u, true, false, &frame)); | 655 false, &frame)); |
658 ASSERT_TRUE(frame.stream_frame); | 656 ASSERT_TRUE(frame.stream_frame); |
659 size_t consumed = frame.stream_frame->data_length; | 657 size_t consumed = frame.stream_frame->data_length; |
660 EXPECT_EQ(4u, consumed); | 658 EXPECT_EQ(4u, consumed); |
661 CheckStreamFrame(frame, 1u, "test", 10u, true); | 659 CheckStreamFrame(frame, 1u, "test", 10u, true); |
662 EXPECT_TRUE(creator_.HasPendingFrames()); | 660 EXPECT_TRUE(creator_.HasPendingFrames()); |
663 } | 661 } |
664 | 662 |
665 TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) { | 663 TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) { |
666 QuicFrame frame; | 664 QuicFrame frame; |
667 QuicIOVector io_vector(nullptr, 0, 0); | 665 QuicIOVector io_vector(nullptr, 0, 0); |
668 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame)); | 666 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, true, |
| 667 false, &frame)); |
669 ASSERT_TRUE(frame.stream_frame); | 668 ASSERT_TRUE(frame.stream_frame); |
670 size_t consumed = frame.stream_frame->data_length; | 669 size_t consumed = frame.stream_frame->data_length; |
671 EXPECT_EQ(0u, consumed); | 670 EXPECT_EQ(0u, consumed); |
672 CheckStreamFrame(frame, 1u, string(), 0u, true); | 671 CheckStreamFrame(frame, 1u, string(), 0u, true); |
673 EXPECT_TRUE(creator_.HasPendingFrames()); | 672 EXPECT_TRUE(creator_.HasPendingFrames()); |
674 } | 673 } |
675 | 674 |
676 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { | 675 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { |
| 676 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE); |
677 const size_t overhead = GetPacketHeaderOverhead(client_framer_.version()) + | 677 const size_t overhead = GetPacketHeaderOverhead(client_framer_.version()) + |
678 GetEncryptionOverhead(); | 678 GetEncryptionOverhead(); |
679 for (size_t i = overhead; i < overhead + 100; ++i) { | 679 for (size_t i = overhead; i < overhead + 100; ++i) { |
680 creator_.SetMaxPacketLength(i); | 680 creator_.SetMaxPacketLength(i); |
681 const bool should_have_room = i > overhead + GetStreamFrameOverhead(); | 681 const bool should_have_room = i > overhead + GetStreamFrameOverhead(); |
682 ASSERT_EQ(should_have_room, | 682 ASSERT_EQ(should_have_room, |
683 creator_.HasRoomForStreamFrame(kClientDataStreamId1, kOffset)); | 683 creator_.HasRoomForStreamFrame(kClientDataStreamId1, kOffset)); |
684 if (should_have_room) { | 684 if (should_have_room) { |
685 QuicFrame frame; | 685 QuicFrame frame; |
686 QuicIOVector io_vector(MakeIOVector("testdata")); | 686 QuicIOVector io_vector(MakeIOVector("testdata")); |
687 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 687 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
688 .WillRepeatedly( | 688 .WillRepeatedly( |
689 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | 689 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); |
690 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, | 690 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, |
691 kOffset, false, false, &frame)); | 691 kOffset, false, false, &frame)); |
692 ASSERT_TRUE(frame.stream_frame); | 692 ASSERT_TRUE(frame.stream_frame); |
693 size_t bytes_consumed = frame.stream_frame->data_length; | 693 size_t bytes_consumed = frame.stream_frame->data_length; |
694 EXPECT_LT(0u, bytes_consumed); | 694 EXPECT_LT(0u, bytes_consumed); |
695 creator_.Flush(); | 695 creator_.Flush(); |
696 } | 696 } |
697 } | 697 } |
698 } | 698 } |
699 | 699 |
700 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { | 700 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { |
| 701 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE); |
701 // Compute the total overhead for a single frame in packet. | 702 // Compute the total overhead for a single frame in packet. |
702 const size_t overhead = GetPacketHeaderOverhead(client_framer_.version()) + | 703 const size_t overhead = GetPacketHeaderOverhead(client_framer_.version()) + |
703 GetEncryptionOverhead() + GetStreamFrameOverhead(); | 704 GetEncryptionOverhead() + GetStreamFrameOverhead(); |
704 size_t capacity = kDefaultMaxPacketSize - overhead; | 705 size_t capacity = kDefaultMaxPacketSize - overhead; |
705 // Now, test various sizes around this size. | 706 // Now, test various sizes around this size. |
706 for (int delta = -5; delta <= 5; ++delta) { | 707 for (int delta = -5; delta <= 5; ++delta) { |
707 string data(capacity + delta, 'A'); | 708 string data(capacity + delta, 'A'); |
708 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 709 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
709 QuicFrame frame; | 710 QuicFrame frame; |
710 QuicIOVector io_vector(MakeIOVector(data)); | 711 QuicIOVector io_vector(MakeIOVector(data)); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
755 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, | 756 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, |
756 serialized_packet_.encrypted_length); | 757 serialized_packet_.encrypted_length); |
757 } else { | 758 } else { |
758 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length); | 759 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length); |
759 } | 760 } |
760 DeleteSerializedPacket(); | 761 DeleteSerializedPacket(); |
761 } | 762 } |
762 } | 763 } |
763 | 764 |
764 TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) { | 765 TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) { |
| 766 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE); |
765 // Compute the total overhead for a single frame in packet. | 767 // Compute the total overhead for a single frame in packet. |
766 const size_t overhead = GetPacketHeaderOverhead(client_framer_.version()) + | 768 const size_t overhead = GetPacketHeaderOverhead(client_framer_.version()) + |
767 GetEncryptionOverhead() + GetStreamFrameOverhead(); | 769 GetEncryptionOverhead() + GetStreamFrameOverhead(); |
768 ASSERT_GT(kDefaultMaxPacketSize, overhead); | 770 ASSERT_GT(kDefaultMaxPacketSize, overhead); |
769 size_t capacity = kDefaultMaxPacketSize - overhead; | 771 size_t capacity = kDefaultMaxPacketSize - overhead; |
770 // Now, test various sizes around this size. | 772 // Now, test various sizes around this size. |
771 for (int delta = -5; delta <= 5; ++delta) { | 773 for (int delta = -5; delta <= 5; ++delta) { |
772 string data(capacity + delta, 'A'); | 774 string data(capacity + delta, 'A'); |
773 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 775 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
774 | 776 |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
909 creator_.UpdatePacketNumberLength( | 911 creator_.UpdatePacketNumberLength( |
910 1, UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize); | 912 1, UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize); |
911 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER, | 913 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER, |
912 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); | 914 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); |
913 } | 915 } |
914 | 916 |
915 TEST_P(QuicPacketCreatorTest, SerializeFrame) { | 917 TEST_P(QuicPacketCreatorTest, SerializeFrame) { |
916 if (!GetParam().version_serialization) { | 918 if (!GetParam().version_serialization) { |
917 creator_.StopSendingVersion(); | 919 creator_.StopSendingVersion(); |
918 } | 920 } |
919 frames_.push_back( | 921 frames_.push_back(QuicFrame( |
920 QuicFrame(new QuicStreamFrame(0u, false, 0u, StringPiece()))); | 922 new QuicStreamFrame(kCryptoStreamId, false, 0u, StringPiece()))); |
921 SerializedPacket serialized = SerializeAllFrames(frames_); | 923 SerializedPacket serialized = SerializeAllFrames(frames_); |
922 delete frames_[0].stream_frame; | 924 delete frames_[0].stream_frame; |
923 | 925 |
924 QuicPacketHeader header; | 926 QuicPacketHeader header; |
925 { | 927 { |
926 InSequence s; | 928 InSequence s; |
927 EXPECT_CALL(framer_visitor_, OnPacket()); | 929 EXPECT_CALL(framer_visitor_, OnPacket()); |
928 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 930 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
929 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 931 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
930 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); | 932 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); |
(...skipping 17 matching lines...) Expand all Loading... |
948 client_framer_.version(), | 950 client_framer_.version(), |
949 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 951 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
950 QuicPacketCreatorPeer::SendPathIdInPacket(&creator_), | 952 QuicPacketCreatorPeer::SendPathIdInPacket(&creator_), |
951 !kIncludeDiversificationNonce, creator_.connection_id_length(), | 953 !kIncludeDiversificationNonce, creator_.connection_id_length(), |
952 PACKET_1BYTE_PACKET_NUMBER, &payload_length)); | 954 PACKET_1BYTE_PACKET_NUMBER, &payload_length)); |
953 QuicFrame frame; | 955 QuicFrame frame; |
954 const string too_long_payload(payload_length * 2, 'a'); | 956 const string too_long_payload(payload_length * 2, 'a'); |
955 QuicIOVector io_vector(MakeIOVector(too_long_payload)); | 957 QuicIOVector io_vector(MakeIOVector(too_long_payload)); |
956 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 958 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
957 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 959 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
958 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame)); | 960 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, true, |
| 961 false, &frame)); |
959 ASSERT_TRUE(frame.stream_frame); | 962 ASSERT_TRUE(frame.stream_frame); |
960 size_t consumed = frame.stream_frame->data_length; | 963 size_t consumed = frame.stream_frame->data_length; |
961 EXPECT_EQ(payload_length, consumed); | 964 EXPECT_EQ(payload_length, consumed); |
962 const string payload(payload_length, 'a'); | 965 const string payload(payload_length, 'a'); |
963 CheckStreamFrame(frame, 1u, payload, 0u, false); | 966 CheckStreamFrame(frame, 1u, payload, 0u, false); |
964 creator_.Flush(); | 967 creator_.Flush(); |
965 DeleteSerializedPacket(); | 968 DeleteSerializedPacket(); |
966 } | 969 } |
967 | 970 |
968 TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) { | 971 TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) { |
(...skipping 11 matching lines...) Expand all Loading... |
980 !kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER), | 983 !kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER), |
981 creator_.BytesFree()); | 984 creator_.BytesFree()); |
982 | 985 |
983 // Add a variety of frame types and then a padding frame. | 986 // Add a variety of frame types and then a padding frame. |
984 QuicAckFrame ack_frame(MakeAckFrame(0u)); | 987 QuicAckFrame ack_frame(MakeAckFrame(0u)); |
985 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); | 988 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
986 EXPECT_TRUE(creator_.HasPendingFrames()); | 989 EXPECT_TRUE(creator_.HasPendingFrames()); |
987 | 990 |
988 QuicFrame frame; | 991 QuicFrame frame; |
989 QuicIOVector io_vector(MakeIOVector("test")); | 992 QuicIOVector io_vector(MakeIOVector("test")); |
990 ASSERT_TRUE( | 993 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, false, |
991 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); | 994 false, &frame)); |
992 ASSERT_TRUE(frame.stream_frame); | 995 ASSERT_TRUE(frame.stream_frame); |
993 size_t consumed = frame.stream_frame->data_length; | 996 size_t consumed = frame.stream_frame->data_length; |
994 EXPECT_EQ(4u, consumed); | 997 EXPECT_EQ(4u, consumed); |
995 EXPECT_TRUE(creator_.HasPendingFrames()); | 998 EXPECT_TRUE(creator_.HasPendingFrames()); |
996 | 999 |
997 QuicPaddingFrame padding_frame; | 1000 QuicPaddingFrame padding_frame; |
998 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(padding_frame))); | 1001 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(padding_frame))); |
999 EXPECT_TRUE(creator_.HasPendingFrames()); | 1002 EXPECT_TRUE(creator_.HasPendingFrames()); |
1000 EXPECT_EQ(0u, creator_.BytesFree()); | 1003 EXPECT_EQ(0u, creator_.BytesFree()); |
1001 | 1004 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1043 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames; | 1046 const QuicFrames& retransmittable = serialized_packet_.retransmittable_frames; |
1044 ASSERT_EQ(1u, retransmittable.size()); | 1047 ASSERT_EQ(1u, retransmittable.size()); |
1045 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type); | 1048 EXPECT_EQ(STREAM_FRAME, retransmittable[0].type); |
1046 ASSERT_TRUE(retransmittable[0].stream_frame); | 1049 ASSERT_TRUE(retransmittable[0].stream_frame); |
1047 DeleteSerializedPacket(); | 1050 DeleteSerializedPacket(); |
1048 | 1051 |
1049 EXPECT_FALSE(creator_.HasPendingFrames()); | 1052 EXPECT_FALSE(creator_.HasPendingFrames()); |
1050 } | 1053 } |
1051 | 1054 |
1052 TEST_P(QuicPacketCreatorTest, SerializeTruncatedAckFrameWithLargePacketSize) { | 1055 TEST_P(QuicPacketCreatorTest, SerializeTruncatedAckFrameWithLargePacketSize) { |
| 1056 creator_.set_encryption_level(ENCRYPTION_FORWARD_SECURE); |
1053 if (!GetParam().version_serialization) { | 1057 if (!GetParam().version_serialization) { |
1054 creator_.StopSendingVersion(); | 1058 creator_.StopSendingVersion(); |
1055 } | 1059 } |
1056 creator_.SetMaxPacketLength(kMaxPacketSize); | 1060 creator_.SetMaxPacketLength(kMaxPacketSize); |
1057 | 1061 |
1058 // Serialized length of ack frame with 2000 nack ranges should be limited by | 1062 // Serialized length of ack frame with 2000 nack ranges should be limited by |
1059 // the number of nack ranges that can be fit in an ack frame. | 1063 // the number of nack ranges that can be fit in an ack frame. |
1060 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(2000u, 0u); | 1064 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(2000u, 0u); |
1061 size_t frame_len = client_framer_.GetSerializedFrameLength( | 1065 size_t frame_len = client_framer_.GetSerializedFrameLength( |
1062 QuicFrame(&ack_frame), creator_.BytesFree(), true, true, | 1066 QuicFrame(&ack_frame), creator_.BytesFree(), true, true, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1130 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 1134 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1131 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 1135 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
1132 creator_.Flush(); | 1136 creator_.Flush(); |
1133 ASSERT_TRUE(serialized_packet_.encrypted_buffer); | 1137 ASSERT_TRUE(serialized_packet_.encrypted_buffer); |
1134 EXPECT_GE(est_packet_size, client_framer_.GetMaxPlaintextSize( | 1138 EXPECT_GE(est_packet_size, client_framer_.GetMaxPlaintextSize( |
1135 serialized_packet_.encrypted_length)); | 1139 serialized_packet_.encrypted_length)); |
1136 DeleteSerializedPacket(); | 1140 DeleteSerializedPacket(); |
1137 } | 1141 } |
1138 | 1142 |
1139 TEST_P(QuicPacketCreatorTest, EntropyFlag) { | 1143 TEST_P(QuicPacketCreatorTest, EntropyFlag) { |
1140 frames_.push_back( | 1144 frames_.push_back(QuicFrame( |
1141 QuicFrame(new QuicStreamFrame(0u, false, 0u, StringPiece()))); | 1145 new QuicStreamFrame(kCryptoStreamId, false, 0u, StringPiece()))); |
1142 | 1146 |
1143 for (int i = 0; i < 2; ++i) { | 1147 for (int i = 0; i < 2; ++i) { |
1144 for (int j = 0; j < 64; ++j) { | 1148 for (int j = 0; j < 64; ++j) { |
1145 SerializedPacket serialized = SerializeAllFrames(frames_); | 1149 SerializedPacket serialized = SerializeAllFrames(frames_); |
1146 // Verify both BoolSource and hash algorithm. | 1150 // Verify both BoolSource and hash algorithm. |
1147 bool expected_rand_bool = | 1151 bool expected_rand_bool = |
1148 (mock_random_.RandUint64() & (UINT64_C(1) << j)) != 0; | 1152 (mock_random_.RandUint64() & (UINT64_C(1) << j)) != 0; |
1149 bool observed_rand_bool = | 1153 bool observed_rand_bool = |
1150 (serialized.entropy_hash & (1 << ((j + 1) % 8))) != 0; | 1154 (serialized.entropy_hash & (1 << ((j + 1) % 8))) != 0; |
1151 uint8_t rest_of_hash = serialized.entropy_hash & ~(1 << ((j + 1) % 8)); | 1155 uint8_t rest_of_hash = serialized.entropy_hash & ~(1 << ((j + 1) % 8)); |
1152 EXPECT_EQ(expected_rand_bool, observed_rand_bool); | 1156 EXPECT_EQ(expected_rand_bool, observed_rand_bool); |
1153 EXPECT_EQ(0, rest_of_hash); | 1157 EXPECT_EQ(0, rest_of_hash); |
1154 } | 1158 } |
1155 // After 64 calls, BoolSource will refresh the bucket - make sure it does. | 1159 // After 64 calls, BoolSource will refresh the bucket - make sure it does. |
1156 mock_random_.ChangeValue(); | 1160 mock_random_.ChangeValue(); |
1157 } | 1161 } |
1158 | 1162 |
1159 delete frames_[0].stream_frame; | 1163 delete frames_[0].stream_frame; |
1160 } | 1164 } |
1161 | 1165 |
1162 TEST_P(QuicPacketCreatorTest, SetCurrentPath) { | 1166 TEST_P(QuicPacketCreatorTest, SetCurrentPath) { |
1163 // Current path is the default path. | 1167 // Current path is the default path. |
1164 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1168 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1165 EXPECT_EQ(0u, creator_.packet_number()); | 1169 EXPECT_EQ(0u, creator_.packet_number()); |
1166 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1170 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1167 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); | 1171 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); |
1168 // Add a stream frame to the creator. | 1172 // Add a stream frame to the creator. |
1169 QuicFrame frame; | 1173 QuicFrame frame; |
1170 QuicIOVector io_vector(MakeIOVector("test")); | 1174 QuicIOVector io_vector(MakeIOVector("test")); |
1171 ASSERT_TRUE( | 1175 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, false, |
1172 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); | 1176 false, &frame)); |
1173 ASSERT_TRUE(frame.stream_frame); | 1177 ASSERT_TRUE(frame.stream_frame); |
1174 size_t consumed = frame.stream_frame->data_length; | 1178 size_t consumed = frame.stream_frame->data_length; |
1175 EXPECT_EQ(4u, consumed); | 1179 EXPECT_EQ(4u, consumed); |
1176 EXPECT_TRUE(creator_.HasPendingFrames()); | 1180 EXPECT_TRUE(creator_.HasPendingFrames()); |
1177 EXPECT_EQ(0u, creator_.packet_number()); | 1181 EXPECT_EQ(0u, creator_.packet_number()); |
1178 | 1182 |
1179 // Change current path. | 1183 // Change current path. |
1180 QuicPathId kPathId1 = 1; | 1184 QuicPathId kPathId1 = 1; |
1181 EXPECT_QUIC_BUG(creator_.SetCurrentPath(kPathId1, 1, 0), | 1185 EXPECT_QUIC_BUG(creator_.SetCurrentPath(kPathId1, 1, 0), |
1182 "Unable to change paths when a packet is under construction"); | 1186 "Unable to change paths when a packet is under construction"); |
(...skipping 10 matching lines...) Expand all Loading... |
1193 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1197 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1194 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); | 1198 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); |
1195 | 1199 |
1196 // Change current path back. | 1200 // Change current path back. |
1197 creator_.SetCurrentPath(kDefaultPathId, 2, 1); | 1201 creator_.SetCurrentPath(kDefaultPathId, 2, 1); |
1198 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1202 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1199 EXPECT_EQ(1u, creator_.packet_number()); | 1203 EXPECT_EQ(1u, creator_.packet_number()); |
1200 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1204 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1201 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); | 1205 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); |
1202 // Add a stream frame to the creator. | 1206 // Add a stream frame to the creator. |
1203 ASSERT_TRUE( | 1207 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, false, |
1204 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); | 1208 false, &frame)); |
1205 ASSERT_TRUE(frame.stream_frame); | 1209 ASSERT_TRUE(frame.stream_frame); |
1206 consumed = frame.stream_frame->data_length; | 1210 consumed = frame.stream_frame->data_length; |
1207 EXPECT_EQ(4u, consumed); | 1211 EXPECT_EQ(4u, consumed); |
1208 EXPECT_TRUE(creator_.HasPendingFrames()); | 1212 EXPECT_TRUE(creator_.HasPendingFrames()); |
1209 | 1213 |
1210 // Does not change current path. | 1214 // Does not change current path. |
1211 creator_.SetCurrentPath(kDefaultPathId, 2, 0); | 1215 creator_.SetCurrentPath(kDefaultPathId, 2, 0); |
1212 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1216 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1213 EXPECT_TRUE(creator_.HasPendingFrames()); | 1217 EXPECT_TRUE(creator_.HasPendingFrames()); |
1214 EXPECT_EQ(1u, creator_.packet_number()); | 1218 EXPECT_EQ(1u, creator_.packet_number()); |
1215 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1219 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1216 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); | 1220 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); |
1217 } | 1221 } |
1218 | 1222 |
1219 TEST_P(QuicPacketCreatorTest, | 1223 TEST_P(QuicPacketCreatorTest, |
1220 SetCurrentPathAndUpdatePacketSequenceNumberLength) { | 1224 SetCurrentPathAndUpdatePacketSequenceNumberLength) { |
1221 FLAGS_quic_simple_packet_number_length_2 = false; | 1225 FLAGS_quic_simple_packet_number_length_2 = false; |
1222 // Current path is the default path. | 1226 // Current path is the default path. |
1223 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1227 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1224 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1228 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1225 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); | 1229 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); |
1226 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1230 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1227 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1231 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1228 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 - 2); | 1232 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 - 2); |
1229 // Add a stream frame to the creator and send the packet. | 1233 // Add a stream frame to the creator and send the packet. |
1230 QuicFrame frame; | 1234 QuicFrame frame; |
1231 QuicIOVector io_vector(MakeIOVector("test")); | 1235 QuicIOVector io_vector(MakeIOVector("test")); |
1232 ASSERT_TRUE( | 1236 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, false, |
1233 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); | 1237 false, &frame)); |
1234 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 1238 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1235 .Times(1) | 1239 .Times(1) |
1236 .WillRepeatedly( | 1240 .WillRepeatedly( |
1237 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | 1241 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); |
1238 creator_.Flush(); | 1242 creator_.Flush(); |
1239 EXPECT_EQ(UINT64_C(64 * 256 - 1), creator_.packet_number()); | 1243 EXPECT_EQ(UINT64_C(64 * 256 - 1), creator_.packet_number()); |
1240 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); | 1244 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); |
1241 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, | 1245 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, |
1242 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1246 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1243 | 1247 |
(...skipping 11 matching lines...) Expand all Loading... |
1255 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1259 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1256 } | 1260 } |
1257 | 1261 |
1258 TEST_P(QuicPacketCreatorTest, SerializePacketOnDifferentPath) { | 1262 TEST_P(QuicPacketCreatorTest, SerializePacketOnDifferentPath) { |
1259 // Current path is the default path. | 1263 // Current path is the default path. |
1260 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1264 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1261 EXPECT_EQ(0u, creator_.packet_number()); | 1265 EXPECT_EQ(0u, creator_.packet_number()); |
1262 // Add a stream frame to the creator and flush the packet. | 1266 // Add a stream frame to the creator and flush the packet. |
1263 QuicFrame frame; | 1267 QuicFrame frame; |
1264 QuicIOVector io_vector(MakeIOVector("test")); | 1268 QuicIOVector io_vector(MakeIOVector("test")); |
1265 ASSERT_TRUE( | 1269 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, false, |
1266 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); | 1270 false, &frame)); |
1267 ASSERT_TRUE(frame.stream_frame); | 1271 ASSERT_TRUE(frame.stream_frame); |
1268 size_t consumed = frame.stream_frame->data_length; | 1272 size_t consumed = frame.stream_frame->data_length; |
1269 EXPECT_EQ(4u, consumed); | 1273 EXPECT_EQ(4u, consumed); |
1270 EXPECT_TRUE(creator_.HasPendingFrames()); | 1274 EXPECT_TRUE(creator_.HasPendingFrames()); |
1271 EXPECT_EQ(0u, creator_.packet_number()); | 1275 EXPECT_EQ(0u, creator_.packet_number()); |
1272 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 1276 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1273 .WillRepeatedly( | 1277 .WillRepeatedly( |
1274 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 1278 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
1275 creator_.Flush(); | 1279 creator_.Flush(); |
1276 EXPECT_FALSE(creator_.HasPendingFrames()); | 1280 EXPECT_FALSE(creator_.HasPendingFrames()); |
1277 EXPECT_EQ(1u, creator_.packet_number()); | 1281 EXPECT_EQ(1u, creator_.packet_number()); |
1278 // Verify serialized data packet's path id. | 1282 // Verify serialized data packet's path id. |
1279 EXPECT_EQ(kDefaultPathId, serialized_packet_.path_id); | 1283 EXPECT_EQ(kDefaultPathId, serialized_packet_.path_id); |
1280 DeleteSerializedPacket(); | 1284 DeleteSerializedPacket(); |
1281 | 1285 |
1282 // Change to path 1. | 1286 // Change to path 1. |
1283 QuicPathId kPathId1 = 1; | 1287 QuicPathId kPathId1 = 1; |
1284 creator_.SetCurrentPath(kPathId1, 1, 0); | 1288 creator_.SetCurrentPath(kPathId1, 1, 0); |
1285 EXPECT_EQ(kPathId1, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1289 EXPECT_EQ(kPathId1, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1286 EXPECT_FALSE(creator_.HasPendingFrames()); | 1290 EXPECT_FALSE(creator_.HasPendingFrames()); |
1287 EXPECT_EQ(0u, creator_.packet_number()); | 1291 EXPECT_EQ(0u, creator_.packet_number()); |
1288 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1292 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1289 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); | 1293 QuicPacketCreatorPeer::GetPacketNumberLength(&creator_)); |
1290 | 1294 |
1291 // Add a stream frame to the creator and flush the packet. | 1295 // Add a stream frame to the creator and flush the packet. |
1292 ASSERT_TRUE( | 1296 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, 0u, false, |
1293 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); | 1297 false, &frame)); |
1294 ASSERT_TRUE(frame.stream_frame); | 1298 ASSERT_TRUE(frame.stream_frame); |
1295 consumed = frame.stream_frame->data_length; | 1299 consumed = frame.stream_frame->data_length; |
1296 EXPECT_EQ(4u, consumed); | 1300 EXPECT_EQ(4u, consumed); |
1297 EXPECT_TRUE(creator_.HasPendingFrames()); | 1301 EXPECT_TRUE(creator_.HasPendingFrames()); |
1298 creator_.Flush(); | 1302 creator_.Flush(); |
1299 // Verify serialized data packet's path id. | 1303 // Verify serialized data packet's path id. |
1300 EXPECT_EQ(kPathId1, serialized_packet_.path_id); | 1304 EXPECT_EQ(kPathId1, serialized_packet_.path_id); |
1301 DeleteSerializedPacket(); | 1305 DeleteSerializedPacket(); |
1302 } | 1306 } |
1303 | 1307 |
1304 TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) { | 1308 TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) { |
1305 FLAGS_quic_never_write_unencrypted_data = true; | 1309 creator_.set_encryption_level(ENCRYPTION_NONE); |
1306 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _, _)); | 1310 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _, _)); |
1307 QuicStreamFrame stream_frame(kHeadersStreamId, /*fin=*/false, 0u, | 1311 QuicStreamFrame stream_frame(kHeadersStreamId, /*fin=*/false, 0u, |
1308 StringPiece()); | 1312 StringPiece()); |
1309 EXPECT_QUIC_BUG(creator_.AddSavedFrame(QuicFrame(&stream_frame)), | 1313 EXPECT_QUIC_BUG(creator_.AddSavedFrame(QuicFrame(&stream_frame)), |
1310 "Cannot send stream data without encryption."); | 1314 "Cannot send stream data without encryption."); |
1311 } | 1315 } |
1312 | 1316 |
1313 TEST_P(QuicPacketCreatorTest, ChloTooLarge) { | 1317 TEST_P(QuicPacketCreatorTest, ChloTooLarge) { |
1314 CryptoHandshakeMessage message; | 1318 CryptoHandshakeMessage message; |
1315 message.set_tag(kCHLO); | 1319 message.set_tag(kCHLO); |
1316 message.set_minimum_size(kMaxPacketSize); | 1320 message.set_minimum_size(kMaxPacketSize); |
1317 CryptoFramer framer; | 1321 CryptoFramer framer; |
1318 std::unique_ptr<QuicData> message_data; | 1322 std::unique_ptr<QuicData> message_data; |
1319 message_data.reset(framer.ConstructHandshakeMessage(message)); | 1323 message_data.reset(framer.ConstructHandshakeMessage(message)); |
1320 | 1324 |
1321 struct iovec iov; | 1325 struct iovec iov; |
1322 QuicIOVector data_iovec(::net::MakeIOVector( | 1326 QuicIOVector data_iovec(::net::MakeIOVector( |
1323 StringPiece(message_data->data(), message_data->length()), &iov)); | 1327 StringPiece(message_data->data(), message_data->length()), &iov)); |
1324 QuicFrame frame; | 1328 QuicFrame frame; |
1325 EXPECT_CALL(delegate_, | 1329 EXPECT_CALL(delegate_, |
1326 OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _, _)); | 1330 OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, _, _)); |
1327 EXPECT_QUIC_BUG( | 1331 EXPECT_QUIC_BUG(creator_.ConsumeData(kCryptoStreamId, data_iovec, 0u, 0u, |
1328 creator_.ConsumeData(1u, data_iovec, 0u, 0u, false, false, &frame), | 1332 false, false, &frame), |
1329 "Client hello won't fit in a single packet."); | 1333 "Client hello won't fit in a single packet."); |
1330 } | 1334 } |
1331 | 1335 |
1332 } // namespace | 1336 } // namespace |
1333 } // namespace test | 1337 } // namespace test |
1334 } // namespace net | 1338 } // namespace net |
OLD | NEW |