| 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_framer.h" | 5 #include "net/quic/quic_framer.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 // Size in bytes of the stream frame fields for an arbitrary StreamID and | 59 // Size in bytes of the stream frame fields for an arbitrary StreamID and |
| 60 // offset and the last frame in a packet. | 60 // offset and the last frame in a packet. |
| 61 size_t GetMinStreamFrameSize() { | 61 size_t GetMinStreamFrameSize() { |
| 62 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize; | 62 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize; |
| 63 } | 63 } |
| 64 | 64 |
| 65 // Index into the packet number offset in the header. | 65 // Index into the packet number offset in the header. |
| 66 size_t GetPacketNumberOffset(QuicConnectionIdLength connection_id_length, | 66 size_t GetPacketNumberOffset(QuicConnectionIdLength connection_id_length, |
| 67 bool include_version) { | 67 bool include_version) { |
| 68 return kConnectionIdOffset + connection_id_length + | 68 return kConnectionIdOffset + connection_id_length + |
| 69 (include_version ? kQuicVersionSize : 0); | 69 (include_version ? kQuicVersionSize : 0); |
| 70 } | 70 } |
| 71 | 71 |
| 72 size_t GetPacketNumberOffset(bool include_version) { | 72 size_t GetPacketNumberOffset(bool include_version) { |
| 73 return GetPacketNumberOffset(PACKET_8BYTE_CONNECTION_ID, include_version); | 73 return GetPacketNumberOffset(PACKET_8BYTE_CONNECTION_ID, include_version); |
| 74 } | 74 } |
| 75 | 75 |
| 76 // Index into the private flags offset in the data packet header. | 76 // Index into the private flags offset in the data packet header. |
| 77 size_t GetPrivateFlagsOffset(QuicConnectionIdLength connection_id_length, | 77 size_t GetPrivateFlagsOffset(QuicConnectionIdLength connection_id_length, |
| 78 bool include_version) { | 78 bool include_version) { |
| 79 return GetPacketNumberOffset(connection_id_length, include_version) + | 79 return GetPacketNumberOffset(connection_id_length, include_version) + |
| 80 PACKET_6BYTE_PACKET_NUMBER; | 80 PACKET_6BYTE_PACKET_NUMBER; |
| 81 } | 81 } |
| 82 | 82 |
| 83 size_t GetPrivateFlagsOffset(bool include_version) { | 83 size_t GetPrivateFlagsOffset(bool include_version) { |
| 84 return GetPrivateFlagsOffset(PACKET_8BYTE_CONNECTION_ID, include_version); | 84 return GetPrivateFlagsOffset(PACKET_8BYTE_CONNECTION_ID, include_version); |
| 85 } | 85 } |
| 86 | 86 |
| 87 size_t GetPrivateFlagsOffset(bool include_version, | 87 size_t GetPrivateFlagsOffset(bool include_version, |
| 88 QuicPacketNumberLength packet_number_length) { | 88 QuicPacketNumberLength packet_number_length) { |
| 89 return GetPacketNumberOffset(PACKET_8BYTE_CONNECTION_ID, include_version) + | 89 return GetPacketNumberOffset(PACKET_8BYTE_CONNECTION_ID, include_version) + |
| 90 packet_number_length; | 90 packet_number_length; |
| 91 } | 91 } |
| 92 | 92 |
| 93 // Index into the fec group offset in the header. | 93 // Index into the fec group offset in the header. |
| 94 size_t GetFecGroupOffset(QuicConnectionIdLength connection_id_length, | 94 size_t GetFecGroupOffset(QuicConnectionIdLength connection_id_length, |
| 95 bool include_version) { | 95 bool include_version) { |
| 96 return GetPrivateFlagsOffset(connection_id_length, include_version) + | 96 return GetPrivateFlagsOffset(connection_id_length, include_version) + |
| 97 kPrivateFlagsSize; | 97 kPrivateFlagsSize; |
| 98 } | 98 } |
| 99 | 99 |
| 100 size_t GetFecGroupOffset(bool include_version) { | 100 size_t GetFecGroupOffset(bool include_version) { |
| 101 return GetPrivateFlagsOffset(PACKET_8BYTE_CONNECTION_ID, include_version) + | 101 return GetPrivateFlagsOffset(PACKET_8BYTE_CONNECTION_ID, include_version) + |
| 102 kPrivateFlagsSize; | 102 kPrivateFlagsSize; |
| 103 } | 103 } |
| 104 | 104 |
| 105 size_t GetFecGroupOffset(bool include_version, | 105 size_t GetFecGroupOffset(bool include_version, |
| 106 QuicPacketNumberLength packet_number_length) { | 106 QuicPacketNumberLength packet_number_length) { |
| 107 return GetPrivateFlagsOffset(include_version, packet_number_length) + | 107 return GetPrivateFlagsOffset(include_version, packet_number_length) + |
| 108 kPrivateFlagsSize; | 108 kPrivateFlagsSize; |
| 109 } | 109 } |
| 110 | 110 |
| 111 // Index into the message tag of the public reset packet. | 111 // Index into the message tag of the public reset packet. |
| 112 // Public resets always have full connection_ids. | 112 // Public resets always have full connection_ids. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 public: | 178 public: |
| 179 TestQuicVisitor() | 179 TestQuicVisitor() |
| 180 : error_count_(0), | 180 : error_count_(0), |
| 181 version_mismatch_(0), | 181 version_mismatch_(0), |
| 182 packet_count_(0), | 182 packet_count_(0), |
| 183 frame_count_(0), | 183 frame_count_(0), |
| 184 fec_count_(0), | 184 fec_count_(0), |
| 185 complete_packets_(0), | 185 complete_packets_(0), |
| 186 revived_packets_(0), | 186 revived_packets_(0), |
| 187 accept_packet_(true), | 187 accept_packet_(true), |
| 188 accept_public_header_(true) { | 188 accept_public_header_(true) {} |
| 189 } | |
| 190 | 189 |
| 191 ~TestQuicVisitor() override { | 190 ~TestQuicVisitor() override { |
| 192 STLDeleteElements(&stream_frames_); | 191 STLDeleteElements(&stream_frames_); |
| 193 STLDeleteElements(&ack_frames_); | 192 STLDeleteElements(&ack_frames_); |
| 194 STLDeleteElements(&stop_waiting_frames_); | 193 STLDeleteElements(&stop_waiting_frames_); |
| 195 STLDeleteElements(&ping_frames_); | 194 STLDeleteElements(&ping_frames_); |
| 196 STLDeleteElements(&stream_data_); | 195 STLDeleteElements(&stream_data_); |
| 197 } | 196 } |
| 198 | 197 |
| 199 void OnError(QuicFramer* f) override { | 198 void OnError(QuicFramer* f) override { |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 framer_.set_version(version_); | 345 framer_.set_version(version_); |
| 347 framer_.SetDecrypter(ENCRYPTION_NONE, decrypter_); | 346 framer_.SetDecrypter(ENCRYPTION_NONE, decrypter_); |
| 348 framer_.SetEncrypter(ENCRYPTION_NONE, encrypter_); | 347 framer_.SetEncrypter(ENCRYPTION_NONE, encrypter_); |
| 349 framer_.set_visitor(&visitor_); | 348 framer_.set_visitor(&visitor_); |
| 350 framer_.set_received_entropy_calculator(&entropy_calculator_); | 349 framer_.set_received_entropy_calculator(&entropy_calculator_); |
| 351 } | 350 } |
| 352 | 351 |
| 353 // Helper function to get unsigned char representation of digit in the | 352 // Helper function to get unsigned char representation of digit in the |
| 354 // units place of the current QUIC version number. | 353 // units place of the current QUIC version number. |
| 355 unsigned char GetQuicVersionDigitOnes() { | 354 unsigned char GetQuicVersionDigitOnes() { |
| 356 return static_cast<unsigned char> ('0' + version_%10); | 355 return static_cast<unsigned char>('0' + version_ % 10); |
| 357 } | 356 } |
| 358 | 357 |
| 359 // Helper function to get unsigned char representation of digit in the | 358 // Helper function to get unsigned char representation of digit in the |
| 360 // tens place of the current QUIC version number. | 359 // tens place of the current QUIC version number. |
| 361 unsigned char GetQuicVersionDigitTens() { | 360 unsigned char GetQuicVersionDigitTens() { |
| 362 return static_cast<unsigned char> ('0' + (version_/10)%10); | 361 return static_cast<unsigned char>('0' + (version_ / 10) % 10); |
| 363 } | 362 } |
| 364 | 363 |
| 365 bool CheckEncryption(QuicPacketNumber packet_number, QuicPacket* packet) { | 364 bool CheckEncryption(QuicPacketNumber packet_number, QuicPacket* packet) { |
| 366 if (packet_number != encrypter_->packet_number_) { | 365 if (packet_number != encrypter_->packet_number_) { |
| 367 LOG(ERROR) << "Encrypted incorrect packet number. expected " | 366 LOG(ERROR) << "Encrypted incorrect packet number. expected " |
| 368 << packet_number << " actual: " << encrypter_->packet_number_; | 367 << packet_number << " actual: " << encrypter_->packet_number_; |
| 369 return false; | 368 return false; |
| 370 } | 369 } |
| 371 if (packet->AssociatedData() != encrypter_->associated_data_) { | 370 if (packet->AssociatedData() != encrypter_->associated_data_) { |
| 372 LOG(ERROR) << "Encrypted incorrect associated data. expected " | 371 LOG(ERROR) << "Encrypted incorrect associated data. expected " |
| 373 << packet->AssociatedData() << " actual: " | 372 << packet->AssociatedData() |
| 374 << encrypter_->associated_data_; | 373 << " actual: " << encrypter_->associated_data_; |
| 375 return false; | 374 return false; |
| 376 } | 375 } |
| 377 if (packet->Plaintext() != encrypter_->plaintext_) { | 376 if (packet->Plaintext() != encrypter_->plaintext_) { |
| 378 LOG(ERROR) << "Encrypted incorrect plaintext data. expected " | 377 LOG(ERROR) << "Encrypted incorrect plaintext data. expected " |
| 379 << packet->Plaintext() << " actual: " | 378 << packet->Plaintext() |
| 380 << encrypter_->plaintext_; | 379 << " actual: " << encrypter_->plaintext_; |
| 381 return false; | 380 return false; |
| 382 } | 381 } |
| 383 return true; | 382 return true; |
| 384 } | 383 } |
| 385 | 384 |
| 386 bool CheckDecryption(const QuicEncryptedPacket& encrypted, | 385 bool CheckDecryption(const QuicEncryptedPacket& encrypted, |
| 387 bool includes_version) { | 386 bool includes_version) { |
| 388 if (visitor_.header_->packet_number != decrypter_->packet_number_) { | 387 if (visitor_.header_->packet_number != decrypter_->packet_number_) { |
| 389 LOG(ERROR) << "Decrypted incorrect packet number. expected " | 388 LOG(ERROR) << "Decrypted incorrect packet number. expected " |
| 390 << visitor_.header_->packet_number | 389 << visitor_.header_->packet_number |
| 391 << " actual: " << decrypter_->packet_number_; | 390 << " actual: " << decrypter_->packet_number_; |
| 392 return false; | 391 return false; |
| 393 } | 392 } |
| 394 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( | 393 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( |
| 395 encrypted, PACKET_8BYTE_CONNECTION_ID, includes_version, | 394 encrypted, PACKET_8BYTE_CONNECTION_ID, includes_version, |
| 396 PACKET_6BYTE_PACKET_NUMBER) != decrypter_->associated_data_) { | 395 PACKET_6BYTE_PACKET_NUMBER) != decrypter_->associated_data_) { |
| 397 LOG(ERROR) << "Decrypted incorrect associated data. expected " | 396 LOG(ERROR) << "Decrypted incorrect associated data. expected " |
| 398 << QuicFramer::GetAssociatedDataFromEncryptedPacket( | 397 << QuicFramer::GetAssociatedDataFromEncryptedPacket( |
| 399 encrypted, PACKET_8BYTE_CONNECTION_ID, includes_version, | 398 encrypted, PACKET_8BYTE_CONNECTION_ID, includes_version, |
| 400 PACKET_6BYTE_PACKET_NUMBER) | 399 PACKET_6BYTE_PACKET_NUMBER) |
| 401 << " actual: " << decrypter_->associated_data_; | 400 << " actual: " << decrypter_->associated_data_; |
| 402 return false; | 401 return false; |
| 403 } | 402 } |
| 404 StringPiece ciphertext(encrypted.AsStringPiece().substr( | 403 StringPiece ciphertext(encrypted.AsStringPiece().substr( |
| 405 GetStartOfEncryptedData(PACKET_8BYTE_CONNECTION_ID, includes_version, | 404 GetStartOfEncryptedData(PACKET_8BYTE_CONNECTION_ID, includes_version, |
| 406 PACKET_6BYTE_PACKET_NUMBER))); | 405 PACKET_6BYTE_PACKET_NUMBER))); |
| 407 if (ciphertext != decrypter_->ciphertext_) { | 406 if (ciphertext != decrypter_->ciphertext_) { |
| 408 LOG(ERROR) << "Decrypted incorrect ciphertext data. expected " | 407 LOG(ERROR) << "Decrypted incorrect ciphertext data. expected " |
| 409 << ciphertext << " actual: " | 408 << ciphertext << " actual: " << decrypter_->ciphertext_; |
| 410 << decrypter_->ciphertext_; | |
| 411 return false; | 409 return false; |
| 412 } | 410 } |
| 413 return true; | 411 return true; |
| 414 } | 412 } |
| 415 | 413 |
| 416 char* AsChars(unsigned char* data) { | 414 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); } |
| 417 return reinterpret_cast<char*>(data); | |
| 418 } | |
| 419 | 415 |
| 420 void CheckProcessingFails(unsigned char* packet, | 416 void CheckProcessingFails(unsigned char* packet, |
| 421 size_t len, | 417 size_t len, |
| 422 string expected_error, | 418 string expected_error, |
| 423 QuicErrorCode error_code) { | 419 QuicErrorCode error_code) { |
| 424 QuicEncryptedPacket encrypted(AsChars(packet), len, false); | 420 QuicEncryptedPacket encrypted(AsChars(packet), len, false); |
| 425 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len; | 421 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len; |
| 426 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len; | 422 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len; |
| 427 EXPECT_EQ(error_code, framer_.error()) << "len: " << len; | 423 EXPECT_EQ(error_code, framer_.error()) << "len: " << len; |
| 428 } | 424 } |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 | 581 |
| 586 // Large numbers should not wrap either. | 582 // Large numbers should not wrap either. |
| 587 for (uint64 j = 0; j < 10; j++) { | 583 for (uint64 j = 0; j < 10; j++) { |
| 588 uint64 num = kEpoch - 1 - j; | 584 uint64 num = kEpoch - 1 - j; |
| 589 CheckCalculatePacketNumber(max_epoch + num, last); | 585 CheckCalculatePacketNumber(max_epoch + num, last); |
| 590 } | 586 } |
| 591 } | 587 } |
| 592 } | 588 } |
| 593 | 589 |
| 594 TEST_P(QuicFramerTest, EmptyPacket) { | 590 TEST_P(QuicFramerTest, EmptyPacket) { |
| 595 char packet[] = { 0x00 }; | 591 char packet[] = {0x00}; |
| 596 QuicEncryptedPacket encrypted(packet, 0, false); | 592 QuicEncryptedPacket encrypted(packet, 0, false); |
| 597 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 593 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 598 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); | 594 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); |
| 599 } | 595 } |
| 600 | 596 |
| 601 TEST_P(QuicFramerTest, LargePacket) { | 597 TEST_P(QuicFramerTest, LargePacket) { |
| 602 // clang-format off | 598 // clang-format off |
| 603 unsigned char packet[kMaxPacketSize + 1] = { | 599 unsigned char packet[kMaxPacketSize + 1] = { |
| 604 // public flags (8 byte connection_id) | 600 // public flags (8 byte connection_id) |
| 605 0x3C, | 601 0x3C, |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1064 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 1060 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 1065 // private flags | 1061 // private flags |
| 1066 0x00, | 1062 0x00, |
| 1067 | 1063 |
| 1068 // frame type (padding) | 1064 // frame type (padding) |
| 1069 0x00, | 1065 0x00, |
| 1070 0x00, 0x00, 0x00, 0x00 | 1066 0x00, 0x00, 0x00, 0x00 |
| 1071 }; | 1067 }; |
| 1072 // clang-format on | 1068 // clang-format on |
| 1073 | 1069 |
| 1074 CheckProcessingFails(packet, | 1070 CheckProcessingFails(packet, arraysize(packet), "Illegal public flags value.", |
| 1075 arraysize(packet), | |
| 1076 "Illegal public flags value.", | |
| 1077 QUIC_INVALID_PACKET_HEADER); | 1071 QUIC_INVALID_PACKET_HEADER); |
| 1078 | 1072 |
| 1079 // Now turn off validation. | 1073 // Now turn off validation. |
| 1080 framer_.set_validate_flags(false); | 1074 framer_.set_validate_flags(false); |
| 1081 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1075 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1082 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1076 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1083 }; | 1077 }; |
| 1084 | 1078 |
| 1085 TEST_P(QuicFramerTest, InvalidPublicFlagWithMatchingVersions) { | 1079 TEST_P(QuicFramerTest, InvalidPublicFlagWithMatchingVersions) { |
| 1086 // clang-format off | 1080 // clang-format off |
| 1087 unsigned char packet[] = { | 1081 unsigned char packet[] = { |
| 1088 // public flags (8 byte connection_id and version flag and an unknown flag) | 1082 // public flags (8 byte connection_id and version flag and an unknown flag) |
| 1089 0x4D, | 1083 0x4D, |
| 1090 // connection_id | 1084 // connection_id |
| 1091 0x10, 0x32, 0x54, 0x76, | 1085 0x10, 0x32, 0x54, 0x76, |
| 1092 0x98, 0xBA, 0xDC, 0xFE, | 1086 0x98, 0xBA, 0xDC, 0xFE, |
| 1093 // version tag | 1087 // version tag |
| 1094 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 1088 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
| 1095 // packet number | 1089 // packet number |
| 1096 0xBC, 0x9A, 0x78, 0x56, | 1090 0xBC, 0x9A, 0x78, 0x56, |
| 1097 0x34, 0x12, | 1091 0x34, 0x12, |
| 1098 // private flags | 1092 // private flags |
| 1099 0x00, | 1093 0x00, |
| 1100 | 1094 |
| 1101 // frame type (padding) | 1095 // frame type (padding) |
| 1102 0x00, | 1096 0x00, |
| 1103 0x00, 0x00, 0x00, 0x00 | 1097 0x00, 0x00, 0x00, 0x00 |
| 1104 }; | 1098 }; |
| 1105 // clang-format on | 1099 // clang-format on |
| 1106 CheckProcessingFails(packet, | 1100 CheckProcessingFails(packet, arraysize(packet), "Illegal public flags value.", |
| 1107 arraysize(packet), | |
| 1108 "Illegal public flags value.", | |
| 1109 QUIC_INVALID_PACKET_HEADER); | 1101 QUIC_INVALID_PACKET_HEADER); |
| 1110 }; | 1102 }; |
| 1111 | 1103 |
| 1112 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) { | 1104 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) { |
| 1113 // clang-format off | 1105 // clang-format off |
| 1114 unsigned char packet[] = { | 1106 unsigned char packet[] = { |
| 1115 // public flags (8 byte connection_id, version flag and an unknown flag) | 1107 // public flags (8 byte connection_id, version flag and an unknown flag) |
| 1116 0x7D, | 1108 0x7D, |
| 1117 // connection_id | 1109 // connection_id |
| 1118 0x10, 0x32, 0x54, 0x76, | 1110 0x10, 0x32, 0x54, 0x76, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1150 0xBC, 0x9A, 0x78, 0x56, | 1142 0xBC, 0x9A, 0x78, 0x56, |
| 1151 0x34, 0x12, | 1143 0x34, 0x12, |
| 1152 // private flags | 1144 // private flags |
| 1153 0x10, | 1145 0x10, |
| 1154 | 1146 |
| 1155 // frame type (padding) | 1147 // frame type (padding) |
| 1156 0x00, | 1148 0x00, |
| 1157 0x00, 0x00, 0x00, 0x00 | 1149 0x00, 0x00, 0x00, 0x00 |
| 1158 }; | 1150 }; |
| 1159 // clang-format on | 1151 // clang-format on |
| 1160 CheckProcessingFails(packet, | 1152 CheckProcessingFails(packet, arraysize(packet), |
| 1161 arraysize(packet), | |
| 1162 "Illegal private flags value.", | 1153 "Illegal private flags value.", |
| 1163 QUIC_INVALID_PACKET_HEADER); | 1154 QUIC_INVALID_PACKET_HEADER); |
| 1164 }; | 1155 }; |
| 1165 | 1156 |
| 1166 TEST_P(QuicFramerTest, InvalidFECGroupOffset) { | 1157 TEST_P(QuicFramerTest, InvalidFECGroupOffset) { |
| 1167 // clang-format off | 1158 // clang-format off |
| 1168 unsigned char packet[] = { | 1159 unsigned char packet[] = { |
| 1169 // public flags (8 byte connection_id) | 1160 // public flags (8 byte connection_id) |
| 1170 0x3C, | 1161 0x3C, |
| 1171 // connection_id | 1162 // connection_id |
| (...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1570 QuicPacketHeader header; | 1561 QuicPacketHeader header; |
| 1571 header.public_header.connection_id = kConnectionId; | 1562 header.public_header.connection_id = kConnectionId; |
| 1572 header.public_header.reset_flag = false; | 1563 header.public_header.reset_flag = false; |
| 1573 header.public_header.version_flag = false; | 1564 header.public_header.version_flag = false; |
| 1574 header.fec_flag = true; | 1565 header.fec_flag = true; |
| 1575 header.entropy_flag = true; | 1566 header.entropy_flag = true; |
| 1576 header.packet_number = kPacketNumber; | 1567 header.packet_number = kPacketNumber; |
| 1577 header.fec_group = 0; | 1568 header.fec_group = 0; |
| 1578 | 1569 |
| 1579 // Do not encrypt the payload because the revived payload is post-encryption. | 1570 // Do not encrypt the payload because the revived payload is post-encryption. |
| 1580 EXPECT_TRUE(framer_.ProcessRevivedPacket(&header, | 1571 EXPECT_TRUE(framer_.ProcessRevivedPacket( |
| 1581 StringPiece(AsChars(payload), | 1572 &header, StringPiece(AsChars(payload), arraysize(payload)))); |
| 1582 arraysize(payload)))); | |
| 1583 | 1573 |
| 1584 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1574 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1585 ASSERT_EQ(1, visitor_.revived_packets_); | 1575 ASSERT_EQ(1, visitor_.revived_packets_); |
| 1586 ASSERT_TRUE(visitor_.header_.get()); | 1576 ASSERT_TRUE(visitor_.header_.get()); |
| 1587 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 1577 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1588 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 1578 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 1589 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 1579 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 1590 EXPECT_TRUE(visitor_.header_->fec_flag); | 1580 EXPECT_TRUE(visitor_.header_->fec_flag); |
| 1591 EXPECT_TRUE(visitor_.header_->entropy_flag); | 1581 EXPECT_TRUE(visitor_.header_->entropy_flag); |
| 1592 EXPECT_EQ(1 << (header.packet_number % 8), visitor_.header_->entropy_hash); | 1582 EXPECT_EQ(1 << (header.packet_number % 8), visitor_.header_->entropy_hash); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1708 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1698 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 1709 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1699 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 1710 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | 1700 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
| 1711 EXPECT_EQ(0xBA, frame.entropy_hash); | 1701 EXPECT_EQ(0xBA, frame.entropy_hash); |
| 1712 EXPECT_EQ(kLargestObserved, frame.largest_observed); | 1702 EXPECT_EQ(kLargestObserved, frame.largest_observed); |
| 1713 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); | 1703 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); |
| 1714 ASSERT_EQ(2u, frame.received_packet_times.size()); | 1704 ASSERT_EQ(2u, frame.received_packet_times.size()); |
| 1715 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); | 1705 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); |
| 1716 | 1706 |
| 1717 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 1707 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
| 1718 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1708 const size_t kLargestObservedOffset = |
| 1719 kQuicEntropyHashSize; | 1709 kReceivedEntropyOffset + kQuicEntropyHashSize; |
| 1720 const size_t kMissingDeltaTimeOffset = | 1710 const size_t kMissingDeltaTimeOffset = |
| 1721 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | 1711 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; |
| 1722 const size_t kNumTimestampsOffset = | 1712 const size_t kNumTimestampsOffset = |
| 1723 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | 1713 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
| 1724 const size_t kTimestampDeltaLargestObserved1 = | 1714 const size_t kTimestampDeltaLargestObserved1 = |
| 1725 kNumTimestampsOffset + kQuicNumTimestampsSize; | 1715 kNumTimestampsOffset + kQuicNumTimestampsSize; |
| 1726 const size_t kTimestampTimeDeltaLargestObserved1 = | 1716 const size_t kTimestampTimeDeltaLargestObserved1 = |
| 1727 kTimestampDeltaLargestObserved1 + 1; | 1717 kTimestampDeltaLargestObserved1 + 1; |
| 1728 const size_t kTimestampDeltaLargestObserved2 = | 1718 const size_t kTimestampDeltaLargestObserved2 = |
| 1729 kTimestampTimeDeltaLargestObserved1 + 4; | 1719 kTimestampTimeDeltaLargestObserved1 + 4; |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1833 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 1823 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
| 1834 const size_t kLargestObservedOffset = | 1824 const size_t kLargestObservedOffset = |
| 1835 kReceivedEntropyOffset + kQuicEntropyHashSize; | 1825 kReceivedEntropyOffset + kQuicEntropyHashSize; |
| 1836 const size_t kMissingDeltaTimeOffset = | 1826 const size_t kMissingDeltaTimeOffset = |
| 1837 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | 1827 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; |
| 1838 const size_t kNumTimestampsOffset = | 1828 const size_t kNumTimestampsOffset = |
| 1839 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | 1829 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
| 1840 const size_t kTimestampDeltaLargestObserved = | 1830 const size_t kTimestampDeltaLargestObserved = |
| 1841 kNumTimestampsOffset + kQuicNumTimestampsSize; | 1831 kNumTimestampsOffset + kQuicNumTimestampsSize; |
| 1842 const size_t kTimestampTimeDeltaLargestObserved = | 1832 const size_t kTimestampTimeDeltaLargestObserved = |
| 1843 kTimestampDeltaLargestObserved + 1; | 1833 kTimestampDeltaLargestObserved + 1; |
| 1844 const size_t kNumMissingPacketOffset = kTimestampTimeDeltaLargestObserved + 4; | 1834 const size_t kNumMissingPacketOffset = kTimestampTimeDeltaLargestObserved + 4; |
| 1845 const size_t kMissingPacketsOffset = | 1835 const size_t kMissingPacketsOffset = |
| 1846 kNumMissingPacketOffset + kNumberOfNackRangesSize; | 1836 kNumMissingPacketOffset + kNumberOfNackRangesSize; |
| 1847 const size_t kMissingPacketsRange = | 1837 const size_t kMissingPacketsRange = |
| 1848 kMissingPacketsOffset + PACKET_1BYTE_PACKET_NUMBER; | 1838 kMissingPacketsOffset + PACKET_1BYTE_PACKET_NUMBER; |
| 1849 const size_t kRevivedPacketsLength = | 1839 const size_t kRevivedPacketsLength = |
| 1850 kMissingPacketsRange + PACKET_1BYTE_PACKET_NUMBER; | 1840 kMissingPacketsRange + PACKET_1BYTE_PACKET_NUMBER; |
| 1851 // Now test framing boundaries. | 1841 // Now test framing boundaries. |
| 1852 const size_t ack_frame_size = | 1842 const size_t ack_frame_size = |
| 1853 kRevivedPacketsLength + PACKET_1BYTE_PACKET_NUMBER; | 1843 kRevivedPacketsLength + PACKET_1BYTE_PACKET_NUMBER; |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1925 | 1915 |
| 1926 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1916 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 1927 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1917 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 1928 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | 1918 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
| 1929 EXPECT_EQ(0xBA, frame.entropy_hash); | 1919 EXPECT_EQ(0xBA, frame.entropy_hash); |
| 1930 EXPECT_EQ(kLargestObserved, frame.largest_observed); | 1920 EXPECT_EQ(kLargestObserved, frame.largest_observed); |
| 1931 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); | 1921 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); |
| 1932 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); | 1922 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); |
| 1933 | 1923 |
| 1934 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 1924 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
| 1935 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1925 const size_t kLargestObservedOffset = |
| 1936 kQuicEntropyHashSize; | 1926 kReceivedEntropyOffset + kQuicEntropyHashSize; |
| 1937 const size_t kMissingDeltaTimeOffset = | 1927 const size_t kMissingDeltaTimeOffset = |
| 1938 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | 1928 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; |
| 1939 const size_t kNumTimestampsOffset = kMissingDeltaTimeOffset + | 1929 const size_t kNumTimestampsOffset = |
| 1940 kQuicDeltaTimeLargestObservedSize; | 1930 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
| 1941 const size_t kNumMissingPacketOffset = kNumTimestampsOffset + | 1931 const size_t kNumMissingPacketOffset = |
| 1942 kQuicNumTimestampsSize; | 1932 kNumTimestampsOffset + kQuicNumTimestampsSize; |
| 1943 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 1933 const size_t kMissingPacketsOffset = |
| 1944 kNumberOfNackRangesSize; | 1934 kNumMissingPacketOffset + kNumberOfNackRangesSize; |
| 1945 const size_t kMissingPacketsRange = | 1935 const size_t kMissingPacketsRange = |
| 1946 kMissingPacketsOffset + PACKET_1BYTE_PACKET_NUMBER; | 1936 kMissingPacketsOffset + PACKET_1BYTE_PACKET_NUMBER; |
| 1947 const size_t kRevivedPacketsLength = | 1937 const size_t kRevivedPacketsLength = |
| 1948 kMissingPacketsRange + PACKET_1BYTE_PACKET_NUMBER; | 1938 kMissingPacketsRange + PACKET_1BYTE_PACKET_NUMBER; |
| 1949 // Now test framing boundaries. | 1939 // Now test framing boundaries. |
| 1950 const size_t ack_frame_size = | 1940 const size_t ack_frame_size = |
| 1951 kRevivedPacketsLength + PACKET_1BYTE_PACKET_NUMBER; | 1941 kRevivedPacketsLength + PACKET_1BYTE_PACKET_NUMBER; |
| 1952 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 1942 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
| 1953 string expected_error; | 1943 string expected_error; |
| 1954 if (i < kLargestObservedOffset) { | 1944 if (i < kLargestObservedOffset) { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2023 | 2013 |
| 2024 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2014 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2025 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 2015 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 2026 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | 2016 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
| 2027 EXPECT_EQ(0xBA, frame.entropy_hash); | 2017 EXPECT_EQ(0xBA, frame.entropy_hash); |
| 2028 EXPECT_EQ(kLargestObserved, frame.largest_observed); | 2018 EXPECT_EQ(kLargestObserved, frame.largest_observed); |
| 2029 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); | 2019 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); |
| 2030 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); | 2020 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); |
| 2031 | 2021 |
| 2032 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 2022 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
| 2033 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 2023 const size_t kLargestObservedOffset = |
| 2034 kQuicEntropyHashSize; | 2024 kReceivedEntropyOffset + kQuicEntropyHashSize; |
| 2035 const size_t kMissingDeltaTimeOffset = | 2025 const size_t kMissingDeltaTimeOffset = |
| 2036 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | 2026 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; |
| 2037 const size_t kNumTimestampsOffset = kMissingDeltaTimeOffset + | 2027 const size_t kNumTimestampsOffset = |
| 2038 kQuicDeltaTimeLargestObservedSize; | 2028 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
| 2039 const size_t kNumMissingPacketOffset = kNumTimestampsOffset + | 2029 const size_t kNumMissingPacketOffset = |
| 2040 kQuicNumTimestampsSize; | 2030 kNumTimestampsOffset + kQuicNumTimestampsSize; |
| 2041 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 2031 const size_t kMissingPacketsOffset = |
| 2042 kNumberOfNackRangesSize; | 2032 kNumMissingPacketOffset + kNumberOfNackRangesSize; |
| 2043 const size_t kMissingPacketsRange = | 2033 const size_t kMissingPacketsRange = |
| 2044 kMissingPacketsOffset + PACKET_1BYTE_PACKET_NUMBER; | 2034 kMissingPacketsOffset + PACKET_1BYTE_PACKET_NUMBER; |
| 2045 const size_t kRevivedPacketsLength = | 2035 const size_t kRevivedPacketsLength = |
| 2046 kMissingPacketsRange + PACKET_1BYTE_PACKET_NUMBER; | 2036 kMissingPacketsRange + PACKET_1BYTE_PACKET_NUMBER; |
| 2047 const size_t kRevivedPacketSequenceNumberLength = | 2037 const size_t kRevivedPacketSequenceNumberLength = |
| 2048 kRevivedPacketsLength + PACKET_1BYTE_PACKET_NUMBER; | 2038 kRevivedPacketsLength + PACKET_1BYTE_PACKET_NUMBER; |
| 2049 // Now test framing boundaries. | 2039 // Now test framing boundaries. |
| 2050 const size_t ack_frame_size = | 2040 const size_t ack_frame_size = |
| 2051 kRevivedPacketSequenceNumberLength + PACKET_6BYTE_PACKET_NUMBER; | 2041 kRevivedPacketSequenceNumberLength + PACKET_6BYTE_PACKET_NUMBER; |
| 2052 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 2042 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2187 ASSERT_EQ(500u, frame->missing_packets.NumPacketsSlow()); | 2177 ASSERT_EQ(500u, frame->missing_packets.NumPacketsSlow()); |
| 2188 EXPECT_EQ(kMissingPacket - 499, frame->missing_packets.Min()); | 2178 EXPECT_EQ(kMissingPacket - 499, frame->missing_packets.Min()); |
| 2189 EXPECT_EQ(kMissingPacket, frame->missing_packets.Max()); | 2179 EXPECT_EQ(kMissingPacket, frame->missing_packets.Max()); |
| 2190 | 2180 |
| 2191 // Verify that the packet re-serializes identically. | 2181 // Verify that the packet re-serializes identically. |
| 2192 QuicFrames frames; | 2182 QuicFrames frames; |
| 2193 frames.push_back(QuicFrame(frame)); | 2183 frames.push_back(QuicFrame(frame)); |
| 2194 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | 2184 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); |
| 2195 ASSERT_TRUE(data != nullptr); | 2185 ASSERT_TRUE(data != nullptr); |
| 2196 | 2186 |
| 2197 test::CompareCharArraysWithHexError("constructed packet", | 2187 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 2198 data->data(), data->length(), | 2188 data->length(), AsChars(packet), |
| 2199 AsChars(packet), arraysize(packet)); | 2189 arraysize(packet)); |
| 2200 } | 2190 } |
| 2201 | 2191 |
| 2202 TEST_P(QuicFramerTest, StopWaitingFrame) { | 2192 TEST_P(QuicFramerTest, StopWaitingFrame) { |
| 2203 // clang-format off | 2193 // clang-format off |
| 2204 unsigned char packet[] = { | 2194 unsigned char packet[] = { |
| 2205 // public flags (8 byte connection_id) | 2195 // public flags (8 byte connection_id) |
| 2206 0x3C, | 2196 0x3C, |
| 2207 // connection_id | 2197 // connection_id |
| 2208 0x10, 0x32, 0x54, 0x76, | 2198 0x10, 0x32, 0x54, 0x76, |
| 2209 0x98, 0xBA, 0xDC, 0xFE, | 2199 0x98, 0xBA, 0xDC, 0xFE, |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2416 EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code); | 2406 EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code); |
| 2417 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase); | 2407 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase); |
| 2418 | 2408 |
| 2419 const size_t reason_size = arraysize("because I can") - 1; | 2409 const size_t reason_size = arraysize("because I can") - 1; |
| 2420 // Now test framing boundaries. | 2410 // Now test framing boundaries. |
| 2421 for (size_t i = kQuicFrameTypeSize; | 2411 for (size_t i = kQuicFrameTypeSize; |
| 2422 i < QuicFramer::GetMinGoAwayFrameSize() + reason_size; ++i) { | 2412 i < QuicFramer::GetMinGoAwayFrameSize() + reason_size; ++i) { |
| 2423 string expected_error; | 2413 string expected_error; |
| 2424 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { | 2414 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { |
| 2425 expected_error = "Unable to read go away error code."; | 2415 expected_error = "Unable to read go away error code."; |
| 2426 } else if (i < kQuicFrameTypeSize + kQuicErrorCodeSize + | 2416 } else if (i < |
| 2427 kQuicMaxStreamIdSize) { | 2417 kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicMaxStreamIdSize) { |
| 2428 expected_error = "Unable to read last good stream id."; | 2418 expected_error = "Unable to read last good stream id."; |
| 2429 } else { | 2419 } else { |
| 2430 expected_error = "Unable to read goaway reason."; | 2420 expected_error = "Unable to read goaway reason."; |
| 2431 } | 2421 } |
| 2432 CheckProcessingFails( | 2422 CheckProcessingFails( |
| 2433 packet, | 2423 packet, |
| 2434 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2424 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 2435 PACKET_6BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP), | 2425 PACKET_6BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP), |
| 2436 expected_error, QUIC_INVALID_GOAWAY_DATA); | 2426 expected_error, QUIC_INVALID_GOAWAY_DATA); |
| 2437 } | 2427 } |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2596 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2586 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2597 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); | 2587 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2598 ASSERT_TRUE(visitor_.public_reset_packet_.get()); | 2588 ASSERT_TRUE(visitor_.public_reset_packet_.get()); |
| 2599 EXPECT_EQ(kConnectionId, | 2589 EXPECT_EQ(kConnectionId, |
| 2600 visitor_.public_reset_packet_->public_header.connection_id); | 2590 visitor_.public_reset_packet_->public_header.connection_id); |
| 2601 EXPECT_TRUE(visitor_.public_reset_packet_->public_header.reset_flag); | 2591 EXPECT_TRUE(visitor_.public_reset_packet_->public_header.reset_flag); |
| 2602 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); | 2592 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); |
| 2603 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); | 2593 EXPECT_EQ(kNonceProof, visitor_.public_reset_packet_->nonce_proof); |
| 2604 EXPECT_EQ(kPacketNumber, | 2594 EXPECT_EQ(kPacketNumber, |
| 2605 visitor_.public_reset_packet_->rejected_packet_number); | 2595 visitor_.public_reset_packet_->rejected_packet_number); |
| 2606 EXPECT_TRUE( | 2596 EXPECT_EQ(ADDRESS_FAMILY_UNSPECIFIED, |
| 2607 visitor_.public_reset_packet_->client_address.address().empty()); | 2597 visitor_.public_reset_packet_->client_address.GetFamily()); |
| 2608 | 2598 |
| 2609 // Now test framing boundaries. | 2599 // Now test framing boundaries. |
| 2610 for (size_t i = 0; i < arraysize(packet); ++i) { | 2600 for (size_t i = 0; i < arraysize(packet); ++i) { |
| 2611 string expected_error; | 2601 string expected_error; |
| 2612 DVLOG(1) << "iteration: " << i; | 2602 DVLOG(1) << "iteration: " << i; |
| 2613 if (i < kConnectionIdOffset) { | 2603 if (i < kConnectionIdOffset) { |
| 2614 expected_error = "Unable to read public flags."; | 2604 expected_error = "Unable to read public flags."; |
| 2615 CheckProcessingFails(packet, i, expected_error, | 2605 CheckProcessingFails(packet, i, expected_error, |
| 2616 QUIC_INVALID_PACKET_HEADER); | 2606 QUIC_INVALID_PACKET_HEADER); |
| 2617 } else if (i < kPublicResetPacketMessageTagOffset) { | 2607 } else if (i < kPublicResetPacketMessageTagOffset) { |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2845 // clang-format on | 2835 // clang-format on |
| 2846 | 2836 |
| 2847 uint64 header_size = | 2837 uint64 header_size = |
| 2848 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2838 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 2849 PACKET_6BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); | 2839 PACKET_6BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); |
| 2850 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); | 2840 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 2851 | 2841 |
| 2852 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2842 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 2853 ASSERT_TRUE(data != nullptr); | 2843 ASSERT_TRUE(data != nullptr); |
| 2854 | 2844 |
| 2855 test::CompareCharArraysWithHexError("constructed packet", | 2845 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 2856 data->data(), data->length(), | 2846 data->length(), AsChars(packet), |
| 2857 AsChars(packet), | |
| 2858 arraysize(packet)); | 2847 arraysize(packet)); |
| 2859 } | 2848 } |
| 2860 | 2849 |
| 2861 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) { | 2850 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) { |
| 2862 QuicPacketHeader header; | 2851 QuicPacketHeader header; |
| 2863 header.public_header.connection_id = kConnectionId; | 2852 header.public_header.connection_id = kConnectionId; |
| 2864 header.public_header.reset_flag = false; | 2853 header.public_header.reset_flag = false; |
| 2865 header.public_header.version_flag = false; | 2854 header.public_header.version_flag = false; |
| 2866 header.fec_flag = false; | 2855 header.fec_flag = false; |
| 2867 header.entropy_flag = false; | 2856 header.entropy_flag = false; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2893 // clang-format on | 2882 // clang-format on |
| 2894 | 2883 |
| 2895 uint64 header_size = | 2884 uint64 header_size = |
| 2896 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2885 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 2897 PACKET_4BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); | 2886 PACKET_4BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); |
| 2898 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); | 2887 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 2899 | 2888 |
| 2900 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2889 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 2901 ASSERT_TRUE(data != nullptr); | 2890 ASSERT_TRUE(data != nullptr); |
| 2902 | 2891 |
| 2903 test::CompareCharArraysWithHexError("constructed packet", | 2892 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 2904 data->data(), data->length(), | 2893 data->length(), AsChars(packet), |
| 2905 AsChars(packet), | |
| 2906 arraysize(packet)); | 2894 arraysize(packet)); |
| 2907 } | 2895 } |
| 2908 | 2896 |
| 2909 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) { | 2897 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) { |
| 2910 QuicPacketHeader header; | 2898 QuicPacketHeader header; |
| 2911 header.public_header.connection_id = kConnectionId; | 2899 header.public_header.connection_id = kConnectionId; |
| 2912 header.public_header.reset_flag = false; | 2900 header.public_header.reset_flag = false; |
| 2913 header.public_header.version_flag = false; | 2901 header.public_header.version_flag = false; |
| 2914 header.fec_flag = false; | 2902 header.fec_flag = false; |
| 2915 header.entropy_flag = false; | 2903 header.entropy_flag = false; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2941 // clang-format on | 2929 // clang-format on |
| 2942 | 2930 |
| 2943 uint64 header_size = | 2931 uint64 header_size = |
| 2944 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2932 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 2945 PACKET_2BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); | 2933 PACKET_2BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); |
| 2946 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); | 2934 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 2947 | 2935 |
| 2948 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2936 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 2949 ASSERT_TRUE(data != nullptr); | 2937 ASSERT_TRUE(data != nullptr); |
| 2950 | 2938 |
| 2951 test::CompareCharArraysWithHexError("constructed packet", | 2939 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 2952 data->data(), data->length(), | 2940 data->length(), AsChars(packet), |
| 2953 AsChars(packet), | |
| 2954 arraysize(packet)); | 2941 arraysize(packet)); |
| 2955 } | 2942 } |
| 2956 | 2943 |
| 2957 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) { | 2944 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) { |
| 2958 QuicPacketHeader header; | 2945 QuicPacketHeader header; |
| 2959 header.public_header.connection_id = kConnectionId; | 2946 header.public_header.connection_id = kConnectionId; |
| 2960 header.public_header.reset_flag = false; | 2947 header.public_header.reset_flag = false; |
| 2961 header.public_header.version_flag = false; | 2948 header.public_header.version_flag = false; |
| 2962 header.fec_flag = false; | 2949 header.fec_flag = false; |
| 2963 header.entropy_flag = false; | 2950 header.entropy_flag = false; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2989 // clang-format on | 2976 // clang-format on |
| 2990 | 2977 |
| 2991 uint64 header_size = | 2978 uint64 header_size = |
| 2992 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2979 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 2993 PACKET_1BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); | 2980 PACKET_1BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); |
| 2994 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); | 2981 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 2995 | 2982 |
| 2996 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2983 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 2997 ASSERT_TRUE(data != nullptr); | 2984 ASSERT_TRUE(data != nullptr); |
| 2998 | 2985 |
| 2999 test::CompareCharArraysWithHexError("constructed packet", | 2986 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3000 data->data(), data->length(), | 2987 data->length(), AsChars(packet), |
| 3001 AsChars(packet), | |
| 3002 arraysize(packet)); | 2988 arraysize(packet)); |
| 3003 } | 2989 } |
| 3004 | 2990 |
| 3005 TEST_P(QuicFramerTest, BuildStreamFramePacket) { | 2991 TEST_P(QuicFramerTest, BuildStreamFramePacket) { |
| 3006 QuicPacketHeader header; | 2992 QuicPacketHeader header; |
| 3007 header.public_header.connection_id = kConnectionId; | 2993 header.public_header.connection_id = kConnectionId; |
| 3008 header.public_header.reset_flag = false; | 2994 header.public_header.reset_flag = false; |
| 3009 header.public_header.version_flag = false; | 2995 header.public_header.version_flag = false; |
| 3010 header.fec_flag = false; | 2996 header.fec_flag = false; |
| 3011 header.entropy_flag = true; | 2997 header.entropy_flag = true; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 3041 // data | 3027 // data |
| 3042 'h', 'e', 'l', 'l', | 3028 'h', 'e', 'l', 'l', |
| 3043 'o', ' ', 'w', 'o', | 3029 'o', ' ', 'w', 'o', |
| 3044 'r', 'l', 'd', '!', | 3030 'r', 'l', 'd', '!', |
| 3045 }; | 3031 }; |
| 3046 // clang-format on | 3032 // clang-format on |
| 3047 | 3033 |
| 3048 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3034 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 3049 ASSERT_TRUE(data != nullptr); | 3035 ASSERT_TRUE(data != nullptr); |
| 3050 | 3036 |
| 3051 test::CompareCharArraysWithHexError("constructed packet", | 3037 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3052 data->data(), data->length(), | 3038 data->length(), AsChars(packet), |
| 3053 AsChars(packet), arraysize(packet)); | 3039 arraysize(packet)); |
| 3054 } | 3040 } |
| 3055 | 3041 |
| 3056 TEST_P(QuicFramerTest, BuildStreamFramePacketInFecGroup) { | 3042 TEST_P(QuicFramerTest, BuildStreamFramePacketInFecGroup) { |
| 3057 QuicPacketHeader header; | 3043 QuicPacketHeader header; |
| 3058 header.public_header.connection_id = kConnectionId; | 3044 header.public_header.connection_id = kConnectionId; |
| 3059 header.public_header.reset_flag = false; | 3045 header.public_header.reset_flag = false; |
| 3060 header.public_header.version_flag = false; | 3046 header.public_header.version_flag = false; |
| 3061 header.fec_flag = false; | 3047 header.fec_flag = false; |
| 3062 header.entropy_flag = true; | 3048 header.entropy_flag = true; |
| 3063 header.packet_number = kPacketNumber; | 3049 header.packet_number = kPacketNumber; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 3090 // data length (since packet is in an FEC group) | 3076 // data length (since packet is in an FEC group) |
| 3091 0x0C, 0x00, | 3077 0x0C, 0x00, |
| 3092 // data | 3078 // data |
| 3093 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', | 3079 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', |
| 3094 }; | 3080 }; |
| 3095 // clang-format on | 3081 // clang-format on |
| 3096 | 3082 |
| 3097 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3083 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 3098 ASSERT_TRUE(data != nullptr); | 3084 ASSERT_TRUE(data != nullptr); |
| 3099 | 3085 |
| 3100 test::CompareCharArraysWithHexError("constructed packet", | 3086 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3101 data->data(), data->length(), | 3087 data->length(), AsChars(packet), |
| 3102 AsChars(packet), arraysize(packet)); | 3088 arraysize(packet)); |
| 3103 } | 3089 } |
| 3104 | 3090 |
| 3105 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) { | 3091 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) { |
| 3106 QuicPacketHeader header; | 3092 QuicPacketHeader header; |
| 3107 header.public_header.connection_id = kConnectionId; | 3093 header.public_header.connection_id = kConnectionId; |
| 3108 header.public_header.reset_flag = false; | 3094 header.public_header.reset_flag = false; |
| 3109 header.public_header.version_flag = true; | 3095 header.public_header.version_flag = true; |
| 3110 header.fec_flag = false; | 3096 header.fec_flag = false; |
| 3111 header.entropy_flag = true; | 3097 header.entropy_flag = true; |
| 3112 header.packet_number = kPacketNumber; | 3098 header.packet_number = kPacketNumber; |
| 3113 header.fec_group = 0; | 3099 header.fec_group = 0; |
| 3114 | 3100 |
| 3115 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, | 3101 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, |
| 3116 StringPiece("hello world!")); | 3102 StringPiece("hello world!")); |
| 3117 | 3103 |
| 3118 QuicFrames frames; | 3104 QuicFrames frames; |
| 3119 frames.push_back(QuicFrame(&stream_frame)); | 3105 frames.push_back(QuicFrame(&stream_frame)); |
| 3120 | 3106 |
| 3121 // clang-format off | 3107 // clang-format off |
| 3122 unsigned char packet[] = { | 3108 unsigned char packet[] = { |
| 3123 // public flags (version, 8 byte connection_id) | 3109 // public flags (version, 8 byte connection_id) |
| 3124 0x3D, | 3110 0x3D, |
| 3125 // connection_id | 3111 // connection_id |
| 3126 0x10, | 3112 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 3127 0x32, | |
| 3128 0x54, | |
| 3129 0x76, | |
| 3130 0x98, | |
| 3131 0xBA, | |
| 3132 0xDC, | |
| 3133 0xFE, | |
| 3134 // version tag | 3113 // version tag |
| 3135 'Q', | 3114 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
| 3136 '0', | |
| 3137 GetQuicVersionDigitTens(), | |
| 3138 GetQuicVersionDigitOnes(), | |
| 3139 // packet number | 3115 // packet number |
| 3140 0xBC, | 3116 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 3141 0x9A, | |
| 3142 0x78, | |
| 3143 0x56, | |
| 3144 0x34, | |
| 3145 0x12, | |
| 3146 // private flags (entropy) | 3117 // private flags (entropy) |
| 3147 0x01, | 3118 0x01, |
| 3148 | 3119 |
| 3149 // frame type (stream frame with fin and no length) | 3120 // frame type (stream frame with fin and no length) |
| 3150 0xDF, | 3121 0xDF, |
| 3151 // stream id | 3122 // stream id |
| 3152 0x04, | 3123 0x04, 0x03, 0x02, 0x01, |
| 3153 0x03, | |
| 3154 0x02, | |
| 3155 0x01, | |
| 3156 // offset | 3124 // offset |
| 3157 0x54, | 3125 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
| 3158 0x76, | |
| 3159 0x10, | |
| 3160 0x32, | |
| 3161 0xDC, | |
| 3162 0xFE, | |
| 3163 0x98, | |
| 3164 0xBA, | |
| 3165 // data | 3126 // data |
| 3166 'h', | 3127 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', |
| 3167 'e', | |
| 3168 'l', | |
| 3169 'l', | |
| 3170 'o', | |
| 3171 ' ', | |
| 3172 'w', | |
| 3173 'o', | |
| 3174 'r', | |
| 3175 'l', | |
| 3176 'd', | |
| 3177 '!', | |
| 3178 }; | 3128 }; |
| 3179 // clang-format on | 3129 // clang-format on |
| 3180 | 3130 |
| 3181 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); | 3131 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); |
| 3182 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3132 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 3183 ASSERT_TRUE(data != nullptr); | 3133 ASSERT_TRUE(data != nullptr); |
| 3184 | 3134 |
| 3185 test::CompareCharArraysWithHexError("constructed packet", | 3135 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3186 data->data(), data->length(), | 3136 data->length(), AsChars(packet), |
| 3187 AsChars(packet), arraysize(packet)); | 3137 arraysize(packet)); |
| 3188 } | 3138 } |
| 3189 | 3139 |
| 3190 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) { | 3140 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) { |
| 3191 // clang-format off | 3141 // clang-format off |
| 3192 unsigned char packet[] = { | 3142 unsigned char packet[] = { |
| 3193 // public flags (version, 8 byte connection_id) | 3143 // public flags (version, 8 byte connection_id) |
| 3194 0x0D, | 3144 0x0D, |
| 3195 // connection_id | 3145 // connection_id |
| 3196 0x10, | 3146 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 3197 0x32, | |
| 3198 0x54, | |
| 3199 0x76, | |
| 3200 0x98, | |
| 3201 0xBA, | |
| 3202 0xDC, | |
| 3203 0xFE, | |
| 3204 // version tag | 3147 // version tag |
| 3205 'Q', | 3148 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
| 3206 '0', | |
| 3207 GetQuicVersionDigitTens(), | |
| 3208 GetQuicVersionDigitOnes(), | |
| 3209 }; | 3149 }; |
| 3210 // clang-format on | 3150 // clang-format on |
| 3211 | 3151 |
| 3212 QuicConnectionId connection_id = kConnectionId; | 3152 QuicConnectionId connection_id = kConnectionId; |
| 3213 scoped_ptr<QuicEncryptedPacket> data(framer_.BuildVersionNegotiationPacket( | 3153 scoped_ptr<QuicEncryptedPacket> data(framer_.BuildVersionNegotiationPacket( |
| 3214 connection_id, SupportedVersions(GetParam()))); | 3154 connection_id, SupportedVersions(GetParam()))); |
| 3215 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 3155 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3216 data->length(), AsChars(packet), | 3156 data->length(), AsChars(packet), |
| 3217 arraysize(packet)); | 3157 arraysize(packet)); |
| 3218 } | 3158 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3265 // 0 more missing packets in range. | 3205 // 0 more missing packets in range. |
| 3266 0x00, | 3206 0x00, |
| 3267 // 0 revived packets. | 3207 // 0 revived packets. |
| 3268 0x00, | 3208 0x00, |
| 3269 }; | 3209 }; |
| 3270 // clang-format on | 3210 // clang-format on |
| 3271 | 3211 |
| 3272 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3212 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 3273 ASSERT_TRUE(data != nullptr); | 3213 ASSERT_TRUE(data != nullptr); |
| 3274 | 3214 |
| 3275 test::CompareCharArraysWithHexError("constructed packet", | 3215 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3276 data->data(), data->length(), | 3216 data->length(), AsChars(packet), |
| 3277 AsChars(packet), arraysize(packet)); | 3217 arraysize(packet)); |
| 3278 } | 3218 } |
| 3279 | 3219 |
| 3280 // TODO(jri): Add test for tuncated packets in which the original ack frame had | 3220 // TODO(jri): Add test for tuncated packets in which the original ack frame had |
| 3281 // revived packets. (In both the large and small packet cases below). | 3221 // revived packets. (In both the large and small packet cases below). |
| 3282 | 3222 |
| 3283 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) { | 3223 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) { |
| 3284 QuicPacketHeader header; | 3224 QuicPacketHeader header; |
| 3285 header.public_header.connection_id = kConnectionId; | 3225 header.public_header.connection_id = kConnectionId; |
| 3286 header.public_header.reset_flag = false; | 3226 header.public_header.reset_flag = false; |
| 3287 header.public_header.version_flag = false; | 3227 header.public_header.version_flag = false; |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3379 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3319 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3380 | 3320 |
| 3381 // 0 revived packets. | 3321 // 0 revived packets. |
| 3382 0x00, | 3322 0x00, |
| 3383 }; | 3323 }; |
| 3384 // clang-format on | 3324 // clang-format on |
| 3385 | 3325 |
| 3386 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3326 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 3387 ASSERT_TRUE(data != nullptr); | 3327 ASSERT_TRUE(data != nullptr); |
| 3388 | 3328 |
| 3389 test::CompareCharArraysWithHexError("constructed packet", | 3329 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3390 data->data(), data->length(), | 3330 data->length(), AsChars(packet), |
| 3391 AsChars(packet), arraysize(packet)); | 3331 arraysize(packet)); |
| 3392 } | 3332 } |
| 3393 | 3333 |
| 3394 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { | 3334 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { |
| 3395 QuicPacketHeader header; | 3335 QuicPacketHeader header; |
| 3396 header.public_header.connection_id = kConnectionId; | 3336 header.public_header.connection_id = kConnectionId; |
| 3397 header.public_header.reset_flag = false; | 3337 header.public_header.reset_flag = false; |
| 3398 header.public_header.version_flag = false; | 3338 header.public_header.version_flag = false; |
| 3399 header.fec_flag = false; | 3339 header.fec_flag = false; |
| 3400 header.entropy_flag = true; | 3340 header.entropy_flag = true; |
| 3401 header.packet_number = kPacketNumber; | 3341 header.packet_number = kPacketNumber; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3444 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3384 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3445 // 0 revived packets. | 3385 // 0 revived packets. |
| 3446 0x00, | 3386 0x00, |
| 3447 }; | 3387 }; |
| 3448 // clang-format on | 3388 // clang-format on |
| 3449 | 3389 |
| 3450 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames, 37u)); | 3390 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames, 37u)); |
| 3451 ASSERT_TRUE(data != nullptr); | 3391 ASSERT_TRUE(data != nullptr); |
| 3452 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. | 3392 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. |
| 3453 EXPECT_EQ(36u, data->length()); | 3393 EXPECT_EQ(36u, data->length()); |
| 3454 test::CompareCharArraysWithHexError("constructed packet", | 3394 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3455 data->data(), data->length(), | 3395 data->length(), AsChars(packet), |
| 3456 AsChars(packet), arraysize(packet)); | 3396 arraysize(packet)); |
| 3457 } | 3397 } |
| 3458 | 3398 |
| 3459 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { | 3399 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { |
| 3460 QuicPacketHeader header; | 3400 QuicPacketHeader header; |
| 3461 header.public_header.connection_id = kConnectionId; | 3401 header.public_header.connection_id = kConnectionId; |
| 3462 header.public_header.reset_flag = false; | 3402 header.public_header.reset_flag = false; |
| 3463 header.public_header.version_flag = false; | 3403 header.public_header.version_flag = false; |
| 3464 header.fec_flag = false; | 3404 header.fec_flag = false; |
| 3465 header.entropy_flag = true; | 3405 header.entropy_flag = true; |
| 3466 header.packet_number = kPacketNumber; | 3406 header.packet_number = kPacketNumber; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 3491 0x14, | 3431 0x14, |
| 3492 // least packet number awaiting an ack, delta from packet number. | 3432 // least packet number awaiting an ack, delta from packet number. |
| 3493 0x1C, 0x00, 0x00, 0x00, | 3433 0x1C, 0x00, 0x00, 0x00, |
| 3494 0x00, 0x00, | 3434 0x00, 0x00, |
| 3495 }; | 3435 }; |
| 3496 // clang-format on | 3436 // clang-format on |
| 3497 | 3437 |
| 3498 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3438 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 3499 ASSERT_TRUE(data != nullptr); | 3439 ASSERT_TRUE(data != nullptr); |
| 3500 | 3440 |
| 3501 test::CompareCharArraysWithHexError("constructed packet", | 3441 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3502 data->data(), data->length(), | 3442 data->length(), AsChars(packet), |
| 3503 AsChars(packet), arraysize(packet)); | 3443 arraysize(packet)); |
| 3504 } | 3444 } |
| 3505 | 3445 |
| 3506 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) { | 3446 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) { |
| 3507 QuicPacketHeader header; | 3447 QuicPacketHeader header; |
| 3508 header.public_header.connection_id = kConnectionId; | 3448 header.public_header.connection_id = kConnectionId; |
| 3509 header.public_header.reset_flag = false; | 3449 header.public_header.reset_flag = false; |
| 3510 header.public_header.version_flag = false; | 3450 header.public_header.version_flag = false; |
| 3511 header.fec_flag = false; | 3451 header.fec_flag = false; |
| 3512 header.entropy_flag = false; | 3452 header.entropy_flag = false; |
| 3513 header.packet_number = kPacketNumber; | 3453 header.packet_number = kPacketNumber; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3594 'b', 'e', 'c', 'a', | 3534 'b', 'e', 'c', 'a', |
| 3595 'u', 's', 'e', ' ', | 3535 'u', 's', 'e', ' ', |
| 3596 'I', ' ', 'c', 'a', | 3536 'I', ' ', 'c', 'a', |
| 3597 'n', | 3537 'n', |
| 3598 }; | 3538 }; |
| 3599 // clang-format on | 3539 // clang-format on |
| 3600 | 3540 |
| 3601 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3541 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 3602 ASSERT_TRUE(data != nullptr); | 3542 ASSERT_TRUE(data != nullptr); |
| 3603 | 3543 |
| 3604 test::CompareCharArraysWithHexError("constructed packet", | 3544 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3605 data->data(), data->length(), | 3545 data->length(), AsChars(packet), |
| 3606 AsChars(packet), arraysize(packet)); | 3546 arraysize(packet)); |
| 3607 } | 3547 } |
| 3608 | 3548 |
| 3609 TEST_P(QuicFramerTest, BuildGoAwayPacket) { | 3549 TEST_P(QuicFramerTest, BuildGoAwayPacket) { |
| 3610 QuicPacketHeader header; | 3550 QuicPacketHeader header; |
| 3611 header.public_header.connection_id = kConnectionId; | 3551 header.public_header.connection_id = kConnectionId; |
| 3612 header.public_header.reset_flag = false; | 3552 header.public_header.reset_flag = false; |
| 3613 header.public_header.version_flag = false; | 3553 header.public_header.version_flag = false; |
| 3614 header.fec_flag = false; | 3554 header.fec_flag = false; |
| 3615 header.entropy_flag = true; | 3555 header.entropy_flag = true; |
| 3616 header.packet_number = kPacketNumber; | 3556 header.packet_number = kPacketNumber; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3649 'b', 'e', 'c', 'a', | 3589 'b', 'e', 'c', 'a', |
| 3650 'u', 's', 'e', ' ', | 3590 'u', 's', 'e', ' ', |
| 3651 'I', ' ', 'c', 'a', | 3591 'I', ' ', 'c', 'a', |
| 3652 'n', | 3592 'n', |
| 3653 }; | 3593 }; |
| 3654 // clang-format on | 3594 // clang-format on |
| 3655 | 3595 |
| 3656 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3596 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 3657 ASSERT_TRUE(data != nullptr); | 3597 ASSERT_TRUE(data != nullptr); |
| 3658 | 3598 |
| 3659 test::CompareCharArraysWithHexError("constructed packet", | 3599 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3660 data->data(), data->length(), | 3600 data->length(), AsChars(packet), |
| 3661 AsChars(packet), arraysize(packet)); | 3601 arraysize(packet)); |
| 3662 } | 3602 } |
| 3663 | 3603 |
| 3664 TEST_P(QuicFramerTest, BuildWindowUpdatePacket) { | 3604 TEST_P(QuicFramerTest, BuildWindowUpdatePacket) { |
| 3665 QuicPacketHeader header; | 3605 QuicPacketHeader header; |
| 3666 header.public_header.connection_id = kConnectionId; | 3606 header.public_header.connection_id = kConnectionId; |
| 3667 header.public_header.reset_flag = false; | 3607 header.public_header.reset_flag = false; |
| 3668 header.public_header.version_flag = false; | 3608 header.public_header.version_flag = false; |
| 3669 header.fec_flag = false; | 3609 header.fec_flag = false; |
| 3670 header.entropy_flag = true; | 3610 header.entropy_flag = true; |
| 3671 header.packet_number = kPacketNumber; | 3611 header.packet_number = kPacketNumber; |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3869 // rejected packet number | 3809 // rejected packet number |
| 3870 0xBC, 0x9A, 0x78, 0x56, | 3810 0xBC, 0x9A, 0x78, 0x56, |
| 3871 0x34, 0x12, 0x00, 0x00, | 3811 0x34, 0x12, 0x00, 0x00, |
| 3872 }; | 3812 }; |
| 3873 // clang-format on | 3813 // clang-format on |
| 3874 | 3814 |
| 3875 scoped_ptr<QuicEncryptedPacket> data( | 3815 scoped_ptr<QuicEncryptedPacket> data( |
| 3876 framer_.BuildPublicResetPacket(reset_packet)); | 3816 framer_.BuildPublicResetPacket(reset_packet)); |
| 3877 ASSERT_TRUE(data != nullptr); | 3817 ASSERT_TRUE(data != nullptr); |
| 3878 | 3818 |
| 3879 test::CompareCharArraysWithHexError("constructed packet", | 3819 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3880 data->data(), data->length(), | 3820 data->length(), AsChars(packet), |
| 3881 AsChars(packet), arraysize(packet)); | 3821 arraysize(packet)); |
| 3882 } | 3822 } |
| 3883 | 3823 |
| 3884 TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) { | 3824 TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) { |
| 3885 QuicPublicResetPacket reset_packet; | 3825 QuicPublicResetPacket reset_packet; |
| 3886 reset_packet.public_header.connection_id = kConnectionId; | 3826 reset_packet.public_header.connection_id = kConnectionId; |
| 3887 reset_packet.public_header.reset_flag = true; | 3827 reset_packet.public_header.reset_flag = true; |
| 3888 reset_packet.public_header.version_flag = false; | 3828 reset_packet.public_header.version_flag = false; |
| 3889 reset_packet.rejected_packet_number = kPacketNumber; | 3829 reset_packet.rejected_packet_number = kPacketNumber; |
| 3890 reset_packet.nonce_proof = kNonceProof; | 3830 reset_packet.nonce_proof = kNonceProof; |
| 3891 reset_packet.client_address = IPEndPoint(Loopback4(), 0x1234); | 3831 reset_packet.client_address = IPEndPoint(Loopback4(), 0x1234); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3923 0x02, 0x00, | 3863 0x02, 0x00, |
| 3924 0x7F, 0x00, 0x00, 0x01, | 3864 0x7F, 0x00, 0x00, 0x01, |
| 3925 0x34, 0x12, | 3865 0x34, 0x12, |
| 3926 }; | 3866 }; |
| 3927 // clang-format on | 3867 // clang-format on |
| 3928 | 3868 |
| 3929 scoped_ptr<QuicEncryptedPacket> data( | 3869 scoped_ptr<QuicEncryptedPacket> data( |
| 3930 framer_.BuildPublicResetPacket(reset_packet)); | 3870 framer_.BuildPublicResetPacket(reset_packet)); |
| 3931 ASSERT_TRUE(data != nullptr); | 3871 ASSERT_TRUE(data != nullptr); |
| 3932 | 3872 |
| 3933 test::CompareCharArraysWithHexError("constructed packet", | 3873 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3934 data->data(), data->length(), | 3874 data->length(), AsChars(packet), |
| 3935 AsChars(packet), arraysize(packet)); | 3875 arraysize(packet)); |
| 3936 } | 3876 } |
| 3937 | 3877 |
| 3938 TEST_P(QuicFramerTest, BuildFecPacket) { | 3878 TEST_P(QuicFramerTest, BuildFecPacket) { |
| 3939 QuicPacketHeader header; | 3879 QuicPacketHeader header; |
| 3940 header.public_header.connection_id = kConnectionId; | 3880 header.public_header.connection_id = kConnectionId; |
| 3941 header.public_header.reset_flag = false; | 3881 header.public_header.reset_flag = false; |
| 3942 header.public_header.version_flag = false; | 3882 header.public_header.version_flag = false; |
| 3943 header.fec_flag = true; | 3883 header.fec_flag = true; |
| 3944 header.entropy_flag = true; | 3884 header.entropy_flag = true; |
| 3945 header.packet_number = kPacketNumber; | 3885 header.packet_number = kPacketNumber; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3967 'a', 'b', 'c', 'd', | 3907 'a', 'b', 'c', 'd', |
| 3968 'e', 'f', 'g', 'h', | 3908 'e', 'f', 'g', 'h', |
| 3969 'i', 'j', 'k', 'l', | 3909 'i', 'j', 'k', 'l', |
| 3970 'm', 'n', 'o', 'p', | 3910 'm', 'n', 'o', 'p', |
| 3971 }; | 3911 }; |
| 3972 // clang-format on | 3912 // clang-format on |
| 3973 | 3913 |
| 3974 scoped_ptr<QuicPacket> data(framer_.BuildFecPacket(header, redundancy)); | 3914 scoped_ptr<QuicPacket> data(framer_.BuildFecPacket(header, redundancy)); |
| 3975 ASSERT_TRUE(data != nullptr); | 3915 ASSERT_TRUE(data != nullptr); |
| 3976 | 3916 |
| 3977 test::CompareCharArraysWithHexError("constructed packet", | 3917 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3978 data->data(), data->length(), | 3918 data->length(), AsChars(packet), |
| 3979 AsChars(packet), arraysize(packet)); | 3919 arraysize(packet)); |
| 3980 } | 3920 } |
| 3981 | 3921 |
| 3982 TEST_P(QuicFramerTest, EncryptPacket) { | 3922 TEST_P(QuicFramerTest, EncryptPacket) { |
| 3983 QuicPacketNumber packet_number = kPacketNumber; | 3923 QuicPacketNumber packet_number = kPacketNumber; |
| 3984 // clang-format off | 3924 // clang-format off |
| 3985 unsigned char packet[] = { | 3925 unsigned char packet[] = { |
| 3986 // public flags (8 byte connection_id) | 3926 // public flags (8 byte connection_id) |
| 3987 0x3C, | 3927 0x3C, |
| 3988 // connection_id | 3928 // connection_id |
| 3989 0x10, 0x32, 0x54, 0x76, | 3929 0x10, 0x32, 0x54, 0x76, |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4386 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0); | 4326 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0); |
| 4387 EXPECT_CALL(visitor, OnAckFrame(_)).Times(0); | 4327 EXPECT_CALL(visitor, OnAckFrame(_)).Times(0); |
| 4388 EXPECT_CALL(visitor, OnPacketComplete()).Times(0); | 4328 EXPECT_CALL(visitor, OnPacketComplete()).Times(0); |
| 4389 | 4329 |
| 4390 EXPECT_FALSE(framer_.ProcessPacket(*packet)); | 4330 EXPECT_FALSE(framer_.ProcessPacket(*packet)); |
| 4391 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); | 4331 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); |
| 4392 } | 4332 } |
| 4393 | 4333 |
| 4394 } // namespace test | 4334 } // namespace test |
| 4395 } // namespace net | 4335 } // namespace net |
| OLD | NEW |