Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: net/spdy/hpack/hpack_input_stream_test.cc

Issue 2026593002: Remove limit on individual hpack string literals. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove unused include. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/spdy/hpack/hpack_input_stream.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « net/spdy/hpack/hpack_input_stream.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698