| Index: net/http2/hpack/huffman/http2_hpack_huffman_decoder_test.cc
|
| diff --git a/net/http2/hpack/huffman/http2_hpack_huffman_decoder_test.cc b/net/http2/hpack/huffman/http2_hpack_huffman_decoder_test.cc
|
| deleted file mode 100644
|
| index 3ad47351b54be3ee72a12e876ca323676f5096b0..0000000000000000000000000000000000000000
|
| --- a/net/http2/hpack/huffman/http2_hpack_huffman_decoder_test.cc
|
| +++ /dev/null
|
| @@ -1,292 +0,0 @@
|
| -// Copyright 2016 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/http2/hpack/huffman/http2_hpack_huffman_decoder.h"
|
| -
|
| -// Tests of HpackHuffmanDecoder and HuffmanBitBuffer.
|
| -
|
| -#include <iostream>
|
| -#include <string>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/bind_helpers.h"
|
| -#include "base/macros.h"
|
| -#include "base/strings/string_piece.h"
|
| -#include "net/http2/decoder/decode_buffer.h"
|
| -#include "net/http2/decoder/decode_status.h"
|
| -#include "net/http2/tools/failure.h"
|
| -#include "net/http2/tools/random_decoder_test.h"
|
| -#include "net/spdy/spdy_test_utils.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using ::testing::AssertionResult;
|
| -using ::testing::AssertionSuccess;
|
| -using base::StringPiece;
|
| -using std::string;
|
| -
|
| -namespace net {
|
| -namespace test {
|
| -namespace {
|
| -
|
| -TEST(HuffmanBitBufferTest, Reset) {
|
| - HuffmanBitBuffer bb;
|
| - EXPECT_TRUE(bb.IsEmpty());
|
| - EXPECT_TRUE(bb.InputProperlyTerminated());
|
| - EXPECT_EQ(bb.count(), 0u);
|
| - EXPECT_EQ(bb.free_count(), 64u);
|
| - EXPECT_EQ(bb.value(), 0u);
|
| -}
|
| -
|
| -TEST(HuffmanBitBufferTest, AppendBytesAligned) {
|
| - string s;
|
| - s.push_back('\x11');
|
| - s.push_back('\x22');
|
| - s.push_back('\x33');
|
| - StringPiece sp(s);
|
| -
|
| - HuffmanBitBuffer bb;
|
| - sp.remove_prefix(bb.AppendBytes(sp));
|
| - EXPECT_TRUE(sp.empty());
|
| - EXPECT_FALSE(bb.IsEmpty()) << bb;
|
| - EXPECT_FALSE(bb.InputProperlyTerminated());
|
| - EXPECT_EQ(bb.count(), 24u) << bb;
|
| - EXPECT_EQ(bb.free_count(), 40u) << bb;
|
| - EXPECT_EQ(bb.value(), HuffmanAccumulator(0x112233) << 40) << bb;
|
| -
|
| - s.clear();
|
| - s.push_back('\x44');
|
| - sp = s;
|
| -
|
| - sp.remove_prefix(bb.AppendBytes(sp));
|
| - EXPECT_TRUE(sp.empty());
|
| - EXPECT_EQ(bb.count(), 32u) << bb;
|
| - EXPECT_EQ(bb.free_count(), 32u) << bb;
|
| - EXPECT_EQ(bb.value(), HuffmanAccumulator(0x11223344) << 32) << bb;
|
| -
|
| - s.clear();
|
| - s.push_back('\x55');
|
| - s.push_back('\x66');
|
| - s.push_back('\x77');
|
| - s.push_back('\x88');
|
| - s.push_back('\x99');
|
| - sp = s;
|
| -
|
| - sp.remove_prefix(bb.AppendBytes(sp));
|
| - EXPECT_EQ(sp.size(), 1u);
|
| - EXPECT_EQ('\x99', sp[0]);
|
| - EXPECT_EQ(bb.count(), 64u) << bb;
|
| - EXPECT_EQ(bb.free_count(), 0u) << bb;
|
| - EXPECT_EQ(bb.value(), HuffmanAccumulator(0x1122334455667788LL)) << bb;
|
| -
|
| - sp.remove_prefix(bb.AppendBytes(sp));
|
| - EXPECT_EQ(sp.size(), 1u);
|
| - EXPECT_EQ('\x99', sp[0]);
|
| - EXPECT_EQ(bb.count(), 64u) << bb;
|
| - EXPECT_EQ(bb.free_count(), 0u) << bb;
|
| - EXPECT_EQ(bb.value(), HuffmanAccumulator(0x1122334455667788LL)) << bb;
|
| -}
|
| -
|
| -TEST(HuffmanBitBufferTest, ConsumeBits) {
|
| - string s;
|
| - s.push_back('\x11');
|
| - s.push_back('\x22');
|
| - s.push_back('\x33');
|
| - StringPiece sp(s);
|
| -
|
| - HuffmanBitBuffer bb;
|
| - sp.remove_prefix(bb.AppendBytes(sp));
|
| - EXPECT_TRUE(sp.empty());
|
| -
|
| - bb.ConsumeBits(1);
|
| - EXPECT_EQ(bb.count(), 23u) << bb;
|
| - EXPECT_EQ(bb.free_count(), 41u) << bb;
|
| - EXPECT_EQ(bb.value(), HuffmanAccumulator(0x112233) << 41) << bb;
|
| -
|
| - bb.ConsumeBits(20);
|
| - EXPECT_EQ(bb.count(), 3u) << bb;
|
| - EXPECT_EQ(bb.free_count(), 61u) << bb;
|
| - EXPECT_EQ(bb.value(), HuffmanAccumulator(0x3) << 61) << bb;
|
| -}
|
| -
|
| -TEST(HuffmanBitBufferTest, AppendBytesUnaligned) {
|
| - string s;
|
| - s.push_back('\x11');
|
| - s.push_back('\x22');
|
| - s.push_back('\x33');
|
| - s.push_back('\x44');
|
| - s.push_back('\x55');
|
| - s.push_back('\x66');
|
| - s.push_back('\x77');
|
| - s.push_back('\x88');
|
| - s.push_back('\x99');
|
| - s.push_back('\xaa');
|
| - s.push_back('\xbb');
|
| - s.push_back('\xcc');
|
| - s.push_back('\xdd');
|
| - StringPiece sp(s);
|
| -
|
| - HuffmanBitBuffer bb;
|
| - sp.remove_prefix(bb.AppendBytes(sp));
|
| - EXPECT_EQ(sp.size(), 5u);
|
| - EXPECT_FALSE(bb.InputProperlyTerminated());
|
| -
|
| - bb.ConsumeBits(15);
|
| - EXPECT_EQ(bb.count(), 49u) << bb;
|
| - EXPECT_EQ(bb.free_count(), 15u) << bb;
|
| -
|
| - HuffmanAccumulator expected(0x1122334455667788);
|
| - expected <<= 15;
|
| - EXPECT_EQ(bb.value(), expected);
|
| -
|
| - sp.remove_prefix(bb.AppendBytes(sp));
|
| - EXPECT_EQ(sp.size(), 4u);
|
| - EXPECT_EQ(bb.count(), 57u) << bb;
|
| - EXPECT_EQ(bb.free_count(), 7u) << bb;
|
| -
|
| - expected |= (HuffmanAccumulator(0x99) << 7);
|
| - EXPECT_EQ(bb.value(), expected) << bb << std::hex
|
| - << "\n actual: " << bb.value()
|
| - << "\n expected: " << expected;
|
| -}
|
| -
|
| -enum class DecoderChoice { IF_TREE, SHORT_CODE };
|
| -
|
| -class HpackHuffmanDecoderTest
|
| - : public RandomDecoderTest,
|
| - public ::testing::WithParamInterface<DecoderChoice> {
|
| - protected:
|
| - HpackHuffmanDecoderTest() {
|
| - // The decoder may return true, and its accumulator may be empty, at
|
| - // many boundaries while decoding, and yet the whole string hasn't
|
| - // been decoded.
|
| - stop_decode_on_done_ = false;
|
| - }
|
| -
|
| - DecodeStatus StartDecoding(DecodeBuffer* b) override {
|
| - input_bytes_seen_ = 0;
|
| - output_buffer_.clear();
|
| - decoder_.Reset();
|
| - return ResumeDecoding(b);
|
| - }
|
| -
|
| - DecodeStatus ResumeDecoding(DecodeBuffer* b) override {
|
| - input_bytes_seen_ += b->Remaining();
|
| - StringPiece sp(b->cursor(), b->Remaining());
|
| - if (DecodeFragment(sp)) {
|
| - b->AdvanceCursor(b->Remaining());
|
| - // Successfully decoded (or buffered) the bytes in StringPiece.
|
| - EXPECT_LE(input_bytes_seen_, input_bytes_expected_);
|
| - // Have we reached the end of the encoded string?
|
| - if (input_bytes_expected_ == input_bytes_seen_) {
|
| - if (decoder_.InputProperlyTerminated()) {
|
| - return DecodeStatus::kDecodeDone;
|
| - } else {
|
| - return DecodeStatus::kDecodeError;
|
| - }
|
| - }
|
| - return DecodeStatus::kDecodeInProgress;
|
| - }
|
| - return DecodeStatus::kDecodeError;
|
| - }
|
| -
|
| - bool DecodeFragment(StringPiece sp) {
|
| - switch (GetParam()) {
|
| - case DecoderChoice::IF_TREE:
|
| - return decoder_.DecodeWithIfTreeAndStruct(sp, &output_buffer_);
|
| - case DecoderChoice::SHORT_CODE:
|
| - return decoder_.DecodeShortCodesFirst(sp, &output_buffer_);
|
| - }
|
| -
|
| - NOTREACHED();
|
| - return false;
|
| - }
|
| -
|
| - AssertionResult ValidatorForHuffmanDecodeAndValidateSeveralWays(
|
| - StringPiece expected_plain) {
|
| - VERIFY_EQ(output_buffer_.size(), expected_plain.size());
|
| - VERIFY_EQ(output_buffer_, expected_plain);
|
| - return AssertionSuccess();
|
| - }
|
| -
|
| - AssertionResult HuffmanDecodeAndValidateSeveralWays(
|
| - StringPiece encoded,
|
| - StringPiece expected_plain) {
|
| - input_bytes_expected_ = encoded.size();
|
| - DecodeBuffer db(encoded);
|
| - bool return_non_zero_on_first = false;
|
| - return DecodeAndValidateSeveralWays(
|
| - &db, return_non_zero_on_first,
|
| - ValidateDoneAndEmpty(
|
| - base::Bind(&HpackHuffmanDecoderTest::
|
| - ValidatorForHuffmanDecodeAndValidateSeveralWays,
|
| - base::Unretained(this), expected_plain)));
|
| - }
|
| -
|
| - HpackHuffmanDecoder decoder_;
|
| - string output_buffer_;
|
| - size_t input_bytes_seen_;
|
| - size_t input_bytes_expected_;
|
| -};
|
| -INSTANTIATE_TEST_CASE_P(AllDecoders,
|
| - HpackHuffmanDecoderTest,
|
| - ::testing::Values(DecoderChoice::IF_TREE,
|
| - DecoderChoice::SHORT_CODE));
|
| -
|
| -TEST_P(HpackHuffmanDecoderTest, SpecRequestExamples) {
|
| - HpackHuffmanDecoder decoder;
|
| - string test_table[] = {
|
| - a2b_hex("f1e3c2e5f23a6ba0ab90f4ff"),
|
| - "www.example.com",
|
| - a2b_hex("a8eb10649cbf"),
|
| - "no-cache",
|
| - a2b_hex("25a849e95ba97d7f"),
|
| - "custom-key",
|
| - a2b_hex("25a849e95bb8e8b4bf"),
|
| - "custom-value",
|
| - };
|
| - for (size_t i = 0; i != arraysize(test_table); i += 2) {
|
| - const string& huffman_encoded(test_table[i]);
|
| - const string& plain_string(test_table[i + 1]);
|
| - string buffer;
|
| - decoder.Reset();
|
| - EXPECT_TRUE(decoder.Decode(huffman_encoded, &buffer)) << decoder;
|
| - EXPECT_TRUE(decoder.InputProperlyTerminated()) << decoder;
|
| - EXPECT_EQ(buffer, plain_string);
|
| - }
|
| -}
|
| -
|
| -TEST_P(HpackHuffmanDecoderTest, SpecResponseExamples) {
|
| - HpackHuffmanDecoder decoder;
|
| - // clang-format off
|
| - string test_table[] = {
|
| - a2b_hex("6402"),
|
| - "302",
|
| - a2b_hex("aec3771a4b"),
|
| - "private",
|
| - a2b_hex("d07abe941054d444a8200595040b8166"
|
| - "e082a62d1bff"),
|
| - "Mon, 21 Oct 2013 20:13:21 GMT",
|
| - a2b_hex("9d29ad171863c78f0b97c8e9ae82ae43"
|
| - "d3"),
|
| - "https://www.example.com",
|
| - a2b_hex("94e7821dd7f2e6c7b335dfdfcd5b3960"
|
| - "d5af27087f3672c1ab270fb5291f9587"
|
| - "316065c003ed4ee5b1063d5007"),
|
| - "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1",
|
| - };
|
| - // clang-format on
|
| - for (size_t i = 0; i != arraysize(test_table); i += 2) {
|
| - const string& huffman_encoded(test_table[i]);
|
| - const string& plain_string(test_table[i + 1]);
|
| - string buffer;
|
| - decoder.Reset();
|
| - EXPECT_TRUE(decoder.Decode(huffman_encoded, &buffer)) << decoder;
|
| - EXPECT_TRUE(decoder.InputProperlyTerminated()) << decoder;
|
| - EXPECT_EQ(buffer, plain_string);
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace test
|
| -} // namespace net
|
|
|