blob: 8446c6471bc9dc2b6d0a4a5757dad3e02cb3dea8 [file] [log] [blame]
// 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/third_party/http2/hpack/varint/hpack_varint_encoder.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace http2 {
namespace test {
namespace {
TEST(HpackVarintEncoderTest, Done) {
HpackVarintEncoder varint_encoder;
EXPECT_FALSE(varint_encoder.IsEncodingInProgress());
}
// Encode integers that each fit in their respective prefixes.
TEST(HpackVarintEncoderTest, Shorts) {
HpackVarintEncoder varint_encoder;
uint8_t high_bits1 = 0b10101000;
uint8_t prefix_length1 = 3;
uint64_t varint1 = 6;
EXPECT_EQ(0b10101110,
varint_encoder.StartEncoding(high_bits1, prefix_length1, varint1));
EXPECT_FALSE(varint_encoder.IsEncodingInProgress());
uint8_t high_bits2 = 0b00000000;
uint8_t prefix_length2 = 7;
uint64_t varint2 = 91;
EXPECT_EQ(0b01011011,
varint_encoder.StartEncoding(high_bits2, prefix_length2, varint2));
EXPECT_FALSE(varint_encoder.IsEncodingInProgress());
uint8_t high_bits3 = 0b10100000;
uint8_t prefix_length3 = 4;
uint64_t varint3 = 13;
EXPECT_EQ(0b10101101,
varint_encoder.StartEncoding(high_bits3, prefix_length3, varint3));
EXPECT_FALSE(varint_encoder.IsEncodingInProgress());
}
// Encode integers that not fit in their respective prefixes.
TEST(HpackVarintEncoderTest, Long) {
HpackVarintEncoder varint_encoder;
uint8_t high_bits1 = 0b10101000;
uint8_t prefix_length1 = 3;
uint64_t varint1 = 13;
EXPECT_EQ(0b10101111,
varint_encoder.StartEncoding(high_bits1, prefix_length1, varint1));
EXPECT_TRUE(varint_encoder.IsEncodingInProgress());
Http2String output1;
EXPECT_EQ(1u, varint_encoder.ResumeEncoding(1, &output1));
ASSERT_EQ(1u, output1.size());
EXPECT_EQ(0b00000110, output1[0]);
EXPECT_FALSE(varint_encoder.IsEncodingInProgress());
uint8_t high_bits2 = 0b01000000;
uint8_t prefix_length2 = 5;
uint64_t varint2 = 100;
EXPECT_EQ(0b01011111,
varint_encoder.StartEncoding(high_bits2, prefix_length2, varint2));
EXPECT_TRUE(varint_encoder.IsEncodingInProgress());
Http2String output2;
EXPECT_EQ(1u, varint_encoder.ResumeEncoding(1, &output2));
ASSERT_EQ(1u, output2.size());
EXPECT_EQ(0b01000101, output2[0]);
EXPECT_FALSE(varint_encoder.IsEncodingInProgress());
}
// Make sure that the encoder outputs the last byte even when it is zero.
TEST(HpackVarintEncoderTest, LastByteIsZero) {
HpackVarintEncoder varint_encoder;
uint8_t high_bits1 = 0b10101000;
uint8_t prefix_length1 = 3;
uint64_t varint1 = 7;
EXPECT_EQ(0b10101111,
varint_encoder.StartEncoding(high_bits1, prefix_length1, varint1));
EXPECT_TRUE(varint_encoder.IsEncodingInProgress());
Http2String output1;
EXPECT_EQ(1u, varint_encoder.ResumeEncoding(1, &output1));
ASSERT_EQ(1u, output1.size());
EXPECT_EQ(0b00000000, output1[0]);
EXPECT_FALSE(varint_encoder.IsEncodingInProgress());
uint8_t high_bits2 = 0b01100000;
uint8_t prefix_length2 = 5;
uint64_t varint2 = 31;
EXPECT_EQ(0b01111111,
varint_encoder.StartEncoding(high_bits2, prefix_length2, varint2));
EXPECT_TRUE(varint_encoder.IsEncodingInProgress());
Http2String output2;
EXPECT_EQ(1u, varint_encoder.ResumeEncoding(1, &output2));
ASSERT_EQ(1u, output2.size());
EXPECT_EQ(0b00000000, output2[0]);
EXPECT_FALSE(varint_encoder.IsEncodingInProgress());
}
} // namespace
} // namespace test
} // namespace http2