| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/spdy/hpack/hpack_input_stream.h" | 5 #include "net/spdy/hpack/hpack_input_stream.h" |
| 6 | 6 |
| 7 #include <bitset> | 7 #include <bitset> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/strings/string_piece.h" | 12 #include "base/strings/string_piece.h" |
| 13 #include "net/spdy/hpack/hpack_constants.h" | 13 #include "net/spdy/hpack/hpack_constants.h" |
| 14 #include "net/spdy/spdy_test_utils.h" | 14 #include "net/spdy/spdy_test_utils.h" |
| 15 #include "net/test/gtest_util.h" | 15 #include "net/test/gtest_util.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 17 |
| 18 namespace net { | 18 namespace net { |
| 19 | 19 |
| 20 namespace test { | 20 namespace test { |
| 21 | 21 |
| 22 using base::StringPiece; | 22 using base::StringPiece; |
| 23 using std::string; | 23 using std::string; |
| 24 using test::a2b_hex; | 24 using test::a2b_hex; |
| 25 | 25 |
| 26 const size_t kLiteralBound = 1024; | |
| 27 | |
| 28 // Hex representation of encoded length and Huffman string. | 26 // Hex representation of encoded length and Huffman string. |
| 29 const char kEncodedHuffmanFixture[] = | 27 const char kEncodedHuffmanFixture[] = |
| 30 "2d" // Length prefix. | 28 "2d" // Length prefix. |
| 31 "94e7821dd7f2e6c7b335dfdfcd5b3960" | 29 "94e7821dd7f2e6c7b335dfdfcd5b3960" |
| 32 "d5af27087f3672c1ab270fb5291f9587" | 30 "d5af27087f3672c1ab270fb5291f9587" |
| 33 "316065c003ed4ee5b1063d5007"; | 31 "316065c003ed4ee5b1063d5007"; |
| 34 | 32 |
| 35 const char kDecodedHuffmanFixture[] = | 33 const char kDecodedHuffmanFixture[] = |
| 36 "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"; | 34 "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"; |
| 37 | 35 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 48 | 46 |
| 49 private: | 47 private: |
| 50 HpackInputStream* input_stream_; | 48 HpackInputStream* input_stream_; |
| 51 }; | 49 }; |
| 52 | 50 |
| 53 // Utility function to decode an assumed-valid uint32_t with an N-bit | 51 // Utility function to decode an assumed-valid uint32_t with an N-bit |
| 54 // prefix. | 52 // prefix. |
| 55 uint32_t DecodeValidUint32(uint8_t N, StringPiece str) { | 53 uint32_t DecodeValidUint32(uint8_t N, StringPiece str) { |
| 56 EXPECT_GT(N, 0); | 54 EXPECT_GT(N, 0); |
| 57 EXPECT_LE(N, 8); | 55 EXPECT_LE(N, 8); |
| 58 HpackInputStream input_stream(kLiteralBound, str); | 56 HpackInputStream input_stream(str); |
| 59 HpackInputStreamPeer input_stream_peer(&input_stream); | 57 HpackInputStreamPeer input_stream_peer(&input_stream); |
| 60 input_stream_peer.SetBitOffsetForTest(8 - N); | 58 input_stream_peer.SetBitOffsetForTest(8 - N); |
| 61 uint32_t I; | 59 uint32_t I; |
| 62 EXPECT_TRUE(input_stream.DecodeNextUint32(&I)); | 60 EXPECT_TRUE(input_stream.DecodeNextUint32(&I)); |
| 63 EXPECT_EQ(str.size(), input_stream_peer.ParsedBytesCurrent()); | 61 EXPECT_EQ(str.size(), input_stream_peer.ParsedBytesCurrent()); |
| 64 EXPECT_FALSE(input_stream.NeedMoreData()); | 62 EXPECT_FALSE(input_stream.NeedMoreData()); |
| 65 return I; | 63 return I; |
| 66 } | 64 } |
| 67 | 65 |
| 68 // Utility function to decode an assumed-invalid uint32_t with an N-bit | 66 // Utility function to decode an assumed-invalid uint32_t with an N-bit |
| 69 // prefix. | 67 // prefix. |
| 70 void ExpectDecodeUint32Invalid(uint8_t N, StringPiece str) { | 68 void ExpectDecodeUint32Invalid(uint8_t N, StringPiece str) { |
| 71 EXPECT_GT(N, 0); | 69 EXPECT_GT(N, 0); |
| 72 EXPECT_LE(N, 8); | 70 EXPECT_LE(N, 8); |
| 73 HpackInputStream input_stream(kLiteralBound, str); | 71 HpackInputStream input_stream(str); |
| 74 HpackInputStreamPeer input_stream_peer(&input_stream); | 72 HpackInputStreamPeer input_stream_peer(&input_stream); |
| 75 input_stream_peer.SetBitOffsetForTest(8 - N); | 73 input_stream_peer.SetBitOffsetForTest(8 - N); |
| 76 uint32_t I; | 74 uint32_t I; |
| 77 EXPECT_FALSE(input_stream.DecodeNextUint32(&I)); | 75 EXPECT_FALSE(input_stream.DecodeNextUint32(&I)); |
| 78 } | 76 } |
| 79 | 77 |
| 80 uint32_t bits32(const string& bitstring) { | 78 uint32_t bits32(const string& bitstring) { |
| 81 return std::bitset<32>(bitstring).to_ulong(); | 79 return std::bitset<32>(bitstring).to_ulong(); |
| 82 } | 80 } |
| 83 | 81 |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 ExpectDecodeUint32Invalid(2, "\x03\x80\x80\x80\x80\x80\x00"); | 487 ExpectDecodeUint32Invalid(2, "\x03\x80\x80\x80\x80\x80\x00"); |
| 490 ExpectDecodeUint32Invalid(2, "\x03\x80\x80\x80\x80\x80\x01"); | 488 ExpectDecodeUint32Invalid(2, "\x03\x80\x80\x80\x80\x80\x01"); |
| 491 ExpectDecodeUint32Invalid(2, "\xff\xff\xff\xff\xff\xff\xff"); | 489 ExpectDecodeUint32Invalid(2, "\xff\xff\xff\xff\xff\xff\xff"); |
| 492 ExpectDecodeUint32Invalid(1, "\x01\x80\x80\x80\x80\x80\x00"); | 490 ExpectDecodeUint32Invalid(1, "\x01\x80\x80\x80\x80\x80\x00"); |
| 493 ExpectDecodeUint32Invalid(1, "\x01\x80\x80\x80\x80\x80\x01"); | 491 ExpectDecodeUint32Invalid(1, "\x01\x80\x80\x80\x80\x80\x01"); |
| 494 ExpectDecodeUint32Invalid(1, "\xff\xff\xff\xff\xff\xff\xff"); | 492 ExpectDecodeUint32Invalid(1, "\xff\xff\xff\xff\xff\xff\xff"); |
| 495 } | 493 } |
| 496 | 494 |
| 497 // Decoding a valid encoded string literal should work. | 495 // Decoding a valid encoded string literal should work. |
| 498 TEST(HpackInputStreamTest, DecodeNextIdentityString) { | 496 TEST(HpackInputStreamTest, DecodeNextIdentityString) { |
| 499 HpackInputStream input_stream(kLiteralBound, "\x0estring literal"); | 497 HpackInputStream input_stream("\x0estring literal"); |
| 500 HpackInputStreamPeer input_stream_peer(&input_stream); | 498 HpackInputStreamPeer input_stream_peer(&input_stream); |
| 501 | 499 |
| 502 EXPECT_TRUE(input_stream.HasMoreData()); | 500 EXPECT_TRUE(input_stream.HasMoreData()); |
| 503 StringPiece string_piece; | 501 StringPiece string_piece; |
| 504 EXPECT_TRUE(input_stream.DecodeNextIdentityString(&string_piece)); | 502 EXPECT_TRUE(input_stream.DecodeNextIdentityString(&string_piece)); |
| 505 EXPECT_EQ("string literal", string_piece); | 503 EXPECT_EQ("string literal", string_piece); |
| 506 EXPECT_FALSE(input_stream.HasMoreData()); | 504 EXPECT_FALSE(input_stream.HasMoreData()); |
| 507 EXPECT_EQ(string_piece.size() + 1, input_stream_peer.ParsedBytesCurrent()); | 505 EXPECT_EQ(string_piece.size() + 1, input_stream_peer.ParsedBytesCurrent()); |
| 508 EXPECT_FALSE(input_stream.NeedMoreData()); | 506 EXPECT_FALSE(input_stream.NeedMoreData()); |
| 509 } | 507 } |
| 510 | 508 |
| 511 // Decoding an encoded string literal with size larger than | |
| 512 // |max_string_literal_size_| should fail. | |
| 513 TEST(HpackInputStreamTest, DecodeNextIdentityStringSizeLimit) { | |
| 514 HpackInputStream input_stream(13, "\x0estring literal"); | |
| 515 | |
| 516 EXPECT_TRUE(input_stream.HasMoreData()); | |
| 517 StringPiece string_piece; | |
| 518 EXPECT_FALSE(input_stream.DecodeNextIdentityString(&string_piece)); | |
| 519 EXPECT_FALSE(input_stream.NeedMoreData()); | |
| 520 } | |
| 521 | |
| 522 // Decoding an encoded string literal with size larger than the | 509 // Decoding an encoded string literal with size larger than the |
| 523 // remainder of the buffer should fail. | 510 // remainder of the buffer should fail. |
| 524 TEST(HpackInputStreamTest, DecodeNextIdentityStringNotEnoughInput) { | 511 TEST(HpackInputStreamTest, DecodeNextIdentityStringNotEnoughInput) { |
| 525 // Set the length to be one more than it should be. | 512 // Set the length to be one more than it should be. |
| 526 HpackInputStream input_stream(kLiteralBound, "\x0fstring literal"); | 513 HpackInputStream input_stream("\x0fstring literal"); |
| 527 | 514 |
| 528 EXPECT_TRUE(input_stream.HasMoreData()); | 515 EXPECT_TRUE(input_stream.HasMoreData()); |
| 529 StringPiece string_piece; | 516 StringPiece string_piece; |
| 530 EXPECT_FALSE(input_stream.DecodeNextIdentityString(&string_piece)); | 517 EXPECT_FALSE(input_stream.DecodeNextIdentityString(&string_piece)); |
| 531 EXPECT_TRUE(input_stream.NeedMoreData()); | 518 EXPECT_TRUE(input_stream.NeedMoreData()); |
| 532 } | 519 } |
| 533 | 520 |
| 534 TEST(HpackInputStreamTest, DecodeNextHuffmanString) { | 521 TEST(HpackInputStreamTest, DecodeNextHuffmanString) { |
| 535 string output, input(a2b_hex(kEncodedHuffmanFixture)); | 522 string output, input(a2b_hex(kEncodedHuffmanFixture)); |
| 536 HpackInputStream input_stream(arraysize(kDecodedHuffmanFixture) - 1, input); | 523 HpackInputStream input_stream(input); |
| 537 HpackInputStreamPeer input_stream_peer(&input_stream); | 524 HpackInputStreamPeer input_stream_peer(&input_stream); |
| 538 | 525 |
| 539 EXPECT_TRUE(input_stream.HasMoreData()); | 526 EXPECT_TRUE(input_stream.HasMoreData()); |
| 540 EXPECT_TRUE(input_stream.DecodeNextHuffmanString(&output)); | 527 EXPECT_TRUE(input_stream.DecodeNextHuffmanString(&output)); |
| 541 EXPECT_EQ(kDecodedHuffmanFixture, output); | 528 EXPECT_EQ(kDecodedHuffmanFixture, output); |
| 542 EXPECT_FALSE(input_stream.HasMoreData()); | 529 EXPECT_FALSE(input_stream.HasMoreData()); |
| 543 EXPECT_FALSE(input_stream.NeedMoreData()); | 530 EXPECT_FALSE(input_stream.NeedMoreData()); |
| 544 EXPECT_EQ(46u, input_stream_peer.ParsedBytesCurrent()); | 531 EXPECT_EQ(46u, input_stream_peer.ParsedBytesCurrent()); |
| 545 } | 532 } |
| 546 | 533 |
| 547 TEST(HpackInputStreamTest, DecodeNextHuffmanStringSizeLimit) { | |
| 548 string output, input(a2b_hex(kEncodedHuffmanFixture)); | |
| 549 // Max string literal is one byte shorter than the decoded fixture. | |
| 550 HpackInputStream input_stream(arraysize(kDecodedHuffmanFixture) - 2, input); | |
| 551 | |
| 552 // Decoded string overflows the max string literal. | |
| 553 EXPECT_TRUE(input_stream.HasMoreData()); | |
| 554 EXPECT_FALSE(input_stream.DecodeNextHuffmanString(&output)); | |
| 555 EXPECT_FALSE(input_stream.NeedMoreData()); | |
| 556 } | |
| 557 | |
| 558 TEST(HpackInputStreamTest, DecodeNextHuffmanStringNotEnoughInput) { | 534 TEST(HpackInputStreamTest, DecodeNextHuffmanStringNotEnoughInput) { |
| 559 string output, input(a2b_hex(kEncodedHuffmanFixture)); | 535 string output, input(a2b_hex(kEncodedHuffmanFixture)); |
| 560 input[0]++; // Input prefix is one byte larger than available input. | 536 input[0]++; // Input prefix is one byte larger than available input. |
| 561 HpackInputStream input_stream(arraysize(kDecodedHuffmanFixture) - 1, input); | 537 HpackInputStream input_stream(input); |
| 562 | 538 |
| 563 // Not enough buffer for declared encoded length. | 539 // Not enough buffer for declared encoded length. |
| 564 EXPECT_TRUE(input_stream.HasMoreData()); | 540 EXPECT_TRUE(input_stream.HasMoreData()); |
| 565 EXPECT_FALSE(input_stream.DecodeNextHuffmanString(&output)); | 541 EXPECT_FALSE(input_stream.DecodeNextHuffmanString(&output)); |
| 566 EXPECT_TRUE(input_stream.NeedMoreData()); | 542 EXPECT_TRUE(input_stream.NeedMoreData()); |
| 567 } | 543 } |
| 568 | 544 |
| 569 TEST(HpackInputStreamTest, PeekBitsAndConsume) { | 545 TEST(HpackInputStreamTest, PeekBitsAndConsume) { |
| 570 HpackInputStream input_stream(kLiteralBound, "\xad\xab\xad\xab\xad"); | 546 HpackInputStream input_stream("\xad\xab\xad\xab\xad"); |
| 571 | 547 |
| 572 uint32_t bits = 0; | 548 uint32_t bits = 0; |
| 573 size_t peeked_count = 0; | 549 size_t peeked_count = 0; |
| 574 | 550 |
| 575 // Read 0xad. | 551 // Read 0xad. |
| 576 EXPECT_TRUE(input_stream.PeekBits(&peeked_count, &bits)); | 552 EXPECT_TRUE(input_stream.PeekBits(&peeked_count, &bits)); |
| 577 EXPECT_EQ(bits32("10101101000000000000000000000000"), bits); | 553 EXPECT_EQ(bits32("10101101000000000000000000000000"), bits); |
| 578 EXPECT_EQ(8u, peeked_count); | 554 EXPECT_EQ(8u, peeked_count); |
| 579 | 555 |
| 580 // Read 0xab. | 556 // Read 0xab. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 EXPECT_EQ(bits32("10101101000000000000000000000000"), bits); | 600 EXPECT_EQ(bits32("10101101000000000000000000000000"), bits); |
| 625 EXPECT_EQ(8u, peeked_count); | 601 EXPECT_EQ(8u, peeked_count); |
| 626 | 602 |
| 627 input_stream.ConsumeBits(8); | 603 input_stream.ConsumeBits(8); |
| 628 EXPECT_FALSE(input_stream.HasMoreData()); | 604 EXPECT_FALSE(input_stream.HasMoreData()); |
| 629 } | 605 } |
| 630 | 606 |
| 631 TEST(HpackInputStreamTest, InitializePeekBits) { | 607 TEST(HpackInputStreamTest, InitializePeekBits) { |
| 632 { | 608 { |
| 633 // Empty input, peeked_count == 0 and bits == 0. | 609 // Empty input, peeked_count == 0 and bits == 0. |
| 634 HpackInputStream input_stream(kLiteralBound, ""); | 610 HpackInputStream input_stream(""); |
| 635 auto peeked_count_and_bits = input_stream.InitializePeekBits(); | 611 auto peeked_count_and_bits = input_stream.InitializePeekBits(); |
| 636 size_t peeked_count = peeked_count_and_bits.first; | 612 size_t peeked_count = peeked_count_and_bits.first; |
| 637 uint32_t bits = peeked_count_and_bits.second; | 613 uint32_t bits = peeked_count_and_bits.second; |
| 638 EXPECT_EQ(0u, peeked_count); | 614 EXPECT_EQ(0u, peeked_count); |
| 639 EXPECT_EQ(0u, bits); | 615 EXPECT_EQ(0u, bits); |
| 640 } | 616 } |
| 641 { | 617 { |
| 642 // One input byte, returns peeked_count == 8 and bits | 618 // One input byte, returns peeked_count == 8 and bits |
| 643 // has the input byte in its high order bits. | 619 // has the input byte in its high order bits. |
| 644 HpackInputStream input_stream(kLiteralBound, "\xfe"); | 620 HpackInputStream input_stream("\xfe"); |
| 645 auto peeked_count_and_bits = input_stream.InitializePeekBits(); | 621 auto peeked_count_and_bits = input_stream.InitializePeekBits(); |
| 646 size_t peeked_count = peeked_count_and_bits.first; | 622 size_t peeked_count = peeked_count_and_bits.first; |
| 647 uint32_t bits = peeked_count_and_bits.second; | 623 uint32_t bits = peeked_count_and_bits.second; |
| 648 EXPECT_EQ(8u, peeked_count); | 624 EXPECT_EQ(8u, peeked_count); |
| 649 EXPECT_EQ(0xfe000000, bits); | 625 EXPECT_EQ(0xfe000000, bits); |
| 650 input_stream.ConsumeBits(8); | 626 input_stream.ConsumeBits(8); |
| 651 EXPECT_FALSE(input_stream.HasMoreData()); | 627 EXPECT_FALSE(input_stream.HasMoreData()); |
| 652 } | 628 } |
| 653 { | 629 { |
| 654 // Two input bytes, returns peeked_count == 16 and bits | 630 // Two input bytes, returns peeked_count == 16 and bits |
| 655 // has the two input bytes in its high order bits. | 631 // has the two input bytes in its high order bits. |
| 656 HpackInputStream input_stream(kLiteralBound, "\xfe\xdc"); | 632 HpackInputStream input_stream("\xfe\xdc"); |
| 657 auto peeked_count_and_bits = input_stream.InitializePeekBits(); | 633 auto peeked_count_and_bits = input_stream.InitializePeekBits(); |
| 658 size_t peeked_count = peeked_count_and_bits.first; | 634 size_t peeked_count = peeked_count_and_bits.first; |
| 659 uint32_t bits = peeked_count_and_bits.second; | 635 uint32_t bits = peeked_count_and_bits.second; |
| 660 EXPECT_EQ(16u, peeked_count); | 636 EXPECT_EQ(16u, peeked_count); |
| 661 EXPECT_EQ(0xfedc0000, bits); | 637 EXPECT_EQ(0xfedc0000, bits); |
| 662 input_stream.ConsumeBits(16); | 638 input_stream.ConsumeBits(16); |
| 663 EXPECT_FALSE(input_stream.HasMoreData()); | 639 EXPECT_FALSE(input_stream.HasMoreData()); |
| 664 } | 640 } |
| 665 { | 641 { |
| 666 // Three input bytes, returns peeked_count == 24 and bits | 642 // Three input bytes, returns peeked_count == 24 and bits |
| 667 // has the three input bytes in its high order bits. | 643 // has the three input bytes in its high order bits. |
| 668 HpackInputStream input_stream(kLiteralBound, "\xab\xcd\xef"); | 644 HpackInputStream input_stream("\xab\xcd\xef"); |
| 669 auto peeked_count_and_bits = input_stream.InitializePeekBits(); | 645 auto peeked_count_and_bits = input_stream.InitializePeekBits(); |
| 670 size_t peeked_count = peeked_count_and_bits.first; | 646 size_t peeked_count = peeked_count_and_bits.first; |
| 671 uint32_t bits = peeked_count_and_bits.second; | 647 uint32_t bits = peeked_count_and_bits.second; |
| 672 EXPECT_EQ(24u, peeked_count); | 648 EXPECT_EQ(24u, peeked_count); |
| 673 EXPECT_EQ(0xabcdef00, bits); | 649 EXPECT_EQ(0xabcdef00, bits); |
| 674 input_stream.ConsumeBits(24); | 650 input_stream.ConsumeBits(24); |
| 675 EXPECT_FALSE(input_stream.HasMoreData()); | 651 EXPECT_FALSE(input_stream.HasMoreData()); |
| 676 } | 652 } |
| 677 { | 653 { |
| 678 // Four input bytes, returns peeked_count == 32 and bits | 654 // Four input bytes, returns peeked_count == 32 and bits |
| 679 // contains the four input bytes. | 655 // contains the four input bytes. |
| 680 HpackInputStream input_stream(kLiteralBound, "\xfe\xed\xdc\xcb"); | 656 HpackInputStream input_stream("\xfe\xed\xdc\xcb"); |
| 681 auto peeked_count_and_bits = input_stream.InitializePeekBits(); | 657 auto peeked_count_and_bits = input_stream.InitializePeekBits(); |
| 682 size_t peeked_count = peeked_count_and_bits.first; | 658 size_t peeked_count = peeked_count_and_bits.first; |
| 683 uint32_t bits = peeked_count_and_bits.second; | 659 uint32_t bits = peeked_count_and_bits.second; |
| 684 EXPECT_EQ(32u, peeked_count); | 660 EXPECT_EQ(32u, peeked_count); |
| 685 EXPECT_EQ(0xfeeddccb, bits); | 661 EXPECT_EQ(0xfeeddccb, bits); |
| 686 input_stream.ConsumeBits(32); | 662 input_stream.ConsumeBits(32); |
| 687 EXPECT_FALSE(input_stream.HasMoreData()); | 663 EXPECT_FALSE(input_stream.HasMoreData()); |
| 688 } | 664 } |
| 689 { | 665 { |
| 690 // Five input bytes, returns peeked_count == 32 and bits | 666 // Five input bytes, returns peeked_count == 32 and bits |
| 691 // contains the first four input bytes. | 667 // contains the first four input bytes. |
| 692 HpackInputStream input_stream(kLiteralBound, "\xfe\xed\xdc\xcb\xba"); | 668 HpackInputStream input_stream("\xfe\xed\xdc\xcb\xba"); |
| 693 auto peeked_count_and_bits = input_stream.InitializePeekBits(); | 669 auto peeked_count_and_bits = input_stream.InitializePeekBits(); |
| 694 size_t peeked_count = peeked_count_and_bits.first; | 670 size_t peeked_count = peeked_count_and_bits.first; |
| 695 uint32_t bits = peeked_count_and_bits.second; | 671 uint32_t bits = peeked_count_and_bits.second; |
| 696 EXPECT_EQ(32u, peeked_count); | 672 EXPECT_EQ(32u, peeked_count); |
| 697 EXPECT_EQ(0xfeeddccb, bits); | 673 EXPECT_EQ(0xfeeddccb, bits); |
| 698 EXPECT_TRUE(input_stream.HasMoreData()); | 674 EXPECT_TRUE(input_stream.HasMoreData()); |
| 699 | 675 |
| 700 // If we consume some bits, then InitializePeekBits will return no bits. | 676 // If we consume some bits, then InitializePeekBits will return no bits. |
| 701 input_stream.ConsumeBits(28); | 677 input_stream.ConsumeBits(28); |
| 702 peeked_count -= 28; | 678 peeked_count -= 28; |
| 703 bits <<= 28; | 679 bits <<= 28; |
| 704 EXPECT_EQ(0xb0000000, bits); | 680 EXPECT_EQ(0xb0000000, bits); |
| 705 | 681 |
| 706 EXPECT_SPDY_BUG(peeked_count_and_bits = input_stream.InitializePeekBits(), | 682 EXPECT_SPDY_BUG(peeked_count_and_bits = input_stream.InitializePeekBits(), |
| 707 "bit_offset_"); | 683 "bit_offset_"); |
| 708 EXPECT_EQ(0u, peeked_count_and_bits.first); | 684 EXPECT_EQ(0u, peeked_count_and_bits.first); |
| 709 EXPECT_EQ(0u, peeked_count_and_bits.second); | 685 EXPECT_EQ(0u, peeked_count_and_bits.second); |
| 710 EXPECT_TRUE(input_stream.HasMoreData()); | 686 EXPECT_TRUE(input_stream.HasMoreData()); |
| 711 | 687 |
| 712 // Can PeekBits, which will get us the last byte's bits. | 688 // Can PeekBits, which will get us the last byte's bits. |
| 713 EXPECT_TRUE(input_stream.PeekBits(&peeked_count, &bits)); | 689 EXPECT_TRUE(input_stream.PeekBits(&peeked_count, &bits)); |
| 714 EXPECT_EQ(12u, peeked_count); | 690 EXPECT_EQ(12u, peeked_count); |
| 715 EXPECT_EQ(0xbba00000, bits); | 691 EXPECT_EQ(0xbba00000, bits); |
| 716 input_stream.ConsumeBits(12); | 692 input_stream.ConsumeBits(12); |
| 717 EXPECT_FALSE(input_stream.HasMoreData()); | 693 EXPECT_FALSE(input_stream.HasMoreData()); |
| 718 } | 694 } |
| 719 } | 695 } |
| 720 | 696 |
| 721 TEST(HpackInputStreamTest, ConsumeByteRemainder) { | 697 TEST(HpackInputStreamTest, ConsumeByteRemainder) { |
| 722 HpackInputStream input_stream(kLiteralBound, "\xad\xab"); | 698 HpackInputStream input_stream("\xad\xab"); |
| 723 // Does nothing. | 699 // Does nothing. |
| 724 input_stream.ConsumeByteRemainder(); | 700 input_stream.ConsumeByteRemainder(); |
| 725 | 701 |
| 726 // Consumes one byte. | 702 // Consumes one byte. |
| 727 input_stream.ConsumeBits(3); | 703 input_stream.ConsumeBits(3); |
| 728 input_stream.ConsumeByteRemainder(); | 704 input_stream.ConsumeByteRemainder(); |
| 729 EXPECT_TRUE(input_stream.HasMoreData()); | 705 EXPECT_TRUE(input_stream.HasMoreData()); |
| 730 | 706 |
| 731 input_stream.ConsumeBits(6); | 707 input_stream.ConsumeBits(6); |
| 732 EXPECT_TRUE(input_stream.HasMoreData()); | 708 EXPECT_TRUE(input_stream.HasMoreData()); |
| 733 input_stream.ConsumeByteRemainder(); | 709 input_stream.ConsumeByteRemainder(); |
| 734 EXPECT_FALSE(input_stream.HasMoreData()); | 710 EXPECT_FALSE(input_stream.HasMoreData()); |
| 735 } | 711 } |
| 736 | 712 |
| 737 TEST(HpackInputStreamTest, IncompleteHeaderMatchPrefixAndConsume) { | 713 TEST(HpackInputStreamTest, IncompleteHeaderMatchPrefixAndConsume) { |
| 738 HpackInputStream input_stream(kLiteralBound, ""); | 714 HpackInputStream input_stream(""); |
| 739 HpackInputStreamPeer input_stream_peer(&input_stream); | 715 HpackInputStreamPeer input_stream_peer(&input_stream); |
| 740 EXPECT_FALSE(input_stream.MatchPrefixAndConsume(kIndexedOpcode)); | 716 EXPECT_FALSE(input_stream.MatchPrefixAndConsume(kIndexedOpcode)); |
| 741 EXPECT_EQ(0u, input_stream_peer.ParsedBytesCurrent()); | 717 EXPECT_EQ(0u, input_stream_peer.ParsedBytesCurrent()); |
| 742 EXPECT_TRUE(input_stream.NeedMoreData()); | 718 EXPECT_TRUE(input_stream.NeedMoreData()); |
| 743 } | 719 } |
| 744 | 720 |
| 745 TEST(HpackInputStreamTest, IncompleteHeaderDecodeNextUint32) { | 721 TEST(HpackInputStreamTest, IncompleteHeaderDecodeNextUint32) { |
| 746 // First byte only | 722 // First byte only |
| 747 HpackInputStream input_stream1(kLiteralBound, "\xff"); | 723 HpackInputStream input_stream1("\xff"); |
| 748 HpackInputStreamPeer input_stream1_peer(&input_stream1); | 724 HpackInputStreamPeer input_stream1_peer(&input_stream1); |
| 749 EXPECT_TRUE(input_stream1.MatchPrefixAndConsume(kIndexedOpcode)); | 725 EXPECT_TRUE(input_stream1.MatchPrefixAndConsume(kIndexedOpcode)); |
| 750 uint32_t result; | 726 uint32_t result; |
| 751 EXPECT_FALSE(input_stream1.DecodeNextUint32(&result)); | 727 EXPECT_FALSE(input_stream1.DecodeNextUint32(&result)); |
| 752 EXPECT_TRUE(input_stream1.NeedMoreData()); | 728 EXPECT_TRUE(input_stream1.NeedMoreData()); |
| 753 EXPECT_EQ(1u, input_stream1_peer.ParsedBytesCurrent()); | 729 EXPECT_EQ(1u, input_stream1_peer.ParsedBytesCurrent()); |
| 754 | 730 |
| 755 // No last byte | 731 // No last byte |
| 756 HpackInputStream input_stream2(kLiteralBound, "\xff\x80\x80\x80"); | 732 HpackInputStream input_stream2("\xff\x80\x80\x80"); |
| 757 HpackInputStreamPeer input_stream2_peer(&input_stream2); | 733 HpackInputStreamPeer input_stream2_peer(&input_stream2); |
| 758 EXPECT_TRUE(input_stream2.MatchPrefixAndConsume(kIndexedOpcode)); | 734 EXPECT_TRUE(input_stream2.MatchPrefixAndConsume(kIndexedOpcode)); |
| 759 EXPECT_FALSE(input_stream2.DecodeNextUint32(&result)); | 735 EXPECT_FALSE(input_stream2.DecodeNextUint32(&result)); |
| 760 EXPECT_TRUE(input_stream2.NeedMoreData()); | 736 EXPECT_TRUE(input_stream2.NeedMoreData()); |
| 761 EXPECT_EQ(4u, input_stream2_peer.ParsedBytesCurrent()); | 737 EXPECT_EQ(4u, input_stream2_peer.ParsedBytesCurrent()); |
| 762 | 738 |
| 763 // Error happens before finishing parsing. | 739 // Error happens before finishing parsing. |
| 764 HpackInputStream input_stream3(kLiteralBound, "\xff\xff\xff\xff\xff\xff\xff"); | 740 HpackInputStream input_stream3("\xff\xff\xff\xff\xff\xff\xff"); |
| 765 HpackInputStreamPeer input_stream3_peer(&input_stream3); | 741 HpackInputStreamPeer input_stream3_peer(&input_stream3); |
| 766 EXPECT_TRUE(input_stream3.MatchPrefixAndConsume(kIndexedOpcode)); | 742 EXPECT_TRUE(input_stream3.MatchPrefixAndConsume(kIndexedOpcode)); |
| 767 EXPECT_FALSE(input_stream3.DecodeNextUint32(&result)); | 743 EXPECT_FALSE(input_stream3.DecodeNextUint32(&result)); |
| 768 EXPECT_FALSE(input_stream3.NeedMoreData()); | 744 EXPECT_FALSE(input_stream3.NeedMoreData()); |
| 769 EXPECT_EQ(6u, input_stream3_peer.ParsedBytesCurrent()); | 745 EXPECT_EQ(6u, input_stream3_peer.ParsedBytesCurrent()); |
| 770 } | 746 } |
| 771 | 747 |
| 772 TEST(HpackInputStreamTest, IncompleteHeaderDecodeNextIdentityString) { | 748 TEST(HpackInputStreamTest, IncompleteHeaderDecodeNextIdentityString) { |
| 773 HpackInputStream input_stream1(kLiteralBound, "\x0estring litera"); | 749 HpackInputStream input_stream1("\x0estring litera"); |
| 774 HpackInputStreamPeer input_stream1_peer(&input_stream1); | 750 HpackInputStreamPeer input_stream1_peer(&input_stream1); |
| 775 StringPiece string_piece; | 751 StringPiece string_piece; |
| 776 EXPECT_FALSE(input_stream1.DecodeNextIdentityString(&string_piece)); | 752 EXPECT_FALSE(input_stream1.DecodeNextIdentityString(&string_piece)); |
| 777 // Only parsed first byte. | 753 // Only parsed first byte. |
| 778 EXPECT_EQ(1u, input_stream1_peer.ParsedBytesCurrent()); | 754 EXPECT_EQ(1u, input_stream1_peer.ParsedBytesCurrent()); |
| 779 EXPECT_TRUE(input_stream1.NeedMoreData()); | 755 EXPECT_TRUE(input_stream1.NeedMoreData()); |
| 780 | 756 |
| 781 HpackInputStream input_stream2(kLiteralBound, "\x0e"); | 757 HpackInputStream input_stream2("\x0e"); |
| 782 HpackInputStreamPeer input_stream2_peer(&input_stream2); | 758 HpackInputStreamPeer input_stream2_peer(&input_stream2); |
| 783 EXPECT_FALSE(input_stream2.DecodeNextIdentityString(&string_piece)); | 759 EXPECT_FALSE(input_stream2.DecodeNextIdentityString(&string_piece)); |
| 784 // Only parsed first byte. | 760 // Only parsed first byte. |
| 785 EXPECT_EQ(1u, input_stream2_peer.ParsedBytesCurrent()); | 761 EXPECT_EQ(1u, input_stream2_peer.ParsedBytesCurrent()); |
| 786 EXPECT_TRUE(input_stream2.NeedMoreData()); | 762 EXPECT_TRUE(input_stream2.NeedMoreData()); |
| 787 } | 763 } |
| 788 | 764 |
| 789 TEST(HpackInputStreamTest, IncompleteHeaderDecodeNextHuffmanString) { | 765 TEST(HpackInputStreamTest, IncompleteHeaderDecodeNextHuffmanString) { |
| 790 string output, input(a2b_hex(kEncodedHuffmanFixture)); | 766 string output, input(a2b_hex(kEncodedHuffmanFixture)); |
| 791 input.resize(input.size() - 1); // Remove last byte. | 767 input.resize(input.size() - 1); // Remove last byte. |
| 792 HpackInputStream input_stream1(arraysize(kDecodedHuffmanFixture) - 1, input); | 768 HpackInputStream input_stream1(input); |
| 793 HpackInputStreamPeer input_stream1_peer(&input_stream1); | 769 HpackInputStreamPeer input_stream1_peer(&input_stream1); |
| 794 EXPECT_FALSE(input_stream1.DecodeNextHuffmanString(&output)); | 770 EXPECT_FALSE(input_stream1.DecodeNextHuffmanString(&output)); |
| 795 EXPECT_EQ(1u, input_stream1_peer.ParsedBytesCurrent()); | 771 EXPECT_EQ(1u, input_stream1_peer.ParsedBytesCurrent()); |
| 796 EXPECT_TRUE(input_stream1.NeedMoreData()); | 772 EXPECT_TRUE(input_stream1.NeedMoreData()); |
| 797 | 773 |
| 798 input.erase(1, input.size()); // Remove all bytes except the first one. | 774 input.erase(1, input.size()); // Remove all bytes except the first one. |
| 799 HpackInputStream input_stream2(arraysize(kDecodedHuffmanFixture) - 1, input); | 775 HpackInputStream input_stream2(input); |
| 800 HpackInputStreamPeer input_stream2_peer(&input_stream2); | 776 HpackInputStreamPeer input_stream2_peer(&input_stream2); |
| 801 EXPECT_FALSE(input_stream2.DecodeNextHuffmanString(&output)); | 777 EXPECT_FALSE(input_stream2.DecodeNextHuffmanString(&output)); |
| 802 EXPECT_EQ(1u, input_stream2_peer.ParsedBytesCurrent()); | 778 EXPECT_EQ(1u, input_stream2_peer.ParsedBytesCurrent()); |
| 803 EXPECT_TRUE(input_stream2.NeedMoreData()); | 779 EXPECT_TRUE(input_stream2.NeedMoreData()); |
| 804 } | 780 } |
| 805 | 781 |
| 806 } // namespace test | 782 } // namespace test |
| 807 | 783 |
| 808 } // namespace net | 784 } // namespace net |
| OLD | NEW |