blob: de30a4b9b581f32c144523845680df9b71f77445 [file] [log] [blame]
// Copyright (c) 2018 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/quic/core/qpack/qpack_encoder_stream_sender.h"
#include "net/third_party/quic/platform/api/quic_test.h"
#include "net/third_party/quic/platform/api/quic_text_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace quic {
namespace test {
namespace {
class TestSendingDelegate : public QpackEncoderStreamSender::Delegate {
public:
~TestSendingDelegate() override = default;
void Write(QuicStringPiece data) override {
EXPECT_FALSE(data.empty());
buffer_.append(data.data(), data.size());
}
const QuicString& buffer() { return buffer_; }
private:
QuicString buffer_;
};
class QpackEncoderStreamSenderTest : public QuicTest {
protected:
QpackEncoderStreamSenderTest() : stream_(&delegate_) {}
QpackEncoderStreamSender* stream() { return &stream_; }
const QuicString& buffer() { return delegate_.buffer(); }
private:
TestSendingDelegate delegate_;
QpackEncoderStreamSender stream_;
};
TEST_F(QpackEncoderStreamSenderTest, InsertWithNameReference) {
// Static, index fits in prefix, empty value.
stream()->SendInsertWithNameReference(true, 5, "");
// Static, index fits in prefix, Huffman encoded value.
stream()->SendInsertWithNameReference(true, 2, "foo");
// Not static, index does not fit in prefix, not Huffman encoded value.
stream()->SendInsertWithNameReference(false, 137, "bar");
// Value length does not fit in prefix.
// 'Z' would be Huffman encoded to 8 bits, so no Huffman encoding is used.
stream()->SendInsertWithNameReference(false, 42, QuicString(127, 'Z'));
EXPECT_EQ(
QuicTextUtils::HexDecode(
"c500"
"c28294e7"
"bf4a03626172"
"aa7f005a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"
"5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"
"5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"
"5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"),
buffer());
}
TEST_F(QpackEncoderStreamSenderTest, InsertWithoutNameReference) {
// Empty name and value.
stream()->SendInsertWithoutNameReference("", "");
// Huffman encoded short strings.
stream()->SendInsertWithoutNameReference("bar", "bar");
// Not Huffman encoded short strings.
stream()->SendInsertWithoutNameReference("foo", "foo");
// Not Huffman encoded long strings; length does not fit on prefix.
// 'Z' would be Huffman encoded to 8 bits, so no Huffman encoding is used.
stream()->SendInsertWithoutNameReference(QuicString(31, 'Z'),
QuicString(127, 'Z'));
EXPECT_EQ(
QuicTextUtils::HexDecode(
"4000"
"4362617203626172"
"6294e78294e7"
"5f005a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a7f"
"005a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"
"5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"
"5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"
"5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"),
buffer());
}
TEST_F(QpackEncoderStreamSenderTest, Duplicate) {
// Small index fits in prefix.
stream()->SendDuplicate(17);
// Large index requires two extension bytes.
stream()->SendDuplicate(500);
EXPECT_EQ(QuicTextUtils::HexDecode("111fd503"), buffer());
}
TEST_F(QpackEncoderStreamSenderTest, DynamicTableSizeUpdate) {
// Small max size fits in prefix.
stream()->SendDynamicTableSizeUpdate(17);
// Large max size requires two extension bytes.
stream()->SendDynamicTableSizeUpdate(500);
EXPECT_EQ(QuicTextUtils::HexDecode("313fd503"), buffer());
}
} // namespace
} // namespace test
} // namespace quic