blob: 9ece65d9673f7a2c97c3bab9da3f522c0c46bc3a [file] [log] [blame]
// Copyright (c) 2019 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/quiche/src/quic/core/qpack/value_splitting_header_list.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
namespace quic {
namespace test {
namespace {
using ::testing::ElementsAre;
using ::testing::Pair;
TEST(ValueSplittingHeaderListTest, Comparison) {
spdy::SpdyHeaderBlock block;
block["foo"] = QuicStringPiece("bar\0baz", 7);
block["baz"] = "qux";
ValueSplittingHeaderList headers(&block);
ValueSplittingHeaderList::const_iterator it1 = headers.begin();
const int kEnd = 4;
for (int i = 0; i < kEnd; ++i) {
// Compare to begin().
if (i == 0) {
EXPECT_TRUE(it1 == headers.begin());
EXPECT_TRUE(headers.begin() == it1);
EXPECT_FALSE(it1 != headers.begin());
EXPECT_FALSE(headers.begin() != it1);
} else {
EXPECT_FALSE(it1 == headers.begin());
EXPECT_FALSE(headers.begin() == it1);
EXPECT_TRUE(it1 != headers.begin());
EXPECT_TRUE(headers.begin() != it1);
}
// Compare to end().
if (i == kEnd - 1) {
EXPECT_TRUE(it1 == headers.end());
EXPECT_TRUE(headers.end() == it1);
EXPECT_FALSE(it1 != headers.end());
EXPECT_FALSE(headers.end() != it1);
} else {
EXPECT_FALSE(it1 == headers.end());
EXPECT_FALSE(headers.end() == it1);
EXPECT_TRUE(it1 != headers.end());
EXPECT_TRUE(headers.end() != it1);
}
// Compare to another iterator walking through the container.
ValueSplittingHeaderList::const_iterator it2 = headers.begin();
for (int j = 0; j < kEnd; ++j) {
if (i == j) {
EXPECT_TRUE(it1 == it2);
EXPECT_FALSE(it1 != it2);
} else {
EXPECT_FALSE(it1 == it2);
EXPECT_TRUE(it1 != it2);
}
++it2;
}
++it1;
}
}
TEST(ValueSplittingHeaderListTest, Empty) {
spdy::SpdyHeaderBlock block;
ValueSplittingHeaderList headers(&block);
EXPECT_THAT(headers, ElementsAre());
EXPECT_EQ(headers.begin(), headers.end());
}
TEST(ValueSplittingHeaderListTest, Simple) {
spdy::SpdyHeaderBlock block;
block["foo"] = "bar";
block["baz"] = "qux";
ValueSplittingHeaderList headers(&block);
EXPECT_THAT(headers, ElementsAre(Pair("foo", "bar"), Pair("baz", "qux")));
EXPECT_NE(headers.begin(), headers.end());
}
TEST(ValueSplittingHeaderListTest, EmptyValue) {
spdy::SpdyHeaderBlock block;
block["foo"] = "";
ValueSplittingHeaderList headers(&block);
EXPECT_THAT(headers, ElementsAre(Pair("foo", "")));
}
TEST(ValueSplittingHeaderListTest, SimpleSplit) {
spdy::SpdyHeaderBlock block;
block["foo"] = QuicStringPiece("bar\0baz", 7);
block["baz"] = QuicStringPiece("foo\0foo", 7);
ValueSplittingHeaderList headers(&block);
EXPECT_THAT(headers, ElementsAre(Pair("foo", "bar"), Pair("foo", "baz"),
Pair("baz", "foo"), Pair("baz", "foo")));
}
TEST(ValueSplittingHeaderListTest, EmptyFragments) {
spdy::SpdyHeaderBlock block;
block["foo"] = QuicStringPiece("\0", 1);
block["bar"] = QuicStringPiece("foo\0", 4);
block["baz"] = QuicStringPiece("\0bar", 4);
block["qux"] = QuicStringPiece("\0foobar\0", 8);
ValueSplittingHeaderList headers(&block);
EXPECT_THAT(
headers,
ElementsAre(Pair("foo", ""), Pair("foo", ""), Pair("bar", "foo"),
Pair("bar", ""), Pair("baz", ""), Pair("baz", "bar"),
Pair("qux", ""), Pair("qux", "foobar"), Pair("qux", "")));
}
} // namespace
} // namespace test
} // namespace quic