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 |