1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <algorithm> 6 #include <map> 7 #include <string> 8 #include <vector> 9 10 #include "base/containers/hash_tables.h" 11 #include "base/logging.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "base/port.h" 14 #include "base/stl_util.h" 15 #include "net/quic/crypto/quic_decrypter.h" 16 #include "net/quic/crypto/quic_encrypter.h" 17 #include "net/quic/quic_framer.h" 18 #include "net/quic/quic_protocol.h" 19 #include "net/quic/quic_utils.h" 20 #include "net/quic/test_tools/quic_framer_peer.h" 21 #include "net/quic/test_tools/quic_test_utils.h" 22 23 using base::hash_set; 24 using base::StringPiece; 25 using std::make_pair; 26 using std::map; 27 using std::numeric_limits; 28 using std::string; 29 using std::vector; 30 using testing::Return; 31 using testing::_; 32 33 namespace net { 34 namespace test { 35 36 const QuicPacketSequenceNumber kEpoch = GG_UINT64_C(1) << 48; 37 const QuicPacketSequenceNumber kMask = kEpoch - 1; 38 39 // Index into the flags offset in the header. 40 const size_t kPublicFlagsOffset = 0; 41 // Index into the guid offset in the header. 42 const size_t kGuidOffset = kPublicFlagsSize; 43 // Index into the version string in the header. (if present). 44 const size_t kVersionOffset = kGuidOffset + PACKET_8BYTE_GUID; 45 46 // Index into the sequence number offset in the header. 47 size_t GetSequenceNumberOffset(QuicGuidLength guid_length, 48 bool include_version) { 49 return kGuidOffset + guid_length + 50 (include_version ? kQuicVersionSize : 0); 51 } 52 53 size_t GetSequenceNumberOffset(bool include_version) { 54 return GetSequenceNumberOffset(PACKET_8BYTE_GUID, include_version); 55 } 56 57 // Index into the private flags offset in the data packet header. 58 size_t GetPrivateFlagsOffset(QuicGuidLength guid_length, bool include_version) { 59 return GetSequenceNumberOffset(guid_length, include_version) + 60 PACKET_6BYTE_SEQUENCE_NUMBER; 61 } 62 63 size_t GetPrivateFlagsOffset(bool include_version) { 64 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version); 65 } 66 67 size_t GetPrivateFlagsOffset(bool include_version, 68 QuicSequenceNumberLength sequence_number_length) { 69 return GetSequenceNumberOffset(PACKET_8BYTE_GUID, include_version) + 70 sequence_number_length; 71 } 72 73 // Index into the fec group offset in the header. 74 size_t GetFecGroupOffset(QuicGuidLength guid_length, bool include_version) { 75 return GetPrivateFlagsOffset(guid_length, include_version) + 76 kPrivateFlagsSize; 77 } 78 79 size_t GetFecGroupOffset(bool include_version) { 80 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version) + 81 kPrivateFlagsSize; 82 } 83 84 size_t GetFecGroupOffset(bool include_version, 85 QuicSequenceNumberLength sequence_number_length) { 86 return GetPrivateFlagsOffset(include_version, sequence_number_length) + 87 kPrivateFlagsSize; 88 } 89 90 // Index into the nonce proof of the public reset packet. 91 // Public resets always have full guids. 92 const size_t kPublicResetPacketNonceProofOffset = 93 kGuidOffset + PACKET_8BYTE_GUID; 94 95 // Index into the rejected sequence number of the public reset packet. 96 const size_t kPublicResetPacketRejectedSequenceNumberOffset = 97 kPublicResetPacketNonceProofOffset + kPublicResetNonceSize; 98 99 class TestEncrypter : public QuicEncrypter { 100 public: 101 virtual ~TestEncrypter() {} 102 virtual bool SetKey(StringPiece key) OVERRIDE { 103 return true; 104 } 105 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { 106 return true; 107 } 108 virtual bool Encrypt(StringPiece nonce, 109 StringPiece associated_data, 110 StringPiece plaintext, 111 unsigned char* output) OVERRIDE { 112 CHECK(false) << "Not implemented"; 113 return false; 114 } 115 virtual QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number, 116 StringPiece associated_data, 117 StringPiece plaintext) OVERRIDE { 118 sequence_number_ = sequence_number; 119 associated_data_ = associated_data.as_string(); 120 plaintext_ = plaintext.as_string(); 121 return new QuicData(plaintext.data(), plaintext.length()); 122 } 123 virtual size_t GetKeySize() const OVERRIDE { 124 return 0; 125 } 126 virtual size_t GetNoncePrefixSize() const OVERRIDE { 127 return 0; 128 } 129 virtual size_t GetMaxPlaintextSize(size_t ciphertext_size) const OVERRIDE { 130 return ciphertext_size; 131 } 132 virtual size_t GetCiphertextSize(size_t plaintext_size) const OVERRIDE { 133 return plaintext_size; 134 } 135 virtual StringPiece GetKey() const OVERRIDE { 136 return StringPiece(); 137 } 138 virtual StringPiece GetNoncePrefix() const OVERRIDE { 139 return StringPiece(); 140 } 141 QuicPacketSequenceNumber sequence_number_; 142 string associated_data_; 143 string plaintext_; 144 }; 145 146 class TestDecrypter : public QuicDecrypter { 147 public: 148 virtual ~TestDecrypter() {} 149 virtual bool SetKey(StringPiece key) OVERRIDE { 150 return true; 151 } 152 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { 153 return true; 154 } 155 virtual bool Decrypt(StringPiece nonce, 156 StringPiece associated_data, 157 StringPiece ciphertext, 158 unsigned char* output, 159 size_t* output_length) OVERRIDE { 160 CHECK(false) << "Not implemented"; 161 return false; 162 } 163 virtual QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number, 164 StringPiece associated_data, 165 StringPiece ciphertext) OVERRIDE { 166 sequence_number_ = sequence_number; 167 associated_data_ = associated_data.as_string(); 168 ciphertext_ = ciphertext.as_string(); 169 return new QuicData(ciphertext.data(), ciphertext.length()); 170 } 171 virtual StringPiece GetKey() const OVERRIDE { 172 return StringPiece(); 173 } 174 virtual StringPiece GetNoncePrefix() const OVERRIDE { 175 return StringPiece(); 176 } 177 QuicPacketSequenceNumber sequence_number_; 178 string associated_data_; 179 string ciphertext_; 180 }; 181 182 class TestQuicVisitor : public ::net::QuicFramerVisitorInterface { 183 public: 184 TestQuicVisitor() 185 : error_count_(0), 186 version_mismatch_(0), 187 packet_count_(0), 188 frame_count_(0), 189 fec_count_(0), 190 complete_packets_(0), 191 revived_packets_(0), 192 accept_packet_(true) { 193 } 194 195 virtual ~TestQuicVisitor() { 196 STLDeleteElements(&stream_frames_); 197 STLDeleteElements(&ack_frames_); 198 STLDeleteElements(&congestion_feedback_frames_); 199 STLDeleteElements(&fec_data_); 200 } 201 202 virtual void OnError(QuicFramer* f) OVERRIDE { 203 DLOG(INFO) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) 204 << " (" << f->error() << ")"; 205 error_count_++; 206 } 207 208 virtual void OnPacket() OVERRIDE {} 209 210 virtual void OnPublicResetPacket( 211 const QuicPublicResetPacket& packet) OVERRIDE { 212 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); 213 } 214 215 virtual void OnVersionNegotiationPacket( 216 const QuicVersionNegotiationPacket& packet) OVERRIDE { 217 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet)); 218 } 219 220 virtual void OnRevivedPacket() OVERRIDE { 221 revived_packets_++; 222 } 223 224 virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE { 225 DLOG(INFO) << "QuicFramer Version Mismatch, version: " << version; 226 version_mismatch_++; 227 return true; 228 } 229 230 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE { 231 packet_count_++; 232 header_.reset(new QuicPacketHeader(header)); 233 return accept_packet_; 234 } 235 236 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE { 237 frame_count_++; 238 stream_frames_.push_back(new QuicStreamFrame(frame)); 239 return true; 240 } 241 242 virtual void OnFecProtectedPayload(StringPiece payload) OVERRIDE { 243 fec_protected_payload_ = payload.as_string(); 244 } 245 246 virtual bool OnAckFrame(const QuicAckFrame& frame) OVERRIDE { 247 frame_count_++; 248 ack_frames_.push_back(new QuicAckFrame(frame)); 249 return true; 250 } 251 252 virtual bool OnCongestionFeedbackFrame( 253 const QuicCongestionFeedbackFrame& frame) OVERRIDE { 254 frame_count_++; 255 congestion_feedback_frames_.push_back( 256 new QuicCongestionFeedbackFrame(frame)); 257 return true; 258 } 259 260 virtual void OnFecData(const QuicFecData& fec) OVERRIDE { 261 fec_count_++; 262 fec_data_.push_back(new QuicFecData(fec)); 263 } 264 265 virtual void OnPacketComplete() OVERRIDE { 266 complete_packets_++; 267 } 268 269 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE { 270 rst_stream_frame_ = frame; 271 return true; 272 } 273 274 virtual bool OnConnectionCloseFrame( 275 const QuicConnectionCloseFrame& frame) OVERRIDE { 276 connection_close_frame_ = frame; 277 return true; 278 } 279 280 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE { 281 goaway_frame_ = frame; 282 return true; 283 } 284 285 // Counters from the visitor_ callbacks. 286 int error_count_; 287 int version_mismatch_; 288 int packet_count_; 289 int frame_count_; 290 int fec_count_; 291 int complete_packets_; 292 int revived_packets_; 293 bool accept_packet_; 294 295 scoped_ptr<QuicPacketHeader> header_; 296 scoped_ptr<QuicPublicResetPacket> public_reset_packet_; 297 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; 298 vector<QuicStreamFrame*> stream_frames_; 299 vector<QuicAckFrame*> ack_frames_; 300 vector<QuicCongestionFeedbackFrame*> congestion_feedback_frames_; 301 vector<QuicFecData*> fec_data_; 302 string fec_protected_payload_; 303 QuicRstStreamFrame rst_stream_frame_; 304 QuicConnectionCloseFrame connection_close_frame_; 305 QuicGoAwayFrame goaway_frame_; 306 }; 307 308 class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> { 309 public: 310 QuicFramerTest() 311 : encrypter_(new test::TestEncrypter()), 312 decrypter_(new test::TestDecrypter()), 313 start_(QuicTime::Zero().Add(QuicTime::Delta::FromMicroseconds(0x10))), 314 framer_(QuicVersionMax(), start_, true) { 315 framer_.SetDecrypter(decrypter_); 316 framer_.SetEncrypter(ENCRYPTION_NONE, encrypter_); 317 framer_.set_visitor(&visitor_); 318 framer_.set_received_entropy_calculator(&entropy_calculator_); 319 320 version_ = GetParam(); 321 framer_.set_version(version_); 322 } 323 324 bool CheckEncryption(QuicPacketSequenceNumber sequence_number, 325 QuicPacket* packet) { 326 if (sequence_number != encrypter_->sequence_number_) { 327 LOG(ERROR) << "Encrypted incorrect packet sequence number. expected " 328 << sequence_number << " actual: " 329 << encrypter_->sequence_number_; 330 return false; 331 } 332 if (packet->AssociatedData() != encrypter_->associated_data_) { 333 LOG(ERROR) << "Encrypted incorrect associated data. expected " 334 << packet->AssociatedData() << " actual: " 335 << encrypter_->associated_data_; 336 return false; 337 } 338 if (packet->Plaintext() != encrypter_->plaintext_) { 339 LOG(ERROR) << "Encrypted incorrect plaintext data. expected " 340 << packet->Plaintext() << " actual: " 341 << encrypter_->plaintext_; 342 return false; 343 } 344 return true; 345 } 346 347 bool CheckDecryption(const QuicEncryptedPacket& encrypted, 348 bool includes_version) { 349 if (visitor_.header_->packet_sequence_number != 350 decrypter_->sequence_number_) { 351 LOG(ERROR) << "Decrypted incorrect packet sequence number. expected " 352 << visitor_.header_->packet_sequence_number << " actual: " 353 << decrypter_->sequence_number_; 354 return false; 355 } 356 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( 357 encrypted, PACKET_8BYTE_GUID, 358 includes_version, PACKET_6BYTE_SEQUENCE_NUMBER) != 359 decrypter_->associated_data_) { 360 LOG(ERROR) << "Decrypted incorrect associated data. expected " 361 << QuicFramer::GetAssociatedDataFromEncryptedPacket( 362 encrypted, PACKET_8BYTE_GUID, 363 includes_version, PACKET_6BYTE_SEQUENCE_NUMBER) 364 << " actual: " << decrypter_->associated_data_; 365 return false; 366 } 367 StringPiece ciphertext(encrypted.AsStringPiece().substr( 368 GetStartOfEncryptedData(PACKET_8BYTE_GUID, includes_version, 369 PACKET_6BYTE_SEQUENCE_NUMBER))); 370 if (ciphertext != decrypter_->ciphertext_) { 371 LOG(ERROR) << "Decrypted incorrect ciphertext data. expected " 372 << ciphertext << " actual: " 373 << decrypter_->ciphertext_; 374 return false; 375 } 376 return true; 377 } 378 379 char* AsChars(unsigned char* data) { 380 return reinterpret_cast<char*>(data); 381 } 382 383 void CheckProcessingFails(unsigned char* packet, 384 size_t len, 385 string expected_error, 386 QuicErrorCode error_code) { 387 QuicEncryptedPacket encrypted(AsChars(packet), len, false); 388 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len; 389 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len; 390 EXPECT_EQ(error_code, framer_.error()) << "len: " << len; 391 } 392 393 void ValidateTruncatedAck(const QuicAckFrame* ack, size_t keys) { 394 for (size_t i = 1; i < keys; ++i) { 395 EXPECT_TRUE(ContainsKey(ack->received_info.missing_packets, i)) << i; 396 } 397 EXPECT_EQ(keys, ack->received_info.largest_observed); 398 } 399 400 void CheckCalculatePacketSequenceNumber( 401 QuicPacketSequenceNumber expected_sequence_number, 402 QuicPacketSequenceNumber last_sequence_number) { 403 QuicPacketSequenceNumber wire_sequence_number = 404 expected_sequence_number & kMask; 405 QuicFramerPeer::SetLastSequenceNumber(&framer_, last_sequence_number); 406 EXPECT_EQ(expected_sequence_number, 407 QuicFramerPeer::CalculatePacketSequenceNumberFromWire( 408 &framer_, PACKET_6BYTE_SEQUENCE_NUMBER, wire_sequence_number)) 409 << "last_sequence_number: " << last_sequence_number 410 << " wire_sequence_number: " << wire_sequence_number; 411 } 412 413 test::TestEncrypter* encrypter_; 414 test::TestDecrypter* decrypter_; 415 QuicVersion version_; 416 QuicTime start_; 417 QuicFramer framer_; 418 test::TestQuicVisitor visitor_; 419 test::TestEntropyCalculator entropy_calculator_; 420 }; 421 422 // Run all framer tests with all supported versions of QUIC. 423 INSTANTIATE_TEST_CASE_P(QuicFramerTests, 424 QuicFramerTest, 425 ::testing::ValuesIn(kSupportedQuicVersions)); 426 427 TEST_P(QuicFramerTest, CalculatePacketSequenceNumberFromWireNearEpochStart) { 428 // A few quick manual sanity checks 429 CheckCalculatePacketSequenceNumber(GG_UINT64_C(1), GG_UINT64_C(0)); 430 CheckCalculatePacketSequenceNumber(kEpoch + 1, kMask); 431 CheckCalculatePacketSequenceNumber(kEpoch, kMask); 432 433 // Cases where the last number was close to the start of the range 434 for (uint64 last = 0; last < 10; last++) { 435 // Small numbers should not wrap (even if they're out of order). 436 for (uint64 j = 0; j < 10; j++) { 437 CheckCalculatePacketSequenceNumber(j, last); 438 } 439 440 // Large numbers should not wrap either (because we're near 0 already). 441 for (uint64 j = 0; j < 10; j++) { 442 CheckCalculatePacketSequenceNumber(kEpoch - 1 - j, last); 443 } 444 } 445 } 446 447 TEST_P(QuicFramerTest, CalculatePacketSequenceNumberFromWireNearEpochEnd) { 448 // Cases where the last number was close to the end of the range 449 for (uint64 i = 0; i < 10; i++) { 450 QuicPacketSequenceNumber last = kEpoch - i; 451 452 // Small numbers should wrap. 453 for (uint64 j = 0; j < 10; j++) { 454 CheckCalculatePacketSequenceNumber(kEpoch + j, last); 455 } 456 457 // Large numbers should not (even if they're out of order). 458 for (uint64 j = 0; j < 10; j++) { 459 CheckCalculatePacketSequenceNumber(kEpoch - 1 - j, last); 460 } 461 } 462 } 463 464 // Next check where we're in a non-zero epoch to verify we handle 465 // reverse wrapping, too. 466 TEST_P(QuicFramerTest, CalculatePacketSequenceNumberFromWireNearPrevEpoch) { 467 const uint64 prev_epoch = 1 * kEpoch; 468 const uint64 cur_epoch = 2 * kEpoch; 469 // Cases where the last number was close to the start of the range 470 for (uint64 i = 0; i < 10; i++) { 471 uint64 last = cur_epoch + i; 472 // Small number should not wrap (even if they're out of order). 473 for (uint64 j = 0; j < 10; j++) { 474 CheckCalculatePacketSequenceNumber(cur_epoch + j, last); 475 } 476 477 // But large numbers should reverse wrap. 478 for (uint64 j = 0; j < 10; j++) { 479 uint64 num = kEpoch - 1 - j; 480 CheckCalculatePacketSequenceNumber(prev_epoch + num, last); 481 } 482 } 483 } 484 485 TEST_P(QuicFramerTest, CalculatePacketSequenceNumberFromWireNearNextEpoch) { 486 const uint64 cur_epoch = 2 * kEpoch; 487 const uint64 next_epoch = 3 * kEpoch; 488 // Cases where the last number was close to the end of the range 489 for (uint64 i = 0; i < 10; i++) { 490 QuicPacketSequenceNumber last = next_epoch - 1 - i; 491 492 // Small numbers should wrap. 493 for (uint64 j = 0; j < 10; j++) { 494 CheckCalculatePacketSequenceNumber(next_epoch + j, last); 495 } 496 497 // but large numbers should not (even if they're out of order). 498 for (uint64 j = 0; j < 10; j++) { 499 uint64 num = kEpoch - 1 - j; 500 CheckCalculatePacketSequenceNumber(cur_epoch + num, last); 501 } 502 } 503 } 504 505 TEST_P(QuicFramerTest, CalculatePacketSequenceNumberFromWireNearNextMax) { 506 const uint64 max_number = numeric_limits<uint64>::max(); 507 const uint64 max_epoch = max_number & ~kMask; 508 509 // Cases where the last number was close to the end of the range 510 for (uint64 i = 0; i < 10; i++) { 511 // Subtract 1, because the expected next sequence number is 1 more than the 512 // last sequence number. 513 QuicPacketSequenceNumber last = max_number - i - 1; 514 515 // Small numbers should not wrap, because they have nowhere to go. 516 for (uint64 j = 0; j < 10; j++) { 517 CheckCalculatePacketSequenceNumber(max_epoch + j, last); 518 } 519 520 // Large numbers should not wrap either. 521 for (uint64 j = 0; j < 10; j++) { 522 uint64 num = kEpoch - 1 - j; 523 CheckCalculatePacketSequenceNumber(max_epoch + num, last); 524 } 525 } 526 } 527 528 TEST_P(QuicFramerTest, EmptyPacket) { 529 char packet[] = { 0x00 }; 530 QuicEncryptedPacket encrypted(packet, 0, false); 531 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 532 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); 533 } 534 535 TEST_P(QuicFramerTest, LargePacket) { 536 unsigned char packet[kMaxPacketSize + 1] = { 537 // public flags (8 byte guid) 538 0x3C, 539 // guid 540 0x10, 0x32, 0x54, 0x76, 541 0x98, 0xBA, 0xDC, 0xFE, 542 // packet sequence number 543 0xBC, 0x9A, 0x78, 0x56, 544 0x34, 0x12, 545 // private flags 546 0x00, 547 }; 548 549 memset(packet + GetPacketHeaderSize( 550 PACKET_8BYTE_GUID, !kIncludeVersion, 551 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 0, 552 kMaxPacketSize - GetPacketHeaderSize( 553 PACKET_8BYTE_GUID, !kIncludeVersion, 554 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + 1); 555 556 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 557 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 558 559 ASSERT_TRUE(visitor_.header_.get()); 560 // Make sure we've parsed the packet header, so we can send an error. 561 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), 562 visitor_.header_->public_header.guid); 563 // Make sure the correct error is propagated. 564 EXPECT_EQ(QUIC_PACKET_TOO_LARGE, framer_.error()); 565 } 566 567 TEST_P(QuicFramerTest, PacketHeader) { 568 unsigned char packet[] = { 569 // public flags (8 byte guid) 570 0x3C, 571 // guid 572 0x10, 0x32, 0x54, 0x76, 573 0x98, 0xBA, 0xDC, 0xFE, 574 // packet sequence number 575 0xBC, 0x9A, 0x78, 0x56, 576 0x34, 0x12, 577 // private flags 578 0x00, 579 }; 580 581 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 582 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 583 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); 584 ASSERT_TRUE(visitor_.header_.get()); 585 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), 586 visitor_.header_->public_header.guid); 587 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 588 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 589 EXPECT_FALSE(visitor_.header_->fec_flag); 590 EXPECT_FALSE(visitor_.header_->entropy_flag); 591 EXPECT_EQ(0, visitor_.header_->entropy_hash); 592 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), 593 visitor_.header_->packet_sequence_number); 594 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 595 EXPECT_EQ(0x00u, visitor_.header_->fec_group); 596 597 // Now test framing boundaries 598 for (size_t i = 0; 599 i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 600 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 601 ++i) { 602 string expected_error; 603 if (i < kGuidOffset) { 604 expected_error = "Unable to read public flags."; 605 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { 606 expected_error = "Unable to read GUID."; 607 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion)) { 608 expected_error = "Unable to read sequence number."; 609 } else if (i < GetFecGroupOffset(!kIncludeVersion)) { 610 expected_error = "Unable to read private flags."; 611 } else { 612 expected_error = "Unable to read first fec protected packet offset."; 613 } 614 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 615 } 616 } 617 618 TEST_P(QuicFramerTest, PacketHeaderWith4ByteGuid) { 619 QuicFramerPeer::SetLastSerializedGuid(&framer_, 620 GG_UINT64_C(0xFEDCBA9876543210)); 621 622 unsigned char packet[] = { 623 // public flags (4 byte guid) 624 0x38, 625 // guid 626 0x10, 0x32, 0x54, 0x76, 627 // packet sequence number 628 0xBC, 0x9A, 0x78, 0x56, 629 0x34, 0x12, 630 // private flags 631 0x00, 632 }; 633 634 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 635 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 636 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); 637 ASSERT_TRUE(visitor_.header_.get()); 638 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), 639 visitor_.header_->public_header.guid); 640 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 641 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 642 EXPECT_FALSE(visitor_.header_->fec_flag); 643 EXPECT_FALSE(visitor_.header_->entropy_flag); 644 EXPECT_EQ(0, visitor_.header_->entropy_hash); 645 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), 646 visitor_.header_->packet_sequence_number); 647 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 648 EXPECT_EQ(0x00u, visitor_.header_->fec_group); 649 650 // Now test framing boundaries 651 for (size_t i = 0; 652 i < GetPacketHeaderSize(PACKET_4BYTE_GUID, !kIncludeVersion, 653 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 654 ++i) { 655 string expected_error; 656 if (i < kGuidOffset) { 657 expected_error = "Unable to read public flags."; 658 } else if (i < GetSequenceNumberOffset(PACKET_4BYTE_GUID, 659 !kIncludeVersion)) { 660 expected_error = "Unable to read GUID."; 661 } else if (i < GetPrivateFlagsOffset(PACKET_4BYTE_GUID, 662 !kIncludeVersion)) { 663 expected_error = "Unable to read sequence number."; 664 } else if (i < GetFecGroupOffset(PACKET_4BYTE_GUID, !kIncludeVersion)) { 665 expected_error = "Unable to read private flags."; 666 } else { 667 expected_error = "Unable to read first fec protected packet offset."; 668 } 669 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 670 } 671 } 672 673 TEST_P(QuicFramerTest, PacketHeader1ByteGuid) { 674 QuicFramerPeer::SetLastSerializedGuid(&framer_, 675 GG_UINT64_C(0xFEDCBA9876543210)); 676 677 unsigned char packet[] = { 678 // public flags (1 byte guid) 679 0x34, 680 // guid 681 0x10, 682 // packet sequence number 683 0xBC, 0x9A, 0x78, 0x56, 684 0x34, 0x12, 685 // private flags 686 0x00, 687 }; 688 689 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 690 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 691 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); 692 ASSERT_TRUE(visitor_.header_.get()); 693 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), 694 visitor_.header_->public_header.guid); 695 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 696 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 697 EXPECT_FALSE(visitor_.header_->fec_flag); 698 EXPECT_FALSE(visitor_.header_->entropy_flag); 699 EXPECT_EQ(0, visitor_.header_->entropy_hash); 700 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), 701 visitor_.header_->packet_sequence_number); 702 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 703 EXPECT_EQ(0x00u, visitor_.header_->fec_group); 704 705 // Now test framing boundaries 706 for (size_t i = 0; 707 i < GetPacketHeaderSize(PACKET_1BYTE_GUID, !kIncludeVersion, 708 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 709 ++i) { 710 string expected_error; 711 if (i < kGuidOffset) { 712 expected_error = "Unable to read public flags."; 713 } else if (i < GetSequenceNumberOffset(PACKET_1BYTE_GUID, 714 !kIncludeVersion)) { 715 expected_error = "Unable to read GUID."; 716 } else if (i < GetPrivateFlagsOffset(PACKET_1BYTE_GUID, !kIncludeVersion)) { 717 expected_error = "Unable to read sequence number."; 718 } else if (i < GetFecGroupOffset(PACKET_1BYTE_GUID, !kIncludeVersion)) { 719 expected_error = "Unable to read private flags."; 720 } else { 721 expected_error = "Unable to read first fec protected packet offset."; 722 } 723 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 724 } 725 } 726 727 TEST_P(QuicFramerTest, PacketHeaderWith0ByteGuid) { 728 QuicFramerPeer::SetLastSerializedGuid(&framer_, 729 GG_UINT64_C(0xFEDCBA9876543210)); 730 731 unsigned char packet[] = { 732 // public flags (0 byte guid) 733 0x30, 734 // guid 735 // packet sequence number 736 0xBC, 0x9A, 0x78, 0x56, 737 0x34, 0x12, 738 // private flags 739 0x00, 740 }; 741 742 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 743 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 744 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); 745 ASSERT_TRUE(visitor_.header_.get()); 746 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), 747 visitor_.header_->public_header.guid); 748 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 749 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 750 EXPECT_FALSE(visitor_.header_->fec_flag); 751 EXPECT_FALSE(visitor_.header_->entropy_flag); 752 EXPECT_EQ(0, visitor_.header_->entropy_hash); 753 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), 754 visitor_.header_->packet_sequence_number); 755 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 756 EXPECT_EQ(0x00u, visitor_.header_->fec_group); 757 758 // Now test framing boundaries 759 for (size_t i = 0; 760 i < GetPacketHeaderSize(PACKET_0BYTE_GUID, !kIncludeVersion, 761 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 762 ++i) { 763 string expected_error; 764 if (i < kGuidOffset) { 765 expected_error = "Unable to read public flags."; 766 } else if (i < GetSequenceNumberOffset(PACKET_0BYTE_GUID, 767 !kIncludeVersion)) { 768 expected_error = "Unable to read GUID."; 769 } else if (i < GetPrivateFlagsOffset(PACKET_0BYTE_GUID, !kIncludeVersion)) { 770 expected_error = "Unable to read sequence number."; 771 } else if (i < GetFecGroupOffset(PACKET_0BYTE_GUID, !kIncludeVersion)) { 772 expected_error = "Unable to read private flags."; 773 } else { 774 expected_error = "Unable to read first fec protected packet offset."; 775 } 776 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 777 } 778 } 779 780 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) { 781 // Set a specific version. 782 framer_.set_version(QUIC_VERSION_7); 783 784 unsigned char packet[] = { 785 // public flags (version) 786 0x3D, 787 // guid 788 0x10, 0x32, 0x54, 0x76, 789 0x98, 0xBA, 0xDC, 0xFE, 790 // version tag 791 'Q', '0', '0', '7', 792 // packet sequence number 793 0xBC, 0x9A, 0x78, 0x56, 794 0x34, 0x12, 795 // private flags 796 0x00, 797 }; 798 799 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 800 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 801 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); 802 ASSERT_TRUE(visitor_.header_.get()); 803 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), 804 visitor_.header_->public_header.guid); 805 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 806 EXPECT_TRUE(visitor_.header_->public_header.version_flag); 807 EXPECT_EQ(QUIC_VERSION_7, visitor_.header_->public_header.versions[0]); 808 EXPECT_FALSE(visitor_.header_->fec_flag); 809 EXPECT_FALSE(visitor_.header_->entropy_flag); 810 EXPECT_EQ(0, visitor_.header_->entropy_hash); 811 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), 812 visitor_.header_->packet_sequence_number); 813 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 814 EXPECT_EQ(0x00u, visitor_.header_->fec_group); 815 816 // Now test framing boundaries 817 for (size_t i = 0; 818 i < GetPacketHeaderSize(PACKET_8BYTE_GUID, kIncludeVersion, 819 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 820 ++i) { 821 string expected_error; 822 if (i < kGuidOffset) { 823 expected_error = "Unable to read public flags."; 824 } else if (i < kVersionOffset) { 825 expected_error = "Unable to read GUID."; 826 } else if (i < GetSequenceNumberOffset(kIncludeVersion)) { 827 expected_error = "Unable to read protocol version."; 828 } else if (i < GetPrivateFlagsOffset(kIncludeVersion)) { 829 expected_error = "Unable to read sequence number."; 830 } else if (i < GetFecGroupOffset(kIncludeVersion)) { 831 expected_error = "Unable to read private flags."; 832 } else { 833 expected_error = "Unable to read first fec protected packet offset."; 834 } 835 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 836 } 837 } 838 839 TEST_P(QuicFramerTest, PacketHeaderWith4ByteSequenceNumber) { 840 QuicFramerPeer::SetLastSequenceNumber(&framer_, 841 GG_UINT64_C(0x123456789ABA)); 842 843 unsigned char packet[] = { 844 // public flags (8 byte guid and 4 byte sequence number) 845 0x2C, 846 // guid 847 0x10, 0x32, 0x54, 0x76, 848 0x98, 0xBA, 0xDC, 0xFE, 849 // packet sequence number 850 0xBC, 0x9A, 0x78, 0x56, 851 // private flags 852 0x00, 853 }; 854 855 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 856 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 857 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); 858 ASSERT_TRUE(visitor_.header_.get()); 859 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), 860 visitor_.header_->public_header.guid); 861 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 862 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 863 EXPECT_FALSE(visitor_.header_->fec_flag); 864 EXPECT_FALSE(visitor_.header_->entropy_flag); 865 EXPECT_EQ(0, visitor_.header_->entropy_hash); 866 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), 867 visitor_.header_->packet_sequence_number); 868 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 869 EXPECT_EQ(0x00u, visitor_.header_->fec_group); 870 871 // Now test framing boundaries 872 for (size_t i = 0; 873 i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 874 PACKET_4BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 875 ++i) { 876 string expected_error; 877 if (i < kGuidOffset) { 878 expected_error = "Unable to read public flags."; 879 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { 880 expected_error = "Unable to read GUID."; 881 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, 882 PACKET_4BYTE_SEQUENCE_NUMBER)) { 883 expected_error = "Unable to read sequence number."; 884 } else if (i < GetFecGroupOffset(!kIncludeVersion, 885 PACKET_4BYTE_SEQUENCE_NUMBER)) { 886 expected_error = "Unable to read private flags."; 887 } else { 888 expected_error = "Unable to read first fec protected packet offset."; 889 } 890 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 891 } 892 } 893 894 TEST_P(QuicFramerTest, PacketHeaderWith2ByteSequenceNumber) { 895 QuicFramerPeer::SetLastSequenceNumber(&framer_, 896 GG_UINT64_C(0x123456789ABA)); 897 898 unsigned char packet[] = { 899 // public flags (8 byte guid and 2 byte sequence number) 900 0x1C, 901 // guid 902 0x10, 0x32, 0x54, 0x76, 903 0x98, 0xBA, 0xDC, 0xFE, 904 // packet sequence number 905 0xBC, 0x9A, 906 // private flags 907 0x00, 908 }; 909 910 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 911 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 912 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); 913 ASSERT_TRUE(visitor_.header_.get()); 914 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), 915 visitor_.header_->public_header.guid); 916 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 917 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 918 EXPECT_FALSE(visitor_.header_->fec_flag); 919 EXPECT_FALSE(visitor_.header_->entropy_flag); 920 EXPECT_EQ(0, visitor_.header_->entropy_hash); 921 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), 922 visitor_.header_->packet_sequence_number); 923 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 924 EXPECT_EQ(0x00u, visitor_.header_->fec_group); 925 926 // Now test framing boundaries 927 for (size_t i = 0; 928 i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 929 PACKET_2BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 930 ++i) { 931 string expected_error; 932 if (i < kGuidOffset) { 933 expected_error = "Unable to read public flags."; 934 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { 935 expected_error = "Unable to read GUID."; 936 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, 937 PACKET_2BYTE_SEQUENCE_NUMBER)) { 938 expected_error = "Unable to read sequence number."; 939 } else if (i < GetFecGroupOffset(!kIncludeVersion, 940 PACKET_2BYTE_SEQUENCE_NUMBER)) { 941 expected_error = "Unable to read private flags."; 942 } else { 943 expected_error = "Unable to read first fec protected packet offset."; 944 } 945 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 946 } 947 } 948 949 TEST_P(QuicFramerTest, PacketHeaderWith1ByteSequenceNumber) { 950 QuicFramerPeer::SetLastSequenceNumber(&framer_, 951 GG_UINT64_C(0x123456789ABA)); 952 953 unsigned char packet[] = { 954 // public flags (8 byte guid and 1 byte sequence number) 955 0x0C, 956 // guid 957 0x10, 0x32, 0x54, 0x76, 958 0x98, 0xBA, 0xDC, 0xFE, 959 // packet sequence number 960 0xBC, 961 // private flags 962 0x00, 963 }; 964 965 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 966 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 967 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); 968 ASSERT_TRUE(visitor_.header_.get()); 969 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), 970 visitor_.header_->public_header.guid); 971 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 972 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 973 EXPECT_FALSE(visitor_.header_->fec_flag); 974 EXPECT_FALSE(visitor_.header_->entropy_flag); 975 EXPECT_EQ(0, visitor_.header_->entropy_hash); 976 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), 977 visitor_.header_->packet_sequence_number); 978 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 979 EXPECT_EQ(0x00u, visitor_.header_->fec_group); 980 981 // Now test framing boundaries 982 for (size_t i = 0; 983 i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 984 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 985 ++i) { 986 string expected_error; 987 if (i < kGuidOffset) { 988 expected_error = "Unable to read public flags."; 989 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { 990 expected_error = "Unable to read GUID."; 991 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, 992 PACKET_1BYTE_SEQUENCE_NUMBER)) { 993 expected_error = "Unable to read sequence number."; 994 } else if (i < GetFecGroupOffset(!kIncludeVersion, 995 PACKET_1BYTE_SEQUENCE_NUMBER)) { 996 expected_error = "Unable to read private flags."; 997 } else { 998 expected_error = "Unable to read first fec protected packet offset."; 999 } 1000 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 1001 } 1002 } 1003 1004 TEST_P(QuicFramerTest, InvalidPublicFlag) { 1005 unsigned char packet[] = { 1006 // public flags, unknown flag at bit 6 1007 0x40, 1008 // guid 1009 0x10, 0x32, 0x54, 0x76, 1010 0x98, 0xBA, 0xDC, 0xFE, 1011 // packet sequence number 1012 0xBC, 0x9A, 0x78, 0x56, 1013 0x34, 0x12, 1014 // private flags 1015 0x00, 1016 1017 // frame count 1018 0x01, 1019 // frame type (stream frame) 1020 0x01, 1021 // stream id 1022 0x04, 0x03, 0x02, 0x01, 1023 // fin 1024 0x01, 1025 // offset 1026 0x54, 0x76, 0x10, 0x32, 1027 0xDC, 0xFE, 0x98, 0xBA, 1028 // data length 1029 0x0c, 0x00, 1030 // data 1031 'h', 'e', 'l', 'l', 1032 'o', ' ', 'w', 'o', 1033 'r', 'l', 'd', '!', 1034 }; 1035 CheckProcessingFails(packet, 1036 arraysize(packet), 1037 "Illegal public flags value.", 1038 QUIC_INVALID_PACKET_HEADER); 1039 }; 1040 1041 TEST_P(QuicFramerTest, InvalidPublicFlagWithMatchingVersions) { 1042 // Set a specific version. 1043 framer_.set_version(QUIC_VERSION_7); 1044 1045 unsigned char packet[] = { 1046 // public flags (8 byte guid and version flag and an unknown flag) 1047 0x4D, 1048 // guid 1049 0x10, 0x32, 0x54, 0x76, 1050 0x98, 0xBA, 0xDC, 0xFE, 1051 // version tag 1052 'Q', '0', '0', '7', 1053 // packet sequence number 1054 0xBC, 0x9A, 0x78, 0x56, 1055 0x34, 0x12, 1056 // private flags 1057 0x00, 1058 1059 // frame count 1060 0x01, 1061 // frame type (stream frame) 1062 0x01, 1063 // stream id 1064 0x04, 0x03, 0x02, 0x01, 1065 // fin 1066 0x01, 1067 // offset 1068 0x54, 0x76, 0x10, 0x32, 1069 0xDC, 0xFE, 0x98, 0xBA, 1070 // data length 1071 0x0c, 0x00, 1072 // data 1073 'h', 'e', 'l', 'l', 1074 'o', ' ', 'w', 'o', 1075 'r', 'l', 'd', '!', 1076 }; 1077 CheckProcessingFails(packet, 1078 arraysize(packet), 1079 "Illegal public flags value.", 1080 QUIC_INVALID_PACKET_HEADER); 1081 }; 1082 1083 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) { 1084 unsigned char packet[] = { 1085 // public flags (8 byte guid, version flag and an unknown flag) 1086 0x7D, 1087 // guid 1088 0x10, 0x32, 0x54, 0x76, 1089 0x98, 0xBA, 0xDC, 0xFE, 1090 // version tag 1091 'Q', '0', '0', '0', 1092 // packet sequence number 1093 0xBC, 0x9A, 0x78, 0x56, 1094 0x34, 0x12, 1095 // private flags 1096 0x00, 1097 1098 // frame type (padding frame) 1099 0x07, 1100 }; 1101 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1102 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1103 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1104 ASSERT_TRUE(visitor_.header_.get()); 1105 EXPECT_EQ(0, visitor_.frame_count_); 1106 EXPECT_EQ(1, visitor_.version_mismatch_); 1107 }; 1108 1109 TEST_P(QuicFramerTest, InvalidPrivateFlag) { 1110 unsigned char packet[] = { 1111 // public flags (8 byte guid) 1112 0x3C, 1113 // guid 1114 0x10, 0x32, 0x54, 0x76, 1115 0x98, 0xBA, 0xDC, 0xFE, 1116 // packet sequence number 1117 0xBC, 0x9A, 0x78, 0x56, 1118 0x34, 0x12, 1119 // private flags 1120 0x10, 1121 1122 // frame count 1123 0x01, 1124 // frame type (stream frame) 1125 0x01, 1126 // stream id 1127 0x04, 0x03, 0x02, 0x01, 1128 // fin 1129 0x01, 1130 // offset 1131 0x54, 0x76, 0x10, 0x32, 1132 0xDC, 0xFE, 0x98, 0xBA, 1133 // data length 1134 0x0c, 0x00, 1135 // data 1136 'h', 'e', 'l', 'l', 1137 'o', ' ', 'w', 'o', 1138 'r', 'l', 'd', '!', 1139 }; 1140 CheckProcessingFails(packet, 1141 arraysize(packet), 1142 "Illegal private flags value.", 1143 QUIC_INVALID_PACKET_HEADER); 1144 }; 1145 1146 TEST_P(QuicFramerTest, InvalidFECGroupOffset) { 1147 unsigned char packet[] = { 1148 // public flags (8 byte guid) 1149 0x3C, 1150 // guid 1151 0x10, 0x32, 0x54, 0x76, 1152 0x98, 0xBA, 0xDC, 0xFE, 1153 // packet sequence number 1154 0x01, 0x00, 0x00, 0x00, 1155 0x00, 0x00, 1156 // private flags (fec group) 1157 0x02, 1158 // first fec protected packet offset 1159 0x10 1160 }; 1161 CheckProcessingFails(packet, 1162 arraysize(packet), 1163 "First fec protected packet offset must be less " 1164 "than the sequence number.", 1165 QUIC_INVALID_PACKET_HEADER); 1166 }; 1167 1168 TEST_P(QuicFramerTest, PaddingFrame) { 1169 unsigned char packet[] = { 1170 // public flags (8 byte guid) 1171 0x3C, 1172 // guid 1173 0x10, 0x32, 0x54, 0x76, 1174 0x98, 0xBA, 0xDC, 0xFE, 1175 // packet sequence number 1176 0xBC, 0x9A, 0x78, 0x56, 1177 0x34, 0x12, 1178 // private flags 1179 0x00, 1180 1181 // frame type (padding frame) 1182 0x07, 1183 // Ignored data (which in this case is a stream frame) 1184 0x01, 1185 0x04, 0x03, 0x02, 0x01, 1186 0x01, 1187 0x54, 0x76, 0x10, 0x32, 1188 0xDC, 0xFE, 0x98, 0xBA, 1189 0x0c, 0x00, 1190 'h', 'e', 'l', 'l', 1191 'o', ' ', 'w', 'o', 1192 'r', 'l', 'd', '!', 1193 }; 1194 1195 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1196 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1197 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1198 ASSERT_TRUE(visitor_.header_.get()); 1199 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 1200 1201 ASSERT_EQ(0u, visitor_.stream_frames_.size()); 1202 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1203 // A packet with no frames is not acceptable. 1204 CheckProcessingFails( 1205 packet, 1206 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 1207 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 1208 "Unable to read frame type.", QUIC_INVALID_FRAME_DATA); 1209 } 1210 1211 TEST_P(QuicFramerTest, StreamFrame) { 1212 unsigned char packet[] = { 1213 // public flags (8 byte guid) 1214 0x3C, 1215 // guid 1216 0x10, 0x32, 0x54, 0x76, 1217 0x98, 0xBA, 0xDC, 0xFE, 1218 // packet sequence number 1219 0xBC, 0x9A, 0x78, 0x56, 1220 0x34, 0x12, 1221 // private flags 1222 0x00, 1223 1224 // frame type (stream frame with fin) 1225 0xFE, 1226 // stream id 1227 0x04, 0x03, 0x02, 0x01, 1228 // offset 1229 0x54, 0x76, 0x10, 0x32, 1230 0xDC, 0xFE, 0x98, 0xBA, 1231 // data length 1232 0x0c, 0x00, 1233 // data 1234 'h', 'e', 'l', 'l', 1235 'o', ' ', 'w', 'o', 1236 'r', 'l', 'd', '!', 1237 }; 1238 1239 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1240 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1241 1242 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1243 ASSERT_TRUE(visitor_.header_.get()); 1244 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 1245 1246 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1247 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1248 EXPECT_EQ(static_cast<uint64>(0x01020304), 1249 visitor_.stream_frames_[0]->stream_id); 1250 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1251 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), 1252 visitor_.stream_frames_[0]->offset); 1253 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); 1254 1255 // Now test framing boundaries 1256 for (size_t i = 0; i < GetMinStreamFrameSize(framer_.version()); ++i) { 1257 string expected_error; 1258 if (i < kQuicFrameTypeSize) { 1259 expected_error = "Unable to read frame type."; 1260 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { 1261 expected_error = "Unable to read stream_id."; 1262 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { 1263 expected_error = "Unable to read fin."; 1264 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + 1265 kQuicMaxStreamOffsetSize) { 1266 expected_error = "Unable to read offset."; 1267 } else { 1268 expected_error = "Unable to read frame data."; 1269 } 1270 CheckProcessingFails( 1271 packet, 1272 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 1273 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 1274 expected_error, QUIC_INVALID_FRAME_DATA); 1275 } 1276 } 1277 1278 TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) { 1279 unsigned char packet[] = { 1280 // public flags (8 byte guid) 1281 0x3C, 1282 // guid 1283 0x10, 0x32, 0x54, 0x76, 1284 0x98, 0xBA, 0xDC, 0xFE, 1285 // packet sequence number 1286 0xBC, 0x9A, 0x78, 0x56, 1287 0x34, 0x12, 1288 // private flags 1289 0x00, 1290 1291 // frame type (stream frame with fin) 1292 0xFC, 1293 // stream id 1294 0x04, 0x03, 0x02, 1295 // offset 1296 0x54, 0x76, 0x10, 0x32, 1297 0xDC, 0xFE, 0x98, 0xBA, 1298 // data length 1299 0x0c, 0x00, 1300 // data 1301 'h', 'e', 'l', 'l', 1302 'o', ' ', 'w', 'o', 1303 'r', 'l', 'd', '!', 1304 }; 1305 1306 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1307 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1308 1309 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1310 ASSERT_TRUE(visitor_.header_.get()); 1311 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 1312 1313 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1314 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1315 EXPECT_EQ(static_cast<uint64>(0x00020304), 1316 visitor_.stream_frames_[0]->stream_id); 1317 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1318 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), 1319 visitor_.stream_frames_[0]->offset); 1320 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); 1321 1322 // Now test framing boundaries 1323 const size_t stream_id_size = 3; 1324 for (size_t i = 0; i < GetMinStreamFrameSize(framer_.version()); ++i) { 1325 string expected_error; 1326 if (i < kQuicFrameTypeSize) { 1327 expected_error = "Unable to read frame type."; 1328 } else if (i < kQuicFrameTypeSize + stream_id_size) { 1329 expected_error = "Unable to read stream_id."; 1330 } else if (i < kQuicFrameTypeSize + stream_id_size - 1) { 1331 expected_error = "Unable to read fin."; 1332 } else if (i < kQuicFrameTypeSize + stream_id_size + 1333 kQuicMaxStreamOffsetSize) { 1334 expected_error = "Unable to read offset."; 1335 } else { 1336 expected_error = "Unable to read frame data."; 1337 } 1338 CheckProcessingFails( 1339 packet, 1340 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 1341 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 1342 expected_error, QUIC_INVALID_FRAME_DATA); 1343 } 1344 } 1345 1346 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) { 1347 unsigned char packet[] = { 1348 // public flags (8 byte guid) 1349 0x3C, 1350 // guid 1351 0x10, 0x32, 0x54, 0x76, 1352 0x98, 0xBA, 0xDC, 0xFE, 1353 // packet sequence number 1354 0xBC, 0x9A, 0x78, 0x56, 1355 0x34, 0x12, 1356 // private flags 1357 0x00, 1358 1359 // frame type (stream frame with fin) 1360 0xFA, 1361 // stream id 1362 0x04, 0x03, 1363 // offset 1364 0x54, 0x76, 0x10, 0x32, 1365 0xDC, 0xFE, 0x98, 0xBA, 1366 // data length 1367 0x0c, 0x00, 1368 // data 1369 'h', 'e', 'l', 'l', 1370 'o', ' ', 'w', 'o', 1371 'r', 'l', 'd', '!', 1372 }; 1373 1374 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1375 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1376 1377 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1378 ASSERT_TRUE(visitor_.header_.get()); 1379 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 1380 1381 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1382 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1383 EXPECT_EQ(static_cast<uint64>(0x00000304), 1384 visitor_.stream_frames_[0]->stream_id); 1385 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1386 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), 1387 visitor_.stream_frames_[0]->offset); 1388 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); 1389 1390 // Now test framing boundaries 1391 const size_t stream_id_size = 2; 1392 for (size_t i = 0; i < GetMinStreamFrameSize(framer_.version()); ++i) { 1393 string expected_error; 1394 if (i < kQuicFrameTypeSize) { 1395 expected_error = "Unable to read frame type."; 1396 } else if (i < kQuicFrameTypeSize + stream_id_size) { 1397 expected_error = "Unable to read stream_id."; 1398 } else if (i < kQuicFrameTypeSize + stream_id_size - 1) { 1399 expected_error = "Unable to read fin."; 1400 } else if (i < kQuicFrameTypeSize + stream_id_size + 1401 kQuicMaxStreamOffsetSize) { 1402 expected_error = "Unable to read offset."; 1403 } else { 1404 expected_error = "Unable to read frame data."; 1405 } 1406 CheckProcessingFails( 1407 packet, 1408 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 1409 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 1410 expected_error, QUIC_INVALID_FRAME_DATA); 1411 } 1412 } 1413 1414 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) { 1415 unsigned char packet[] = { 1416 // public flags (8 byte guid) 1417 0x3C, 1418 // guid 1419 0x10, 0x32, 0x54, 0x76, 1420 0x98, 0xBA, 0xDC, 0xFE, 1421 // packet sequence number 1422 0xBC, 0x9A, 0x78, 0x56, 1423 0x34, 0x12, 1424 // private flags 1425 0x00, 1426 1427 // frame type (stream frame with fin) 1428 0xF8, 1429 // stream id 1430 0x04, 1431 // offset 1432 0x54, 0x76, 0x10, 0x32, 1433 0xDC, 0xFE, 0x98, 0xBA, 1434 // data length 1435 0x0c, 0x00, 1436 // data 1437 'h', 'e', 'l', 'l', 1438 'o', ' ', 'w', 'o', 1439 'r', 'l', 'd', '!', 1440 }; 1441 1442 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1443 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1444 1445 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1446 ASSERT_TRUE(visitor_.header_.get()); 1447 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 1448 1449 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1450 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1451 EXPECT_EQ(static_cast<uint64>(0x00000004), 1452 visitor_.stream_frames_[0]->stream_id); 1453 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1454 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), 1455 visitor_.stream_frames_[0]->offset); 1456 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); 1457 1458 // Now test framing boundaries 1459 const size_t stream_id_size = 1; 1460 for (size_t i = 0; i < GetMinStreamFrameSize(framer_.version()); ++i) { 1461 string expected_error; 1462 if (i < kQuicFrameTypeSize) { 1463 expected_error = "Unable to read frame type."; 1464 } else if (i < kQuicFrameTypeSize + stream_id_size) { 1465 expected_error = "Unable to read stream_id."; 1466 } else if (i < kQuicFrameTypeSize + stream_id_size - 1) { 1467 expected_error = "Unable to read fin."; 1468 } else if (i < kQuicFrameTypeSize + stream_id_size + 1469 kQuicMaxStreamOffsetSize) { 1470 expected_error = "Unable to read offset."; 1471 } else { 1472 expected_error = "Unable to read frame data."; 1473 } 1474 CheckProcessingFails( 1475 packet, 1476 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 1477 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 1478 expected_error, QUIC_INVALID_FRAME_DATA); 1479 } 1480 } 1481 1482 TEST_P(QuicFramerTest, StreamFrameWithVersion) { 1483 // Set a specific version. 1484 framer_.set_version(QUIC_VERSION_7); 1485 1486 unsigned char packet[] = { 1487 // public flags (version, 8 byte guid) 1488 0x3D, 1489 // guid 1490 0x10, 0x32, 0x54, 0x76, 1491 0x98, 0xBA, 0xDC, 0xFE, 1492 // version tag 1493 'Q', '0', '0', '7', 1494 // packet sequence number 1495 0xBC, 0x9A, 0x78, 0x56, 1496 0x34, 0x12, 1497 // private flags 1498 0x00, 1499 1500 // frame type (stream frame with fin) 1501 0xFE, 1502 // stream id 1503 0x04, 0x03, 0x02, 0x01, 1504 // offset 1505 0x54, 0x76, 0x10, 0x32, 1506 0xDC, 0xFE, 0x98, 0xBA, 1507 // data length 1508 0x0c, 0x00, 1509 // data 1510 'h', 'e', 'l', 'l', 1511 'o', ' ', 'w', 'o', 1512 'r', 'l', 'd', '!', 1513 }; 1514 1515 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1516 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1517 1518 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1519 ASSERT_TRUE(visitor_.header_.get()); 1520 EXPECT_TRUE(visitor_.header_.get()->public_header.version_flag); 1521 EXPECT_EQ(QUIC_VERSION_7, visitor_.header_.get()->public_header.versions[0]); 1522 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion)); 1523 1524 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1525 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1526 EXPECT_EQ(static_cast<uint64>(0x01020304), 1527 visitor_.stream_frames_[0]->stream_id); 1528 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1529 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), 1530 visitor_.stream_frames_[0]->offset); 1531 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); 1532 1533 // Now test framing boundaries 1534 for (size_t i = 0; i < GetMinStreamFrameSize(framer_.version()); ++i) { 1535 string expected_error; 1536 if (i < kQuicFrameTypeSize) { 1537 expected_error = "Unable to read frame type."; 1538 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { 1539 expected_error = "Unable to read stream_id."; 1540 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + 1541 kQuicMaxStreamOffsetSize) { 1542 expected_error = "Unable to read offset."; 1543 } else { 1544 expected_error = "Unable to read frame data."; 1545 } 1546 CheckProcessingFails( 1547 packet, 1548 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, kIncludeVersion, 1549 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 1550 expected_error, QUIC_INVALID_FRAME_DATA); 1551 } 1552 } 1553 1554 TEST_P(QuicFramerTest, RejectPacket) { 1555 visitor_.accept_packet_ = false; 1556 1557 unsigned char packet[] = { 1558 // public flags (8 byte guid) 1559 0x3C, 1560 // guid 1561 0x10, 0x32, 0x54, 0x76, 1562 0x98, 0xBA, 0xDC, 0xFE, 1563 // packet sequence number 1564 0xBC, 0x9A, 0x78, 0x56, 1565 0x34, 0x12, 1566 // private flags 1567 0x00, 1568 1569 // frame type (stream frame with fin) 1570 0xFE, 1571 // stream id 1572 0x04, 0x03, 0x02, 0x01, 1573 // offset 1574 0x54, 0x76, 0x10, 0x32, 1575 0xDC, 0xFE, 0x98, 0xBA, 1576 // data length 1577 0x0c, 0x00, 1578 // data 1579 'h', 'e', 'l', 'l', 1580 'o', ' ', 'w', 'o', 1581 'r', 'l', 'd', '!', 1582 }; 1583 1584 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1585 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1586 1587 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1588 ASSERT_TRUE(visitor_.header_.get()); 1589 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 1590 1591 ASSERT_EQ(0u, visitor_.stream_frames_.size()); 1592 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1593 } 1594 1595 TEST_P(QuicFramerTest, RevivedStreamFrame) { 1596 unsigned char payload[] = { 1597 // frame type (stream frame with fin) 1598 0xFE, 1599 // stream id 1600 0x04, 0x03, 0x02, 0x01, 1601 // offset 1602 0x54, 0x76, 0x10, 0x32, 1603 0xDC, 0xFE, 0x98, 0xBA, 1604 // data length 1605 0x0c, 0x00, 1606 // data 1607 'h', 'e', 'l', 'l', 1608 'o', ' ', 'w', 'o', 1609 'r', 'l', 'd', '!', 1610 }; 1611 1612 QuicPacketHeader header; 1613 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 1614 header.public_header.reset_flag = false; 1615 header.public_header.version_flag = false; 1616 header.fec_flag = true; 1617 header.entropy_flag = true; 1618 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 1619 header.fec_group = 0; 1620 1621 // Do not encrypt the payload because the revived payload is post-encryption. 1622 EXPECT_TRUE(framer_.ProcessRevivedPacket(&header, 1623 StringPiece(AsChars(payload), 1624 arraysize(payload)))); 1625 1626 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1627 ASSERT_EQ(1, visitor_.revived_packets_); 1628 ASSERT_TRUE(visitor_.header_.get()); 1629 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), 1630 visitor_.header_->public_header.guid); 1631 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 1632 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 1633 EXPECT_TRUE(visitor_.header_->fec_flag); 1634 EXPECT_TRUE(visitor_.header_->entropy_flag); 1635 EXPECT_EQ(1 << (header.packet_sequence_number % 8), 1636 visitor_.header_->entropy_hash); 1637 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), 1638 visitor_.header_->packet_sequence_number); 1639 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 1640 EXPECT_EQ(0x00u, visitor_.header_->fec_group); 1641 1642 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1643 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1644 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); 1645 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1646 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), 1647 visitor_.stream_frames_[0]->offset); 1648 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); 1649 } 1650 1651 TEST_P(QuicFramerTest, StreamFrameInFecGroup) { 1652 // Set a specific version. 1653 framer_.set_version(QUIC_VERSION_7); 1654 1655 unsigned char packet[] = { 1656 // public flags (8 byte guid) 1657 0x3C, 1658 // guid 1659 0x10, 0x32, 0x54, 0x76, 1660 0x98, 0xBA, 0xDC, 0xFE, 1661 // packet sequence number 1662 0xBC, 0x9A, 0x78, 0x56, 1663 0x12, 0x34, 1664 // private flags (fec group) 1665 0x02, 1666 // first fec protected packet offset 1667 0x02, 1668 1669 // frame type (stream frame with fin) 1670 0xFE, 1671 // stream id 1672 0x04, 0x03, 0x02, 0x01, 1673 // offset 1674 0x54, 0x76, 0x10, 0x32, 1675 0xDC, 0xFE, 0x98, 0xBA, 1676 // data length 1677 0x0c, 0x00, 1678 // data 1679 'h', 'e', 'l', 'l', 1680 'o', ' ', 'w', 'o', 1681 'r', 'l', 'd', '!', 1682 }; 1683 1684 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1685 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1686 1687 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1688 ASSERT_TRUE(visitor_.header_.get()); 1689 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 1690 EXPECT_EQ(IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 1691 EXPECT_EQ(GG_UINT64_C(0x341256789ABA), 1692 visitor_.header_->fec_group); 1693 const size_t fec_offset = GetStartOfFecProtectedData( 1694 PACKET_8BYTE_GUID, !kIncludeVersion, PACKET_6BYTE_SEQUENCE_NUMBER); 1695 EXPECT_EQ( 1696 string(AsChars(packet) + fec_offset, arraysize(packet) - fec_offset), 1697 visitor_.fec_protected_payload_); 1698 1699 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1700 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1701 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); 1702 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1703 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), 1704 visitor_.stream_frames_[0]->offset); 1705 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); 1706 } 1707 1708 TEST_P(QuicFramerTest, AckFrame) { 1709 unsigned char packet[] = { 1710 // public flags (8 byte guid) 1711 0x3C, 1712 // guid 1713 0x10, 0x32, 0x54, 0x76, 1714 0x98, 0xBA, 0xDC, 0xFE, 1715 // packet sequence number 1716 0xBC, 0x9A, 0x78, 0x56, 1717 0x34, 0x12, 1718 // private flags 1719 0x00, 1720 1721 // frame type (ack frame) 1722 static_cast<unsigned char>(0x01), 1723 // entropy hash of sent packets till least awaiting - 1. 1724 0xAB, 1725 // least packet sequence number awaiting an ack 1726 0xA0, 0x9A, 0x78, 0x56, 1727 0x34, 0x12, 1728 // entropy hash of all received packets. 1729 0xBA, 1730 // largest observed packet sequence number 1731 0xBF, 0x9A, 0x78, 0x56, 1732 0x34, 0x12, 1733 // Infinite delta time. 1734 0xFF, 0xFF, 0xFF, 0xFF, 1735 // num missing packets 1736 0x01, 1737 // missing packet 1738 0xBE, 0x9A, 0x78, 0x56, 1739 0x34, 0x12, 1740 }; 1741 1742 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1743 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1744 1745 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1746 ASSERT_TRUE(visitor_.header_.get()); 1747 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 1748 1749 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 1750 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 1751 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; 1752 EXPECT_EQ(0xAB, frame.sent_info.entropy_hash); 1753 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); 1754 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); 1755 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); 1756 SequenceNumberSet::const_iterator missing_iter = 1757 frame.received_info.missing_packets.begin(); 1758 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); 1759 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); 1760 1761 const size_t kSentEntropyOffset = kQuicFrameTypeSize; 1762 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; 1763 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + 1764 PACKET_6BYTE_SEQUENCE_NUMBER; 1765 const size_t kLargestObservedOffset = kReceivedEntropyOffset + 1766 kQuicEntropyHashSize; 1767 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + 1768 PACKET_6BYTE_SEQUENCE_NUMBER; 1769 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + 1770 kQuicDeltaTimeLargestObservedSize; 1771 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + 1772 kNumberOfMissingPacketsSize; 1773 // Now test framing boundaries 1774 const size_t missing_packets_size = 1 * PACKET_6BYTE_SEQUENCE_NUMBER; 1775 for (size_t i = 0; 1776 i < QuicFramer::GetMinAckFrameSize() + missing_packets_size; ++i) { 1777 string expected_error; 1778 if (i < kSentEntropyOffset) { 1779 expected_error = "Unable to read frame type."; 1780 } else if (i < kLeastUnackedOffset) { 1781 expected_error = "Unable to read entropy hash for sent packets."; 1782 } else if (i < kReceivedEntropyOffset) { 1783 expected_error = "Unable to read least unacked."; 1784 } else if (i < kLargestObservedOffset) { 1785 expected_error = "Unable to read entropy hash for received packets."; 1786 } else if (i < kMissingDeltaTimeOffset) { 1787 expected_error = "Unable to read largest observed."; 1788 } else if (i < kNumMissingPacketOffset) { 1789 expected_error = "Unable to read delta time largest observed."; 1790 } else if (i < kMissingPacketsOffset) { 1791 expected_error = "Unable to read num missing packets."; 1792 } else { 1793 expected_error = "Unable to read sequence number in missing packets."; 1794 } 1795 CheckProcessingFails( 1796 packet, 1797 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 1798 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 1799 expected_error, QUIC_INVALID_FRAME_DATA); 1800 } 1801 } 1802 1803 TEST_P(QuicFramerTest, CongestionFeedbackFrameTCP) { 1804 unsigned char packet[] = { 1805 // public flags (8 byte guid) 1806 0x3C, 1807 // guid 1808 0x10, 0x32, 0x54, 0x76, 1809 0x98, 0xBA, 0xDC, 0xFE, 1810 // packet sequence number 1811 0xBC, 0x9A, 0x78, 0x56, 1812 0x34, 0x12, 1813 // private flags 1814 0x00, 1815 1816 // frame type (congestion feedback frame) 1817 0x03, 1818 // congestion feedback type (tcp) 1819 0x00, 1820 // ack_frame.feedback.tcp.accumulated_number_of_lost_packets 1821 0x01, 0x02, 1822 // ack_frame.feedback.tcp.receive_window 1823 0x03, 0x04, 1824 }; 1825 1826 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1827 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1828 1829 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1830 ASSERT_TRUE(visitor_.header_.get()); 1831 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 1832 1833 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 1834 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size()); 1835 const QuicCongestionFeedbackFrame& frame = 1836 *visitor_.congestion_feedback_frames_[0]; 1837 ASSERT_EQ(kTCP, frame.type); 1838 EXPECT_EQ(0x0201, 1839 frame.tcp.accumulated_number_of_lost_packets); 1840 EXPECT_EQ(0x4030u, frame.tcp.receive_window); 1841 1842 // Now test framing boundaries 1843 for (size_t i = 0; i < 6; ++i) { 1844 string expected_error; 1845 if (i < 1) { 1846 expected_error = "Unable to read frame type."; 1847 } else if (i < 2) { 1848 expected_error = "Unable to read congestion feedback type."; 1849 } else if (i < 4) { 1850 expected_error = "Unable to read accumulated number of lost packets."; 1851 } else if (i < 6) { 1852 expected_error = "Unable to read receive window."; 1853 } 1854 CheckProcessingFails( 1855 packet, 1856 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 1857 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 1858 expected_error, QUIC_INVALID_FRAME_DATA); 1859 } 1860 } 1861 1862 TEST_P(QuicFramerTest, CongestionFeedbackFrameInterArrival) { 1863 unsigned char packet[] = { 1864 // public flags (8 byte guid) 1865 0x3C, 1866 // guid 1867 0x10, 0x32, 0x54, 0x76, 1868 0x98, 0xBA, 0xDC, 0xFE, 1869 // packet sequence number 1870 0xBC, 0x9A, 0x78, 0x56, 1871 0x34, 0x12, 1872 // private flags 1873 0x00, 1874 1875 // frame type (congestion feedback frame) 1876 0x03, 1877 // congestion feedback type (inter arrival) 1878 0x01, 1879 // accumulated_number_of_lost_packets 1880 0x02, 0x03, 1881 // num received packets 1882 0x03, 1883 // lowest sequence number 1884 0xBA, 0x9A, 0x78, 0x56, 1885 0x34, 0x12, 1886 // receive time 1887 0x87, 0x96, 0xA5, 0xB4, 1888 0xC3, 0xD2, 0xE1, 0x07, 1889 // sequence delta 1890 0x01, 0x00, 1891 // time delta 1892 0x01, 0x00, 0x00, 0x00, 1893 // sequence delta (skip one packet) 1894 0x03, 0x00, 1895 // time delta 1896 0x02, 0x00, 0x00, 0x00, 1897 }; 1898 1899 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1900 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1901 1902 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1903 ASSERT_TRUE(visitor_.header_.get()); 1904 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 1905 1906 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 1907 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size()); 1908 const QuicCongestionFeedbackFrame& frame = 1909 *visitor_.congestion_feedback_frames_[0]; 1910 ASSERT_EQ(kInterArrival, frame.type); 1911 EXPECT_EQ(0x0302, frame.inter_arrival. 1912 accumulated_number_of_lost_packets); 1913 ASSERT_EQ(3u, frame.inter_arrival.received_packet_times.size()); 1914 TimeMap::const_iterator iter = 1915 frame.inter_arrival.received_packet_times.begin(); 1916 EXPECT_EQ(GG_UINT64_C(0x0123456789ABA), iter->first); 1917 EXPECT_EQ(GG_INT64_C(0x07E1D2C3B4A59687), 1918 iter->second.Subtract(start_).ToMicroseconds()); 1919 ++iter; 1920 EXPECT_EQ(GG_UINT64_C(0x0123456789ABB), iter->first); 1921 EXPECT_EQ(GG_INT64_C(0x07E1D2C3B4A59688), 1922 iter->second.Subtract(start_).ToMicroseconds()); 1923 ++iter; 1924 EXPECT_EQ(GG_UINT64_C(0x0123456789ABD), iter->first); 1925 EXPECT_EQ(GG_INT64_C(0x07E1D2C3B4A59689), 1926 iter->second.Subtract(start_).ToMicroseconds()); 1927 1928 // Now test framing boundaries 1929 for (size_t i = 0; i < 31; ++i) { 1930 string expected_error; 1931 if (i < 1) { 1932 expected_error = "Unable to read frame type."; 1933 } else if (i < 2) { 1934 expected_error = "Unable to read congestion feedback type."; 1935 } else if (i < 4) { 1936 expected_error = "Unable to read accumulated number of lost packets."; 1937 } else if (i < 5) { 1938 expected_error = "Unable to read num received packets."; 1939 } else if (i < 11) { 1940 expected_error = "Unable to read smallest received."; 1941 } else if (i < 19) { 1942 expected_error = "Unable to read time received."; 1943 } else if (i < 21) { 1944 expected_error = "Unable to read sequence delta in received packets."; 1945 } else if (i < 25) { 1946 expected_error = "Unable to read time delta in received packets."; 1947 } else if (i < 27) { 1948 expected_error = "Unable to read sequence delta in received packets."; 1949 } else if (i < 31) { 1950 expected_error = "Unable to read time delta in received packets."; 1951 } 1952 CheckProcessingFails( 1953 packet, 1954 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 1955 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 1956 expected_error, QUIC_INVALID_FRAME_DATA); 1957 } 1958 } 1959 1960 TEST_P(QuicFramerTest, CongestionFeedbackFrameFixRate) { 1961 unsigned char packet[] = { 1962 // public flags (8 byte guid) 1963 0x3C, 1964 // guid 1965 0x10, 0x32, 0x54, 0x76, 1966 0x98, 0xBA, 0xDC, 0xFE, 1967 // packet sequence number 1968 0xBC, 0x9A, 0x78, 0x56, 1969 0x34, 0x12, 1970 // private flags 1971 0x00, 1972 1973 // frame type (congestion feedback frame) 1974 0x03, 1975 // congestion feedback type (fix rate) 1976 0x02, 1977 // bitrate_in_bytes_per_second; 1978 0x01, 0x02, 0x03, 0x04, 1979 }; 1980 1981 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1982 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1983 1984 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1985 ASSERT_TRUE(visitor_.header_.get()); 1986 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 1987 1988 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 1989 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size()); 1990 const QuicCongestionFeedbackFrame& frame = 1991 *visitor_.congestion_feedback_frames_[0]; 1992 ASSERT_EQ(kFixRate, frame.type); 1993 EXPECT_EQ(static_cast<uint32>(0x04030201), 1994 frame.fix_rate.bitrate.ToBytesPerSecond()); 1995 1996 // Now test framing boundaries 1997 for (size_t i = 0; i < 6; ++i) { 1998 string expected_error; 1999 if (i < 1) { 2000 expected_error = "Unable to read frame type."; 2001 } else if (i < 2) { 2002 expected_error = "Unable to read congestion feedback type."; 2003 } else if (i < 6) { 2004 expected_error = "Unable to read bitrate."; 2005 } 2006 CheckProcessingFails( 2007 packet, 2008 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 2009 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 2010 expected_error, QUIC_INVALID_FRAME_DATA); 2011 } 2012 } 2013 2014 2015 TEST_P(QuicFramerTest, CongestionFeedbackFrameInvalidFeedback) { 2016 unsigned char packet[] = { 2017 // public flags (8 byte guid) 2018 0x3C, 2019 // guid 2020 0x10, 0x32, 0x54, 0x76, 2021 0x98, 0xBA, 0xDC, 0xFE, 2022 // packet sequence number 2023 0xBC, 0x9A, 0x78, 0x56, 2024 0x34, 0x12, 2025 // private flags 2026 0x00, 2027 2028 // frame type (congestion feedback frame) 2029 0x03, 2030 // congestion feedback type (invalid) 2031 0x03, 2032 }; 2033 2034 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2035 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 2036 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 2037 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); 2038 } 2039 2040 TEST_P(QuicFramerTest, RstStreamFrame) { 2041 unsigned char packet[] = { 2042 // public flags (8 byte guid) 2043 0x3C, 2044 // guid 2045 0x10, 0x32, 0x54, 0x76, 2046 0x98, 0xBA, 0xDC, 0xFE, 2047 // packet sequence number 2048 0xBC, 0x9A, 0x78, 0x56, 2049 0x34, 0x12, 2050 // private flags 2051 0x00, 2052 2053 // frame type (rst stream frame) 2054 static_cast<unsigned char>(0x27), 2055 // stream id 2056 0x04, 0x03, 0x02, 0x01, 2057 // error code 2058 0x01, 0x00, 0x00, 0x00, 2059 2060 // error details length 2061 0x0d, 0x00, 2062 // error details 2063 'b', 'e', 'c', 'a', 2064 'u', 's', 'e', ' ', 2065 'I', ' ', 'c', 'a', 2066 'n', 2067 }; 2068 2069 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2070 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2071 2072 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2073 ASSERT_TRUE(visitor_.header_.get()); 2074 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 2075 2076 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.rst_stream_frame_.stream_id); 2077 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code); 2078 EXPECT_EQ("because I can", visitor_.rst_stream_frame_.error_details); 2079 2080 // Now test framing boundaries 2081 for (size_t i = 2; i < 24; ++i) { 2082 string expected_error; 2083 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { 2084 expected_error = "Unable to read stream_id."; 2085 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + 2086 kQuicErrorCodeSize) { 2087 expected_error = "Unable to read rst stream error code."; 2088 } else { 2089 expected_error = "Unable to read rst stream error details."; 2090 } 2091 CheckProcessingFails( 2092 packet, 2093 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 2094 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 2095 expected_error, QUIC_INVALID_RST_STREAM_DATA); 2096 } 2097 } 2098 2099 TEST_P(QuicFramerTest, ConnectionCloseFrame) { 2100 unsigned char packet[] = { 2101 // public flags (8 byte guid) 2102 0x3C, 2103 // guid 2104 0x10, 0x32, 0x54, 0x76, 2105 0x98, 0xBA, 0xDC, 0xFE, 2106 // packet sequence number 2107 0xBC, 0x9A, 0x78, 0x56, 2108 0x34, 0x12, 2109 // private flags 2110 0x00, 2111 2112 // frame type (connection close frame) 2113 static_cast<unsigned char>(0x2F), 2114 // error code 2115 0x11, 0x00, 0x00, 0x00, 2116 2117 // error details length 2118 0x0d, 0x00, 2119 // error details 2120 'b', 'e', 'c', 'a', 2121 'u', 's', 'e', ' ', 2122 'I', ' ', 'c', 'a', 2123 'n', 2124 2125 // Ack frame. 2126 // entropy hash of sent packets till least awaiting - 1. 2127 0xBF, 2128 // least packet sequence number awaiting an ack 2129 0xA0, 0x9A, 0x78, 0x56, 2130 0x34, 0x12, 2131 // entropy hash of all received packets. 2132 0xEB, 2133 // largest observed packet sequence number 2134 0xBF, 0x9A, 0x78, 0x56, 2135 0x34, 0x12, 2136 // Infinite delta time. 2137 0xFF, 0xFF, 0xFF, 0xFF, 2138 // num missing packets 2139 0x01, 2140 // missing packet 2141 0xBE, 0x9A, 0x78, 0x56, 2142 0x34, 0x12, 2143 }; 2144 2145 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2146 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2147 2148 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2149 ASSERT_TRUE(visitor_.header_.get()); 2150 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 2151 2152 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2153 2154 EXPECT_EQ(0x11, visitor_.connection_close_frame_.error_code); 2155 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details); 2156 2157 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 2158 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; 2159 EXPECT_EQ(0xBF, frame.sent_info.entropy_hash); 2160 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); 2161 EXPECT_EQ(0xEB, frame.received_info.entropy_hash); 2162 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); 2163 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); 2164 SequenceNumberSet::const_iterator missing_iter = 2165 frame.received_info.missing_packets.begin(); 2166 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); 2167 2168 // Now test framing boundaries 2169 for (size_t i = kQuicFrameTypeSize; 2170 i < QuicFramer::GetMinConnectionCloseFrameSize() - 2171 QuicFramer::GetMinAckFrameSize(); ++i) { 2172 string expected_error; 2173 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { 2174 expected_error = "Unable to read connection close error code."; 2175 } else { 2176 expected_error = "Unable to read connection close error details."; 2177 } 2178 CheckProcessingFails( 2179 packet, 2180 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 2181 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 2182 expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA); 2183 } 2184 } 2185 2186 TEST_P(QuicFramerTest, GoAwayFrame) { 2187 unsigned char packet[] = { 2188 // public flags (8 byte guid) 2189 0x3C, 2190 // guid 2191 0x10, 0x32, 0x54, 0x76, 2192 0x98, 0xBA, 0xDC, 0xFE, 2193 // packet sequence number 2194 0xBC, 0x9A, 0x78, 0x56, 2195 0x34, 0x12, 2196 // private flags 2197 0x00, 2198 2199 // frame type (go away frame) 2200 static_cast<unsigned char>(0x37), 2201 // error code 2202 0x09, 0x00, 0x00, 0x00, 2203 // stream id 2204 0x04, 0x03, 0x02, 0x01, 2205 // error details length 2206 0x0d, 0x00, 2207 // error details 2208 'b', 'e', 'c', 'a', 2209 'u', 's', 'e', ' ', 2210 'I', ' ', 'c', 'a', 2211 'n', 2212 }; 2213 2214 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2215 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2216 2217 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2218 ASSERT_TRUE(visitor_.header_.get()); 2219 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 2220 2221 EXPECT_EQ(GG_UINT64_C(0x01020304), 2222 visitor_.goaway_frame_.last_good_stream_id); 2223 EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code); 2224 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase); 2225 2226 const size_t reason_size = arraysize("because I can") - 1; 2227 // Now test framing boundaries 2228 for (size_t i = kQuicFrameTypeSize; 2229 i < QuicFramer::GetMinGoAwayFrameSize() + reason_size; ++i) { 2230 string expected_error; 2231 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { 2232 expected_error = "Unable to read go away error code."; 2233 } else if (i < kQuicFrameTypeSize + kQuicErrorCodeSize + 2234 kQuicMaxStreamIdSize) { 2235 expected_error = "Unable to read last good stream id."; 2236 } else { 2237 expected_error = "Unable to read goaway reason."; 2238 } 2239 CheckProcessingFails( 2240 packet, 2241 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 2242 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 2243 expected_error, QUIC_INVALID_GOAWAY_DATA); 2244 } 2245 } 2246 2247 TEST_P(QuicFramerTest, PublicResetPacket) { 2248 unsigned char packet[] = { 2249 // public flags (public reset, 8 byte guid) 2250 0x3E, 2251 // guid 2252 0x10, 0x32, 0x54, 0x76, 2253 0x98, 0xBA, 0xDC, 0xFE, 2254 // nonce proof 2255 0x89, 0x67, 0x45, 0x23, 2256 0x01, 0xEF, 0xCD, 0xAB, 2257 // rejected sequence number 2258 0xBC, 0x9A, 0x78, 0x56, 2259 0x34, 0x12, 2260 }; 2261 2262 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2263 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2264 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); 2265 ASSERT_TRUE(visitor_.public_reset_packet_.get()); 2266 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), 2267 visitor_.public_reset_packet_->public_header.guid); 2268 EXPECT_TRUE(visitor_.public_reset_packet_->public_header.reset_flag); 2269 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); 2270 EXPECT_EQ(GG_UINT64_C(0xABCDEF0123456789), 2271 visitor_.public_reset_packet_->nonce_proof); 2272 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), 2273 visitor_.public_reset_packet_->rejected_sequence_number); 2274 2275 // Now test framing boundaries 2276 for (size_t i = 0; i < GetPublicResetPacketSize(); ++i) { 2277 string expected_error; 2278 DLOG(INFO) << "iteration: " << i; 2279 if (i < kGuidOffset) { 2280 expected_error = "Unable to read public flags."; 2281 CheckProcessingFails(packet, i, expected_error, 2282 QUIC_INVALID_PACKET_HEADER); 2283 } else if (i < kPublicResetPacketNonceProofOffset) { 2284 expected_error = "Unable to read GUID."; 2285 CheckProcessingFails(packet, i, expected_error, 2286 QUIC_INVALID_PACKET_HEADER); 2287 } else if (i < kPublicResetPacketRejectedSequenceNumberOffset) { 2288 expected_error = "Unable to read nonce proof."; 2289 CheckProcessingFails(packet, i, expected_error, 2290 QUIC_INVALID_PUBLIC_RST_PACKET); 2291 } else { 2292 expected_error = "Unable to read rejected sequence number."; 2293 CheckProcessingFails(packet, i, expected_error, 2294 QUIC_INVALID_PUBLIC_RST_PACKET); 2295 } 2296 } 2297 } 2298 2299 TEST_P(QuicFramerTest, VersionNegotiationPacket) { 2300 // Set a specific version. 2301 framer_.set_version(QUIC_VERSION_7); 2302 2303 unsigned char packet[] = { 2304 // public flags (version, 8 byte guid) 2305 0x3D, 2306 // guid 2307 0x10, 0x32, 0x54, 0x76, 2308 0x98, 0xBA, 0xDC, 0xFE, 2309 // version tag 2310 'Q', '0', '0', '7', 2311 'Q', '2', '.', '0', 2312 }; 2313 2314 QuicFramerPeer::SetIsServer(&framer_, false); 2315 2316 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2317 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2318 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); 2319 ASSERT_TRUE(visitor_.version_negotiation_packet_.get()); 2320 EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size()); 2321 EXPECT_EQ(QUIC_VERSION_7, 2322 visitor_.version_negotiation_packet_->versions[0]); 2323 2324 for (size_t i = 0; i <= kPublicFlagsSize + PACKET_8BYTE_GUID; ++i) { 2325 string expected_error; 2326 QuicErrorCode error_code = QUIC_INVALID_PACKET_HEADER; 2327 if (i < kGuidOffset) { 2328 expected_error = "Unable to read public flags."; 2329 } else if (i < kVersionOffset) { 2330 expected_error = "Unable to read GUID."; 2331 } else { 2332 expected_error = "Unable to read supported version in negotiation."; 2333 error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET; 2334 } 2335 CheckProcessingFails(packet, i, expected_error, error_code); 2336 } 2337 } 2338 2339 TEST_P(QuicFramerTest, FecPacket) { 2340 unsigned char packet[] = { 2341 // public flags (8 byte guid) 2342 0x3C, 2343 // guid 2344 0x10, 0x32, 0x54, 0x76, 2345 0x98, 0xBA, 0xDC, 0xFE, 2346 // packet sequence number 2347 0xBC, 0x9A, 0x78, 0x56, 2348 0x34, 0x12, 2349 // private flags (fec group & FEC) 2350 0x06, 2351 // first fec protected packet offset 2352 0x01, 2353 2354 // redundancy 2355 'a', 'b', 'c', 'd', 2356 'e', 'f', 'g', 'h', 2357 'i', 'j', 'k', 'l', 2358 'm', 'n', 'o', 'p', 2359 }; 2360 2361 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2362 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2363 2364 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2365 ASSERT_TRUE(visitor_.header_.get()); 2366 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 2367 2368 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2369 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 2370 ASSERT_EQ(1, visitor_.fec_count_); 2371 const QuicFecData& fec_data = *visitor_.fec_data_[0]; 2372 EXPECT_EQ(GG_UINT64_C(0x0123456789ABB), fec_data.fec_group); 2373 EXPECT_EQ("abcdefghijklmnop", fec_data.redundancy); 2374 } 2375 2376 TEST_P(QuicFramerTest, BuildPaddingFramePacket) { 2377 QuicPacketHeader header; 2378 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2379 header.public_header.reset_flag = false; 2380 header.public_header.version_flag = false; 2381 header.fec_flag = false; 2382 header.entropy_flag = false; 2383 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 2384 header.fec_group = 0; 2385 2386 QuicPaddingFrame padding_frame; 2387 2388 QuicFrames frames; 2389 frames.push_back(QuicFrame(&padding_frame)); 2390 2391 unsigned char packet[kMaxPacketSize] = { 2392 // public flags (8 byte guid) 2393 0x3C, 2394 // guid 2395 0x10, 0x32, 0x54, 0x76, 2396 0x98, 0xBA, 0xDC, 0xFE, 2397 // packet sequence number 2398 0xBC, 0x9A, 0x78, 0x56, 2399 0x34, 0x12, 2400 // private flags 2401 0x00, 2402 2403 // frame type (padding frame) 2404 static_cast<unsigned char>(0x07), 2405 }; 2406 2407 uint64 header_size = 2408 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 2409 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 2410 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 2411 2412 scoped_ptr<QuicPacket> data( 2413 framer_.BuildUnsizedDataPacket(header, frames).packet); 2414 ASSERT_TRUE(data != NULL); 2415 2416 test::CompareCharArraysWithHexError("constructed packet", 2417 data->data(), data->length(), 2418 AsChars(packet), arraysize(packet)); 2419 } 2420 2421 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) { 2422 QuicPacketHeader header; 2423 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2424 header.public_header.reset_flag = false; 2425 header.public_header.version_flag = false; 2426 header.fec_flag = false; 2427 header.entropy_flag = false; 2428 header.public_header.sequence_number_length = PACKET_4BYTE_SEQUENCE_NUMBER; 2429 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 2430 header.fec_group = 0; 2431 2432 QuicPaddingFrame padding_frame; 2433 2434 QuicFrames frames; 2435 frames.push_back(QuicFrame(&padding_frame)); 2436 2437 unsigned char packet[kMaxPacketSize] = { 2438 // public flags (8 byte guid and 4 byte sequence number) 2439 0x2C, 2440 // guid 2441 0x10, 0x32, 0x54, 0x76, 2442 0x98, 0xBA, 0xDC, 0xFE, 2443 // packet sequence number 2444 0xBC, 0x9A, 0x78, 0x56, 2445 // private flags 2446 0x00, 2447 2448 // frame type (padding frame) 2449 static_cast<unsigned char>(0x07), 2450 }; 2451 2452 uint64 header_size = 2453 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 2454 PACKET_4BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 2455 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 2456 2457 scoped_ptr<QuicPacket> data( 2458 framer_.BuildUnsizedDataPacket(header, frames).packet); 2459 ASSERT_TRUE(data != NULL); 2460 2461 test::CompareCharArraysWithHexError("constructed packet", 2462 data->data(), data->length(), 2463 AsChars(packet), arraysize(packet)); 2464 } 2465 2466 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) { 2467 QuicPacketHeader header; 2468 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2469 header.public_header.reset_flag = false; 2470 header.public_header.version_flag = false; 2471 header.fec_flag = false; 2472 header.entropy_flag = false; 2473 header.public_header.sequence_number_length = PACKET_2BYTE_SEQUENCE_NUMBER; 2474 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 2475 header.fec_group = 0; 2476 2477 QuicPaddingFrame padding_frame; 2478 2479 QuicFrames frames; 2480 frames.push_back(QuicFrame(&padding_frame)); 2481 2482 unsigned char packet[kMaxPacketSize] = { 2483 // public flags (8 byte guid and 2 byte sequence number) 2484 0x1C, 2485 // guid 2486 0x10, 0x32, 0x54, 0x76, 2487 0x98, 0xBA, 0xDC, 0xFE, 2488 // packet sequence number 2489 0xBC, 0x9A, 2490 // private flags 2491 0x00, 2492 2493 // frame type (padding frame) 2494 static_cast<unsigned char>(0x07), 2495 }; 2496 2497 uint64 header_size = 2498 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 2499 PACKET_2BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 2500 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 2501 2502 scoped_ptr<QuicPacket> data( 2503 framer_.BuildUnsizedDataPacket(header, frames).packet); 2504 ASSERT_TRUE(data != NULL); 2505 2506 test::CompareCharArraysWithHexError("constructed packet", 2507 data->data(), data->length(), 2508 AsChars(packet), arraysize(packet)); 2509 } 2510 2511 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) { 2512 QuicPacketHeader header; 2513 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2514 header.public_header.reset_flag = false; 2515 header.public_header.version_flag = false; 2516 header.fec_flag = false; 2517 header.entropy_flag = false; 2518 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; 2519 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 2520 header.fec_group = 0; 2521 2522 QuicPaddingFrame padding_frame; 2523 2524 QuicFrames frames; 2525 frames.push_back(QuicFrame(&padding_frame)); 2526 2527 unsigned char packet[kMaxPacketSize] = { 2528 // public flags (8 byte guid and 1 byte sequence number) 2529 0x0C, 2530 // guid 2531 0x10, 0x32, 0x54, 0x76, 2532 0x98, 0xBA, 0xDC, 0xFE, 2533 // packet sequence number 2534 0xBC, 2535 // private flags 2536 0x00, 2537 2538 // frame type (padding frame) 2539 static_cast<unsigned char>(0x07), 2540 }; 2541 2542 uint64 header_size = 2543 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 2544 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); 2545 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 2546 2547 scoped_ptr<QuicPacket> data( 2548 framer_.BuildUnsizedDataPacket(header, frames).packet); 2549 ASSERT_TRUE(data != NULL); 2550 2551 test::CompareCharArraysWithHexError("constructed packet", 2552 data->data(), data->length(), 2553 AsChars(packet), arraysize(packet)); 2554 } 2555 2556 TEST_P(QuicFramerTest, BuildStreamFramePacket) { 2557 // Set a specific version. 2558 framer_.set_version(QUIC_VERSION_7); 2559 2560 QuicPacketHeader header; 2561 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2562 header.public_header.reset_flag = false; 2563 header.public_header.version_flag = false; 2564 header.fec_flag = false; 2565 header.entropy_flag = true; 2566 header.packet_sequence_number = GG_UINT64_C(0x77123456789ABC); 2567 header.fec_group = 0; 2568 2569 QuicStreamFrame stream_frame; 2570 stream_frame.stream_id = 0x01020304; 2571 stream_frame.fin = true; 2572 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); 2573 stream_frame.data = "hello world!"; 2574 2575 QuicFrames frames; 2576 frames.push_back(QuicFrame(&stream_frame)); 2577 2578 unsigned char packet[] = { 2579 // public flags (8 byte guid) 2580 0x3C, 2581 // guid 2582 0x10, 0x32, 0x54, 0x76, 2583 0x98, 0xBA, 0xDC, 0xFE, 2584 // packet sequence number 2585 0xBC, 0x9A, 0x78, 0x56, 2586 0x34, 0x12, 2587 // private flags (entropy) 2588 0x01, 2589 2590 // frame type (stream frame with fin and no length) 2591 0xBE, 2592 // stream id 2593 0x04, 0x03, 0x02, 0x01, 2594 // offset 2595 0x54, 0x76, 0x10, 0x32, 2596 0xDC, 0xFE, 0x98, 0xBA, 2597 // data 2598 'h', 'e', 'l', 'l', 2599 'o', ' ', 'w', 'o', 2600 'r', 'l', 'd', '!', 2601 }; 2602 2603 scoped_ptr<QuicPacket> data( 2604 framer_.BuildUnsizedDataPacket(header, frames).packet); 2605 ASSERT_TRUE(data != NULL); 2606 2607 test::CompareCharArraysWithHexError("constructed packet", 2608 data->data(), data->length(), 2609 AsChars(packet), arraysize(packet)); 2610 } 2611 2612 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) { 2613 QuicPacketHeader header; 2614 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2615 header.public_header.reset_flag = false; 2616 header.public_header.version_flag = true; 2617 header.fec_flag = false; 2618 header.entropy_flag = true; 2619 header.packet_sequence_number = GG_UINT64_C(0x77123456789ABC); 2620 header.fec_group = 0; 2621 2622 QuicStreamFrame stream_frame; 2623 stream_frame.stream_id = 0x01020304; 2624 stream_frame.fin = true; 2625 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); 2626 stream_frame.data = "hello world!"; 2627 2628 QuicFrames frames; 2629 frames.push_back(QuicFrame(&stream_frame)); 2630 2631 // Set a specific version. 2632 framer_.set_version(QUIC_VERSION_7); 2633 unsigned char packet[] = { 2634 // public flags (version, 8 byte guid) 2635 0x3D, 2636 // guid 2637 0x10, 0x32, 0x54, 0x76, 2638 0x98, 0xBA, 0xDC, 0xFE, 2639 // version tag 2640 'Q', '0', '0', '7', 2641 // packet sequence number 2642 0xBC, 0x9A, 0x78, 0x56, 2643 0x34, 0x12, 2644 // private flags (entropy) 2645 0x01, 2646 2647 // frame type (stream frame with fin and no length) 2648 0xBE, 2649 // stream id 2650 0x04, 0x03, 0x02, 0x01, 2651 // offset 2652 0x54, 0x76, 0x10, 0x32, 2653 0xDC, 0xFE, 0x98, 0xBA, 2654 // data 2655 'h', 'e', 'l', 'l', 2656 'o', ' ', 'w', 'o', 2657 'r', 'l', 'd', '!', 2658 }; 2659 2660 QuicFramerPeer::SetIsServer(&framer_, false); 2661 scoped_ptr<QuicPacket> data( 2662 framer_.BuildUnsizedDataPacket(header, frames).packet); 2663 ASSERT_TRUE(data != NULL); 2664 2665 test::CompareCharArraysWithHexError("constructed packet", 2666 data->data(), data->length(), 2667 AsChars(packet), arraysize(packet)); 2668 } 2669 2670 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) { 2671 QuicPacketPublicHeader header; 2672 header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2673 header.reset_flag = false; 2674 header.version_flag = true; 2675 2676 unsigned char packet[] = { 2677 // public flags (version, 8 byte guid) 2678 0x3D, 2679 // guid 2680 0x10, 0x32, 0x54, 0x76, 2681 0x98, 0xBA, 0xDC, 0xFE, 2682 // version tag 2683 'Q', '0', '0', '7', 2684 }; 2685 2686 QuicVersionVector versions; 2687 versions.push_back(QUIC_VERSION_7); 2688 scoped_ptr<QuicEncryptedPacket> data( 2689 framer_.BuildVersionNegotiationPacket(header, versions)); 2690 2691 test::CompareCharArraysWithHexError("constructed packet", 2692 data->data(), data->length(), 2693 AsChars(packet), arraysize(packet)); 2694 } 2695 2696 TEST_P(QuicFramerTest, BuildAckFramePacket) { 2697 QuicPacketHeader header; 2698 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2699 header.public_header.reset_flag = false; 2700 header.public_header.version_flag = false; 2701 header.fec_flag = false; 2702 header.entropy_flag = true; 2703 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 2704 header.fec_group = 0; 2705 2706 QuicAckFrame ack_frame; 2707 ack_frame.received_info.entropy_hash = 0x43; 2708 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); 2709 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); 2710 ack_frame.received_info.missing_packets.insert( 2711 GG_UINT64_C(0x770123456789ABE)); 2712 ack_frame.sent_info.entropy_hash = 0x14; 2713 ack_frame.sent_info.least_unacked = GG_UINT64_C(0x770123456789AA0); 2714 2715 QuicFrames frames; 2716 frames.push_back(QuicFrame(&ack_frame)); 2717 2718 unsigned char packet[] = { 2719 // public flags (8 byte guid) 2720 0x3C, 2721 // guid 2722 0x10, 0x32, 0x54, 0x76, 2723 0x98, 0xBA, 0xDC, 0xFE, 2724 // packet sequence number 2725 0xBC, 0x9A, 0x78, 0x56, 2726 0x34, 0x12, 2727 // private flags (entropy) 2728 0x01, 2729 2730 // frame type (ack frame) 2731 static_cast<unsigned char>(0x01), 2732 // entropy hash of sent packets till least awaiting - 1. 2733 0x14, 2734 // least packet sequence number awaiting an ack 2735 0xA0, 0x9A, 0x78, 0x56, 2736 0x34, 0x12, 2737 // entropy hash of all received packets. 2738 0x43, 2739 // largest observed packet sequence number 2740 0xBF, 0x9A, 0x78, 0x56, 2741 0x34, 0x12, 2742 // Zero delta time. 2743 0x0, 0x0, 0x0, 0x0, 2744 // num missing packets 2745 0x01, 2746 // missing packet 2747 0xBE, 0x9A, 0x78, 0x56, 2748 0x34, 0x12, 2749 }; 2750 2751 scoped_ptr<QuicPacket> data( 2752 framer_.BuildUnsizedDataPacket(header, frames).packet); 2753 ASSERT_TRUE(data != NULL); 2754 2755 test::CompareCharArraysWithHexError("constructed packet", 2756 data->data(), data->length(), 2757 AsChars(packet), arraysize(packet)); 2758 } 2759 2760 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) { 2761 QuicPacketHeader header; 2762 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2763 header.public_header.reset_flag = false; 2764 header.public_header.version_flag = false; 2765 header.fec_flag = false; 2766 header.entropy_flag = false; 2767 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 2768 header.fec_group = 0; 2769 2770 QuicCongestionFeedbackFrame congestion_feedback_frame; 2771 congestion_feedback_frame.type = kTCP; 2772 congestion_feedback_frame.tcp.accumulated_number_of_lost_packets = 0x0201; 2773 congestion_feedback_frame.tcp.receive_window = 0x4030; 2774 2775 QuicFrames frames; 2776 frames.push_back(QuicFrame(&congestion_feedback_frame)); 2777 2778 unsigned char packet[] = { 2779 // public flags (8 byte guid) 2780 0x3C, 2781 // guid 2782 0x10, 0x32, 0x54, 0x76, 2783 0x98, 0xBA, 0xDC, 0xFE, 2784 // packet sequence number 2785 0xBC, 0x9A, 0x78, 0x56, 2786 0x34, 0x12, 2787 // private flags 2788 0x00, 2789 2790 // frame type (congestion feedback frame) 2791 0x03, 2792 // congestion feedback type (TCP) 2793 0x00, 2794 // accumulated number of lost packets 2795 0x01, 0x02, 2796 // TCP receive window 2797 0x03, 0x04, 2798 }; 2799 2800 scoped_ptr<QuicPacket> data( 2801 framer_.BuildUnsizedDataPacket(header, frames).packet); 2802 ASSERT_TRUE(data != NULL); 2803 2804 test::CompareCharArraysWithHexError("constructed packet", 2805 data->data(), data->length(), 2806 AsChars(packet), arraysize(packet)); 2807 } 2808 2809 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInterArrival) { 2810 QuicPacketHeader header; 2811 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2812 header.public_header.reset_flag = false; 2813 header.public_header.version_flag = false; 2814 header.fec_flag = false; 2815 header.entropy_flag = false; 2816 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 2817 header.fec_group = 0; 2818 2819 QuicCongestionFeedbackFrame frame; 2820 frame.type = kInterArrival; 2821 frame.inter_arrival.accumulated_number_of_lost_packets = 0x0302; 2822 frame.inter_arrival.received_packet_times.insert( 2823 make_pair(GG_UINT64_C(0x0123456789ABA), 2824 start_.Add(QuicTime::Delta::FromMicroseconds( 2825 GG_UINT64_C(0x07E1D2C3B4A59687))))); 2826 frame.inter_arrival.received_packet_times.insert( 2827 make_pair(GG_UINT64_C(0x0123456789ABB), 2828 start_.Add(QuicTime::Delta::FromMicroseconds( 2829 GG_UINT64_C(0x07E1D2C3B4A59688))))); 2830 frame.inter_arrival.received_packet_times.insert( 2831 make_pair(GG_UINT64_C(0x0123456789ABD), 2832 start_.Add(QuicTime::Delta::FromMicroseconds( 2833 GG_UINT64_C(0x07E1D2C3B4A59689))))); 2834 QuicFrames frames; 2835 frames.push_back(QuicFrame(&frame)); 2836 2837 unsigned char packet[] = { 2838 // public flags (8 byte guid) 2839 0x3C, 2840 // guid 2841 0x10, 0x32, 0x54, 0x76, 2842 0x98, 0xBA, 0xDC, 0xFE, 2843 // packet sequence number 2844 0xBC, 0x9A, 0x78, 0x56, 2845 0x34, 0x12, 2846 // private flags 2847 0x00, 2848 2849 // frame type (congestion feedback frame) 2850 0x03, 2851 // congestion feedback type (inter arrival) 2852 0x01, 2853 // accumulated_number_of_lost_packets 2854 0x02, 0x03, 2855 // num received packets 2856 0x03, 2857 // lowest sequence number 2858 0xBA, 0x9A, 0x78, 0x56, 2859 0x34, 0x12, 2860 // receive time 2861 0x87, 0x96, 0xA5, 0xB4, 2862 0xC3, 0xD2, 0xE1, 0x07, 2863 // sequence delta 2864 0x01, 0x00, 2865 // time delta 2866 0x01, 0x00, 0x00, 0x00, 2867 // sequence delta (skip one packet) 2868 0x03, 0x00, 2869 // time delta 2870 0x02, 0x00, 0x00, 0x00, 2871 }; 2872 2873 scoped_ptr<QuicPacket> data( 2874 framer_.BuildUnsizedDataPacket(header, frames).packet); 2875 ASSERT_TRUE(data != NULL); 2876 2877 test::CompareCharArraysWithHexError("constructed packet", 2878 data->data(), data->length(), 2879 AsChars(packet), arraysize(packet)); 2880 } 2881 2882 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketFixRate) { 2883 QuicPacketHeader header; 2884 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2885 header.public_header.reset_flag = false; 2886 header.public_header.version_flag = false; 2887 header.fec_flag = false; 2888 header.entropy_flag = false; 2889 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 2890 header.fec_group = 0; 2891 2892 QuicCongestionFeedbackFrame congestion_feedback_frame; 2893 congestion_feedback_frame.type = kFixRate; 2894 congestion_feedback_frame.fix_rate.bitrate 2895 = QuicBandwidth::FromBytesPerSecond(0x04030201); 2896 2897 QuicFrames frames; 2898 frames.push_back(QuicFrame(&congestion_feedback_frame)); 2899 2900 unsigned char packet[] = { 2901 // public flags (8 byte guid) 2902 0x3C, 2903 // guid 2904 0x10, 0x32, 0x54, 0x76, 2905 0x98, 0xBA, 0xDC, 0xFE, 2906 // packet sequence number 2907 0xBC, 0x9A, 0x78, 0x56, 2908 0x34, 0x12, 2909 // private flags 2910 0x00, 2911 2912 // frame type (congestion feedback frame) 2913 0x03, 2914 // congestion feedback type (fix rate) 2915 0x02, 2916 // bitrate_in_bytes_per_second; 2917 0x01, 0x02, 0x03, 0x04, 2918 }; 2919 2920 scoped_ptr<QuicPacket> data( 2921 framer_.BuildUnsizedDataPacket(header, frames).packet); 2922 ASSERT_TRUE(data != NULL); 2923 2924 test::CompareCharArraysWithHexError("constructed packet", 2925 data->data(), data->length(), 2926 AsChars(packet), arraysize(packet)); 2927 } 2928 2929 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInvalidFeedback) { 2930 QuicPacketHeader header; 2931 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2932 header.public_header.reset_flag = false; 2933 header.public_header.version_flag = false; 2934 header.fec_flag = false; 2935 header.entropy_flag = false; 2936 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 2937 header.fec_group = 0; 2938 2939 QuicCongestionFeedbackFrame congestion_feedback_frame; 2940 congestion_feedback_frame.type = 2941 static_cast<CongestionFeedbackType>(kFixRate + 1); 2942 2943 QuicFrames frames; 2944 frames.push_back(QuicFrame(&congestion_feedback_frame)); 2945 2946 scoped_ptr<QuicPacket> data( 2947 framer_.BuildUnsizedDataPacket(header, frames).packet); 2948 ASSERT_TRUE(data == NULL); 2949 } 2950 2951 TEST_P(QuicFramerTest, BuildRstFramePacket) { 2952 QuicPacketHeader header; 2953 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 2954 header.public_header.reset_flag = false; 2955 header.public_header.version_flag = false; 2956 header.fec_flag = false; 2957 header.entropy_flag = false; 2958 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 2959 header.fec_group = 0; 2960 2961 QuicRstStreamFrame rst_frame; 2962 rst_frame.stream_id = 0x01020304; 2963 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708); 2964 rst_frame.error_details = "because I can"; 2965 2966 unsigned char packet[] = { 2967 // public flags (8 byte guid) 2968 0x3C, 2969 // guid 2970 0x10, 0x32, 0x54, 0x76, 2971 0x98, 0xBA, 0xDC, 0xFE, 2972 // packet sequence number 2973 0xBC, 0x9A, 0x78, 0x56, 2974 0x34, 0x12, 2975 // private flags 2976 0x00, 2977 2978 // frame type (rst stream frame) 2979 static_cast<unsigned char>(0x27), 2980 // stream id 2981 0x04, 0x03, 0x02, 0x01, 2982 // error code 2983 0x08, 0x07, 0x06, 0x05, 2984 // error details length 2985 0x0d, 0x00, 2986 // error details 2987 'b', 'e', 'c', 'a', 2988 'u', 's', 'e', ' ', 2989 'I', ' ', 'c', 'a', 2990 'n', 2991 }; 2992 2993 QuicFrames frames; 2994 frames.push_back(QuicFrame(&rst_frame)); 2995 2996 scoped_ptr<QuicPacket> data( 2997 framer_.BuildUnsizedDataPacket(header, frames).packet); 2998 ASSERT_TRUE(data != NULL); 2999 3000 test::CompareCharArraysWithHexError("constructed packet", 3001 data->data(), data->length(), 3002 AsChars(packet), arraysize(packet)); 3003 } 3004 3005 TEST_P(QuicFramerTest, BuildCloseFramePacket) { 3006 QuicPacketHeader header; 3007 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 3008 header.public_header.reset_flag = false; 3009 header.public_header.version_flag = false; 3010 header.fec_flag = false; 3011 header.entropy_flag = true; 3012 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 3013 header.fec_group = 0; 3014 3015 QuicConnectionCloseFrame close_frame; 3016 close_frame.error_code = static_cast<QuicErrorCode>(0x05060708); 3017 close_frame.error_details = "because I can"; 3018 3019 QuicAckFrame* ack_frame = &close_frame.ack_frame; 3020 ack_frame->received_info.entropy_hash = 0x43; 3021 ack_frame->received_info.largest_observed = GG_UINT64_C(0x0123456789ABF); 3022 ack_frame->received_info.missing_packets.insert(GG_UINT64_C(0x0123456789ABE)); 3023 ack_frame->sent_info.entropy_hash = 0xE0; 3024 ack_frame->sent_info.least_unacked = GG_UINT64_C(0x0123456789AA0); 3025 3026 QuicFrames frames; 3027 frames.push_back(QuicFrame(&close_frame)); 3028 3029 unsigned char packet[] = { 3030 // public flags (8 byte guid) 3031 0x3C, 3032 // guid 3033 0x10, 0x32, 0x54, 0x76, 3034 0x98, 0xBA, 0xDC, 0xFE, 3035 // packet sequence number 3036 0xBC, 0x9A, 0x78, 0x56, 3037 0x34, 0x12, 3038 // private flags (entropy) 3039 0x01, 3040 3041 // frame type (connection close frame) 3042 static_cast<unsigned char>(0x2F), 3043 // error code 3044 0x08, 0x07, 0x06, 0x05, 3045 // error details length 3046 0x0d, 0x00, 3047 // error details 3048 'b', 'e', 'c', 'a', 3049 'u', 's', 'e', ' ', 3050 'I', ' ', 'c', 'a', 3051 'n', 3052 3053 // Ack frame. 3054 // entropy hash of sent packets till least awaiting - 1. 3055 0xE0, 3056 // least packet sequence number awaiting an ack 3057 0xA0, 0x9A, 0x78, 0x56, 3058 0x34, 0x12, 3059 // entropy hash of all received packets. 3060 0x43, 3061 // largest observed packet sequence number 3062 0xBF, 0x9A, 0x78, 0x56, 3063 0x34, 0x12, 3064 // Infinite delta time. 3065 0xFF, 0xFF, 0xFF, 0xFF, 3066 // num missing packets 3067 0x01, 3068 // missing packet 3069 0xBE, 0x9A, 0x78, 0x56, 3070 0x34, 0x12, 3071 }; 3072 3073 scoped_ptr<QuicPacket> data( 3074 framer_.BuildUnsizedDataPacket(header, frames).packet); 3075 ASSERT_TRUE(data != NULL); 3076 3077 test::CompareCharArraysWithHexError("constructed packet", 3078 data->data(), data->length(), 3079 AsChars(packet), arraysize(packet)); 3080 } 3081 3082 TEST_P(QuicFramerTest, BuildGoAwayPacket) { 3083 QuicPacketHeader header; 3084 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 3085 header.public_header.reset_flag = false; 3086 header.public_header.version_flag = false; 3087 header.fec_flag = false; 3088 header.entropy_flag = true; 3089 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 3090 header.fec_group = 0; 3091 3092 QuicGoAwayFrame goaway_frame; 3093 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708); 3094 goaway_frame.last_good_stream_id = 0x01020304; 3095 goaway_frame.reason_phrase = "because I can"; 3096 3097 QuicFrames frames; 3098 frames.push_back(QuicFrame(&goaway_frame)); 3099 3100 unsigned char packet[] = { 3101 // public flags (8 byte guid) 3102 0x3C, 3103 // guid 3104 0x10, 0x32, 0x54, 0x76, 3105 0x98, 0xBA, 0xDC, 0xFE, 3106 // packet sequence number 3107 0xBC, 0x9A, 0x78, 0x56, 3108 0x34, 0x12, 3109 // private flags(entropy) 3110 0x01, 3111 3112 // frame type (go away frame) 3113 static_cast<unsigned char>(0x37), 3114 // error code 3115 0x08, 0x07, 0x06, 0x05, 3116 // stream id 3117 0x04, 0x03, 0x02, 0x01, 3118 // error details length 3119 0x0d, 0x00, 3120 // error details 3121 'b', 'e', 'c', 'a', 3122 'u', 's', 'e', ' ', 3123 'I', ' ', 'c', 'a', 3124 'n', 3125 }; 3126 3127 scoped_ptr<QuicPacket> data( 3128 framer_.BuildUnsizedDataPacket(header, frames).packet); 3129 ASSERT_TRUE(data != NULL); 3130 3131 test::CompareCharArraysWithHexError("constructed packet", 3132 data->data(), data->length(), 3133 AsChars(packet), arraysize(packet)); 3134 } 3135 3136 TEST_P(QuicFramerTest, BuildPublicResetPacket) { 3137 QuicPublicResetPacket reset_packet; 3138 reset_packet.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 3139 reset_packet.public_header.reset_flag = true; 3140 reset_packet.public_header.version_flag = false; 3141 reset_packet.rejected_sequence_number = GG_UINT64_C(0x123456789ABC); 3142 reset_packet.nonce_proof = GG_UINT64_C(0xABCDEF0123456789); 3143 3144 unsigned char packet[] = { 3145 // public flags (public reset, 8 byte GUID) 3146 0x3E, 3147 // guid 3148 0x10, 0x32, 0x54, 0x76, 3149 0x98, 0xBA, 0xDC, 0xFE, 3150 // nonce proof 3151 0x89, 0x67, 0x45, 0x23, 3152 0x01, 0xEF, 0xCD, 0xAB, 3153 // rejected sequence number 3154 0xBC, 0x9A, 0x78, 0x56, 3155 0x34, 0x12, 3156 }; 3157 3158 scoped_ptr<QuicEncryptedPacket> data( 3159 framer_.BuildPublicResetPacket(reset_packet)); 3160 ASSERT_TRUE(data != NULL); 3161 3162 test::CompareCharArraysWithHexError("constructed packet", 3163 data->data(), data->length(), 3164 AsChars(packet), arraysize(packet)); 3165 } 3166 3167 TEST_P(QuicFramerTest, BuildFecPacket) { 3168 QuicPacketHeader header; 3169 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 3170 header.public_header.reset_flag = false; 3171 header.public_header.version_flag = false; 3172 header.fec_flag = true; 3173 header.entropy_flag = true; 3174 header.packet_sequence_number = (GG_UINT64_C(0x123456789ABC)); 3175 header.is_in_fec_group = IN_FEC_GROUP; 3176 header.fec_group = GG_UINT64_C(0x123456789ABB);; 3177 3178 QuicFecData fec_data; 3179 fec_data.fec_group = 1; 3180 fec_data.redundancy = "abcdefghijklmnop"; 3181 3182 unsigned char packet[] = { 3183 // public flags (8 byte guid) 3184 0x3C, 3185 // guid 3186 0x10, 0x32, 0x54, 0x76, 3187 0x98, 0xBA, 0xDC, 0xFE, 3188 // packet sequence number 3189 0xBC, 0x9A, 0x78, 0x56, 3190 0x34, 0x12, 3191 // private flags (entropy & fec group & fec packet) 3192 0x07, 3193 // first fec protected packet offset 3194 0x01, 3195 3196 // redundancy 3197 'a', 'b', 'c', 'd', 3198 'e', 'f', 'g', 'h', 3199 'i', 'j', 'k', 'l', 3200 'm', 'n', 'o', 'p', 3201 }; 3202 3203 scoped_ptr<QuicPacket> data( 3204 framer_.BuildFecPacket(header, fec_data).packet); 3205 ASSERT_TRUE(data != NULL); 3206 3207 test::CompareCharArraysWithHexError("constructed packet", 3208 data->data(), data->length(), 3209 AsChars(packet), arraysize(packet)); 3210 } 3211 3212 TEST_P(QuicFramerTest, EncryptPacket) { 3213 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); 3214 unsigned char packet[] = { 3215 // public flags (8 byte guid) 3216 0x3C, 3217 // guid 3218 0x10, 0x32, 0x54, 0x76, 3219 0x98, 0xBA, 0xDC, 0xFE, 3220 // packet sequence number 3221 0xBC, 0x9A, 0x78, 0x56, 3222 0x34, 0x12, 3223 // private flags (fec group & fec packet) 3224 0x06, 3225 // first fec protected packet offset 3226 0x01, 3227 3228 // redundancy 3229 'a', 'b', 'c', 'd', 3230 'e', 'f', 'g', 'h', 3231 'i', 'j', 'k', 'l', 3232 'm', 'n', 'o', 'p', 3233 }; 3234 3235 scoped_ptr<QuicPacket> raw( 3236 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, 3237 PACKET_8BYTE_GUID, !kIncludeVersion, 3238 PACKET_6BYTE_SEQUENCE_NUMBER)); 3239 scoped_ptr<QuicEncryptedPacket> encrypted( 3240 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); 3241 3242 ASSERT_TRUE(encrypted.get() != NULL); 3243 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); 3244 } 3245 3246 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { 3247 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); 3248 unsigned char packet[] = { 3249 // public flags (version, 8 byte guid) 3250 0x3D, 3251 // guid 3252 0x10, 0x32, 0x54, 0x76, 3253 0x98, 0xBA, 0xDC, 0xFE, 3254 // version tag 3255 'Q', '.', '1', '0', 3256 // packet sequence number 3257 0xBC, 0x9A, 0x78, 0x56, 3258 0x34, 0x12, 3259 // private flags (fec group & fec flags) 3260 0x06, 3261 // first fec protected packet offset 3262 0x01, 3263 3264 // redundancy 3265 'a', 'b', 'c', 'd', 3266 'e', 'f', 'g', 'h', 3267 'i', 'j', 'k', 'l', 3268 'm', 'n', 'o', 'p', 3269 }; 3270 3271 scoped_ptr<QuicPacket> raw( 3272 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, 3273 PACKET_8BYTE_GUID, kIncludeVersion, 3274 PACKET_6BYTE_SEQUENCE_NUMBER)); 3275 scoped_ptr<QuicEncryptedPacket> encrypted( 3276 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); 3277 3278 ASSERT_TRUE(encrypted.get() != NULL); 3279 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); 3280 } 3281 3282 // TODO(rch): re-enable after https://codereview.chromium.org/11820005/ 3283 // lands. Currently this is causing valgrind problems, but it should be 3284 // fixed in the followup CL. 3285 TEST_P(QuicFramerTest, DISABLED_CalculateLargestReceived) { 3286 SequenceNumberSet missing; 3287 missing.insert(1); 3288 missing.insert(5); 3289 missing.insert(7); 3290 3291 // These two we just walk to the next gap, and return the largest seen. 3292 EXPECT_EQ(4u, QuicFramer::CalculateLargestObserved(missing, missing.find(1))); 3293 EXPECT_EQ(6u, QuicFramer::CalculateLargestObserved(missing, missing.find(5))); 3294 3295 missing.insert(2); 3296 // For 1, we can't go forward as 2 would be implicitly acked so we return the 3297 // largest missing packet. 3298 EXPECT_EQ(1u, QuicFramer::CalculateLargestObserved(missing, missing.find(1))); 3299 // For 2, we've seen 3 and 4, so can admit to a largest observed. 3300 EXPECT_EQ(4u, QuicFramer::CalculateLargestObserved(missing, missing.find(2))); 3301 } 3302 3303 // TODO(rch) enable after landing the revised truncation CL. 3304 TEST_P(QuicFramerTest, DISABLED_Truncation) { 3305 QuicPacketHeader header; 3306 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 3307 header.public_header.reset_flag = false; 3308 header.public_header.version_flag = false; 3309 header.fec_flag = false; 3310 header.entropy_flag = false; 3311 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 3312 header.fec_group = 0; 3313 3314 QuicConnectionCloseFrame close_frame; 3315 QuicAckFrame* ack_frame = &close_frame.ack_frame; 3316 close_frame.error_code = static_cast<QuicErrorCode>(0x05); 3317 close_frame.error_details = "because I can"; 3318 ack_frame->received_info.largest_observed = 201; 3319 ack_frame->sent_info.least_unacked = 0; 3320 for (uint64 i = 1; i < ack_frame->received_info.largest_observed; ++i) { 3321 ack_frame->received_info.missing_packets.insert(i); 3322 } 3323 3324 // Create a packet with just the ack 3325 QuicFrame frame; 3326 frame.type = ACK_FRAME; 3327 frame.ack_frame = ack_frame; 3328 QuicFrames frames; 3329 frames.push_back(frame); 3330 3331 scoped_ptr<QuicPacket> raw_ack_packet( 3332 framer_.BuildUnsizedDataPacket(header, frames).packet); 3333 ASSERT_TRUE(raw_ack_packet != NULL); 3334 3335 scoped_ptr<QuicEncryptedPacket> ack_packet( 3336 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, 3337 *raw_ack_packet)); 3338 3339 // Create a packet with just connection close. 3340 frames.clear(); 3341 frame.type = CONNECTION_CLOSE_FRAME; 3342 frame.connection_close_frame = &close_frame; 3343 frames.push_back(frame); 3344 3345 scoped_ptr<QuicPacket> raw_close_packet( 3346 framer_.BuildUnsizedDataPacket(header, frames).packet); 3347 ASSERT_TRUE(raw_close_packet != NULL); 3348 3349 scoped_ptr<QuicEncryptedPacket> close_packet( 3350 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, 3351 *raw_close_packet)); 3352 3353 // Now make sure we can turn our ack packet back into an ack frame 3354 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); 3355 3356 // And do the same for the close frame. 3357 ASSERT_TRUE(framer_.ProcessPacket(*close_packet)); 3358 } 3359 3360 TEST_P(QuicFramerTest, CleanTruncation) { 3361 QuicPacketHeader header; 3362 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 3363 header.public_header.reset_flag = false; 3364 header.public_header.version_flag = false; 3365 header.fec_flag = false; 3366 header.entropy_flag = true; 3367 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 3368 header.fec_group = 0; 3369 3370 QuicConnectionCloseFrame close_frame; 3371 QuicAckFrame* ack_frame = &close_frame.ack_frame; 3372 close_frame.error_code = static_cast<QuicErrorCode>(0x05); 3373 close_frame.error_details = "because I can"; 3374 ack_frame->received_info.largest_observed = 201; 3375 ack_frame->sent_info.least_unacked = 0; 3376 for (uint64 i = 1; i < ack_frame->received_info.largest_observed; ++i) { 3377 ack_frame->received_info.missing_packets.insert(i); 3378 } 3379 3380 // Create a packet with just the ack 3381 QuicFrame frame; 3382 frame.type = ACK_FRAME; 3383 frame.ack_frame = ack_frame; 3384 QuicFrames frames; 3385 frames.push_back(frame); 3386 3387 scoped_ptr<QuicPacket> raw_ack_packet( 3388 framer_.BuildUnsizedDataPacket(header, frames).packet); 3389 ASSERT_TRUE(raw_ack_packet != NULL); 3390 3391 scoped_ptr<QuicEncryptedPacket> ack_packet( 3392 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, 3393 *raw_ack_packet)); 3394 3395 // Create a packet with just connection close. 3396 frames.clear(); 3397 frame.type = CONNECTION_CLOSE_FRAME; 3398 frame.connection_close_frame = &close_frame; 3399 frames.push_back(frame); 3400 3401 scoped_ptr<QuicPacket> raw_close_packet( 3402 framer_.BuildUnsizedDataPacket(header, frames).packet); 3403 ASSERT_TRUE(raw_close_packet != NULL); 3404 3405 scoped_ptr<QuicEncryptedPacket> close_packet( 3406 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, 3407 *raw_close_packet)); 3408 3409 // Now make sure we can turn our ack packet back into an ack frame 3410 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); 3411 3412 // And do the same for the close frame. 3413 ASSERT_TRUE(framer_.ProcessPacket(*close_packet)); 3414 3415 // Test for clean truncation of the ack by comparing the length of the 3416 // original packets to the re-serialized packets. 3417 frames.clear(); 3418 frame.type = ACK_FRAME; 3419 frame.ack_frame = visitor_.ack_frames_[0]; 3420 frames.push_back(frame); 3421 3422 size_t original_raw_length = raw_ack_packet->length(); 3423 raw_ack_packet.reset( 3424 framer_.BuildUnsizedDataPacket(header, frames).packet); 3425 ASSERT_TRUE(raw_ack_packet != NULL); 3426 EXPECT_EQ(original_raw_length, raw_ack_packet->length()); 3427 3428 frames.clear(); 3429 frame.type = CONNECTION_CLOSE_FRAME; 3430 frame.connection_close_frame = &visitor_.connection_close_frame_; 3431 frames.push_back(frame); 3432 3433 original_raw_length = raw_close_packet->length(); 3434 raw_close_packet.reset( 3435 framer_.BuildUnsizedDataPacket(header, frames).packet); 3436 ASSERT_TRUE(raw_ack_packet != NULL); 3437 EXPECT_EQ(original_raw_length, raw_close_packet->length()); 3438 } 3439 3440 TEST_P(QuicFramerTest, EntropyFlagTest) { 3441 // Set a specific version. 3442 framer_.set_version(QUIC_VERSION_7); 3443 3444 unsigned char packet[] = { 3445 // public flags (8 byte guid) 3446 0x3C, 3447 // guid 3448 0x10, 0x32, 0x54, 0x76, 3449 0x98, 0xBA, 0xDC, 0xFE, 3450 // packet sequence number 3451 0xBC, 0x9A, 0x78, 0x56, 3452 0x34, 0x12, 3453 // private flags (Entropy) 3454 0x01, 3455 3456 // frame type (stream frame with fin and no length) 3457 0xBE, 3458 // stream id 3459 0x04, 0x03, 0x02, 0x01, 3460 // offset 3461 0x54, 0x76, 0x10, 0x32, 3462 0xDC, 0xFE, 0x98, 0xBA, 3463 // data 3464 'h', 'e', 'l', 'l', 3465 'o', ' ', 'w', 'o', 3466 'r', 'l', 'd', '!', 3467 }; 3468 3469 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 3470 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 3471 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 3472 ASSERT_TRUE(visitor_.header_.get()); 3473 EXPECT_TRUE(visitor_.header_->entropy_flag); 3474 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); 3475 EXPECT_FALSE(visitor_.header_->fec_flag); 3476 }; 3477 3478 TEST_P(QuicFramerTest, FecEntropyTest) { 3479 // Set a specific version. 3480 framer_.set_version(QUIC_VERSION_7); 3481 3482 unsigned char packet[] = { 3483 // public flags (8 byte guid) 3484 0x3C, 3485 // guid 3486 0x10, 0x32, 0x54, 0x76, 3487 0x98, 0xBA, 0xDC, 0xFE, 3488 // packet sequence number 3489 0xBC, 0x9A, 0x78, 0x56, 3490 0x34, 0x12, 3491 // private flags (Entropy & fec group & FEC) 3492 0x07, 3493 // first fec protected packet offset 3494 0xFF, 3495 3496 // frame type (stream frame with fin and no length) 3497 0xBE, 3498 // stream id 3499 0x04, 0x03, 0x02, 0x01, 3500 // offset 3501 0x54, 0x76, 0x10, 0x32, 3502 0xDC, 0xFE, 0x98, 0xBA, 3503 // data 3504 'h', 'e', 'l', 'l', 3505 'o', ' ', 'w', 'o', 3506 'r', 'l', 'd', '!', 3507 }; 3508 3509 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 3510 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 3511 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 3512 ASSERT_TRUE(visitor_.header_.get()); 3513 EXPECT_TRUE(visitor_.header_->fec_flag); 3514 EXPECT_TRUE(visitor_.header_->entropy_flag); 3515 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); 3516 }; 3517 3518 TEST_P(QuicFramerTest, StopPacketProcessing) { 3519 // Set a specific version. 3520 framer_.set_version(QUIC_VERSION_7); 3521 3522 unsigned char packet[] = { 3523 // public flags (8 byte guid) 3524 0x3C, 3525 // guid 3526 0x10, 0x32, 0x54, 0x76, 3527 0x98, 0xBA, 0xDC, 0xFE, 3528 // packet sequence number 3529 0xBC, 0x9A, 0x78, 0x56, 3530 0x34, 0x12, 3531 // Entropy 3532 0x01, 3533 3534 // frame type (stream frame with fin) 3535 0xFE, 3536 // stream id 3537 0x04, 0x03, 0x02, 0x01, 3538 // offset 3539 0x54, 0x76, 0x10, 0x32, 3540 0xDC, 0xFE, 0x98, 0xBA, 3541 // data length 3542 0x0c, 0x00, 3543 // data 3544 'h', 'e', 'l', 'l', 3545 'o', ' ', 'w', 'o', 3546 'r', 'l', 'd', '!', 3547 3548 // frame type (ack frame) 3549 0x02, 3550 // entropy hash of sent packets till least awaiting - 1. 3551 0x14, 3552 // least packet sequence number awaiting an ack 3553 0xA0, 0x9A, 0x78, 0x56, 3554 0x34, 0x12, 3555 // entropy hash of all received packets. 3556 0x43, 3557 // largest observed packet sequence number 3558 0xBF, 0x9A, 0x78, 0x56, 3559 0x34, 0x12, 3560 // num missing packets 3561 0x01, 3562 // missing packet 3563 0xBE, 0x9A, 0x78, 0x56, 3564 0x34, 0x12, 3565 }; 3566 3567 MockFramerVisitor visitor; 3568 framer_.set_visitor(&visitor); 3569 EXPECT_CALL(visitor, OnPacket()); 3570 EXPECT_CALL(visitor, OnPacketHeader(_)); 3571 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false)); 3572 EXPECT_CALL(visitor, OnAckFrame(_)).Times(0); 3573 EXPECT_CALL(visitor, OnPacketComplete()); 3574 3575 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 3576 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 3577 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 3578 } 3579 3580 TEST_P(QuicFramerTest, ConnectionCloseWithInvalidAck) { 3581 unsigned char packet[] = { 3582 // public flags (8 byte guid) 3583 0x3C, 3584 // guid 3585 0x10, 0x32, 0x54, 0x76, 3586 0x98, 0xBA, 0xDC, 0xFE, 3587 // packet sequence number 3588 0xBC, 0x9A, 0x78, 0x56, 3589 0x34, 0x12, 3590 // private flags 3591 0x00, 3592 3593 // frame type (connection close frame) 3594 static_cast<unsigned char>(0x2F), 3595 // error code 3596 0x11, 0x00, 0x00, 0x00, 3597 // error details length 3598 0x0d, 0x00, 3599 // error details 3600 'b', 'e', 'c', 'a', 3601 'u', 's', 'e', ' ', 3602 'I', ' ', 'c', 'a', 3603 'n', 3604 3605 // Ack frame. 3606 // entropy hash of sent packets till least awaiting - 1. 3607 0xE0, 3608 // least packet sequence number awaiting an ack 3609 0xA0, 0x9A, 0x78, 0x56, 3610 0x34, 0x12, 3611 // entropy hash of all received packets. 3612 0x43, 3613 // largest observed packet sequence number 3614 0xBF, 0x9A, 0x78, 0x56, 3615 0x34, 0x12, 3616 // Infinite delta time. 3617 0xFF, 0xFF, 0xFF, 0xFF, 3618 // num missing packets 3619 0x01, 3620 // missing packet 3621 0xBE, 0x9A, 0x78, 0x56, 3622 0x34, 0x12, 3623 }; 3624 3625 MockFramerVisitor visitor; 3626 framer_.set_visitor(&visitor); 3627 EXPECT_CALL(visitor, OnPacket()); 3628 EXPECT_CALL(visitor, OnPacketHeader(_)); 3629 EXPECT_CALL(visitor, OnAckFrame(_)).WillOnce(Return(false)); 3630 EXPECT_CALL(visitor, OnConnectionCloseFrame(_)).Times(0); 3631 EXPECT_CALL(visitor, OnPacketComplete()); 3632 3633 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 3634 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 3635 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 3636 } 3637 3638 } // namespace test 3639 } // namespace net 3640