blob: d75e75b1a6ba1ec3c8098840e747c2101232b6d9 [file] [log] [blame]
#include "net/third_party/http2/hpack/huffman/hpack_huffman_encoder.h"
#include "base/macros.h"
#include "base/stl_util.h"
#include "net/third_party/http2/platform/api/http2_string_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace http2 {
namespace {
TEST(HuffmanEncoderTest, SpecRequestExamples) {
Http2String test_table[] = {
Http2HexDecode("f1e3c2e5f23a6ba0ab90f4ff"),
"www.example.com",
Http2HexDecode("a8eb10649cbf"),
"no-cache",
Http2HexDecode("25a849e95ba97d7f"),
"custom-key",
Http2HexDecode("25a849e95bb8e8b4bf"),
"custom-value",
};
for (size_t i = 0; i != base::size(test_table); i += 2) {
const Http2String& huffman_encoded(test_table[i]);
const Http2String& plain_string(test_table[i + 1]);
EXPECT_EQ(ExactHuffmanSize(plain_string), huffman_encoded.size());
EXPECT_EQ(BoundedHuffmanSize(plain_string), huffman_encoded.size());
Http2String buffer;
buffer.reserve();
HuffmanEncode(plain_string, &buffer);
EXPECT_EQ(buffer, huffman_encoded) << "Error encoding " << plain_string;
}
}
TEST(HuffmanEncoderTest, SpecResponseExamples) {
// clang-format off
Http2String test_table[] = {
Http2HexDecode("6402"),
"302",
Http2HexDecode("aec3771a4b"),
"private",
Http2HexDecode("d07abe941054d444a8200595040b8166"
"e082a62d1bff"),
"Mon, 21 Oct 2013 20:13:21 GMT",
Http2HexDecode("9d29ad171863c78f0b97c8e9ae82ae43"
"d3"),
"https://www.example.com",
Http2HexDecode("94e7821dd7f2e6c7b335dfdfcd5b3960"
"d5af27087f3672c1ab270fb5291f9587"
"316065c003ed4ee5b1063d5007"),
"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1",
};
// clang-format on
for (size_t i = 0; i != base::size(test_table); i += 2) {
const Http2String& huffman_encoded(test_table[i]);
const Http2String& plain_string(test_table[i + 1]);
EXPECT_EQ(ExactHuffmanSize(plain_string), huffman_encoded.size());
EXPECT_EQ(BoundedHuffmanSize(plain_string), huffman_encoded.size());
Http2String buffer;
buffer.reserve(huffman_encoded.size());
const size_t capacity = buffer.capacity();
HuffmanEncode(plain_string, &buffer);
EXPECT_EQ(buffer, huffman_encoded) << "Error encoding " << plain_string;
EXPECT_EQ(capacity, buffer.capacity());
}
}
TEST(HuffmanEncoderTest, EncodedSizeAgreesWithEncodeString) {
Http2String test_table[] = {
"",
"Mon, 21 Oct 2013 20:13:21 GMT",
"https://www.example.com",
"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1",
Http2String(1, '\0'),
Http2String("foo\0bar", 7),
Http2String(256, '\0'),
};
// Modify last |test_table| entry to cover all codes.
for (size_t i = 0; i != 256; ++i) {
test_table[base::size(test_table) - 1][i] = static_cast<char>(i);
}
for (size_t i = 0; i != base::size(test_table); ++i) {
const Http2String& plain_string = test_table[i];
Http2String huffman_encoded;
HuffmanEncode(plain_string, &huffman_encoded);
EXPECT_EQ(huffman_encoded.size(), ExactHuffmanSize(plain_string));
EXPECT_LE(BoundedHuffmanSize(plain_string), plain_string.size());
EXPECT_LE(BoundedHuffmanSize(plain_string), ExactHuffmanSize(plain_string));
}
}
} // namespace
} // namespace http2