| #include "quiche/balsa/balsa_headers_sequence.h" | |
| #include <memory> | |
| #include <utility> | |
| #include "quiche/balsa/balsa_headers.h" | |
| #include "quiche/common/platform/api/quiche_test.h" | |
| namespace quiche { | |
| namespace test { | |
| namespace { | |
| TEST(BalsaHeadersSequenceTest, Initial) { | |
| BalsaHeadersSequence sequence; | |
| EXPECT_FALSE(sequence.HasNext()); | |
| EXPECT_EQ(sequence.Next(), nullptr); | |
| EXPECT_TRUE(sequence.IsEmpty()); | |
| } | |
| TEST(BalsaHeadersSequenceTest, Basic) { | |
| BalsaHeadersSequence sequence; | |
| auto headers_one = std::make_unique<BalsaHeaders>(); | |
| headers_one->AppendHeader("one", "fish"); | |
| sequence.Append(std::move(headers_one)); | |
| EXPECT_TRUE(sequence.HasNext()); | |
| EXPECT_FALSE(sequence.IsEmpty()); | |
| auto headers_two = std::make_unique<BalsaHeaders>(); | |
| headers_two->AppendHeader("two", "fish"); | |
| sequence.Append(std::move(headers_two)); | |
| EXPECT_TRUE(sequence.HasNext()); | |
| EXPECT_FALSE(sequence.IsEmpty()); | |
| const BalsaHeaders* headers = sequence.Next(); | |
| ASSERT_NE(headers, nullptr); | |
| EXPECT_TRUE(headers->HasHeader("one")); | |
| EXPECT_TRUE(sequence.HasNext()); | |
| EXPECT_FALSE(sequence.IsEmpty()); | |
| headers = sequence.Next(); | |
| ASSERT_NE(headers, nullptr); | |
| EXPECT_TRUE(headers->HasHeader("two")); | |
| EXPECT_FALSE(sequence.HasNext()); | |
| EXPECT_FALSE(sequence.IsEmpty()); | |
| EXPECT_EQ(sequence.Next(), nullptr); | |
| } | |
| TEST(BalsaHeadersSequenceTest, Clear) { | |
| BalsaHeadersSequence sequence; | |
| auto headers_one = std::make_unique<BalsaHeaders>(); | |
| headers_one->AppendHeader("one", "fish"); | |
| sequence.Append(std::move(headers_one)); | |
| EXPECT_TRUE(sequence.HasNext()); | |
| EXPECT_FALSE(sequence.IsEmpty()); | |
| auto headers_two = std::make_unique<BalsaHeaders>(); | |
| headers_two->AppendHeader("two", "fish"); | |
| sequence.Append(std::move(headers_two)); | |
| EXPECT_TRUE(sequence.HasNext()); | |
| EXPECT_FALSE(sequence.IsEmpty()); | |
| sequence.Clear(); | |
| EXPECT_FALSE(sequence.HasNext()); | |
| EXPECT_EQ(sequence.Next(), nullptr); | |
| EXPECT_TRUE(sequence.IsEmpty()); | |
| } | |
| TEST(BalsaHeadersSequenceTest, PeekNext) { | |
| BalsaHeadersSequence sequence; | |
| EXPECT_EQ(sequence.PeekNext(), nullptr); | |
| auto headers_one = std::make_unique<BalsaHeaders>(); | |
| headers_one->AppendHeader("one", "fish"); | |
| sequence.Append(std::move(headers_one)); | |
| EXPECT_TRUE(sequence.HasNext()); | |
| const BalsaHeaders* headers = sequence.PeekNext(); | |
| ASSERT_NE(headers, nullptr); | |
| EXPECT_TRUE(headers->HasHeader("one")); | |
| EXPECT_TRUE(sequence.HasNext()); | |
| // Continuing to peek should not advance the sequence. | |
| EXPECT_EQ(sequence.PeekNext(), headers); | |
| // Adding more headers should not matter for peeking. | |
| auto headers_two = std::make_unique<BalsaHeaders>(); | |
| headers_two->AppendHeader("two", "fish"); | |
| sequence.Append(std::move(headers_two)); | |
| EXPECT_TRUE(sequence.HasNext()); | |
| EXPECT_EQ(sequence.PeekNext(), headers); | |
| headers = sequence.Next(); | |
| ASSERT_NE(headers, nullptr); | |
| EXPECT_TRUE(headers->HasHeader("one")); | |
| EXPECT_TRUE(sequence.HasNext()); | |
| headers = sequence.PeekNext(); | |
| ASSERT_NE(headers, nullptr); | |
| EXPECT_TRUE(headers->HasHeader("two")); | |
| EXPECT_TRUE(sequence.HasNext()); | |
| headers = sequence.Next(); | |
| ASSERT_NE(headers, nullptr); | |
| EXPECT_TRUE(headers->HasHeader("two")); | |
| EXPECT_FALSE(sequence.HasNext()); | |
| EXPECT_EQ(sequence.PeekNext(), nullptr); | |
| } | |
| TEST(BalsaHeadersSequenceTest, CanRetainValidReference) { | |
| BalsaHeadersSequence sequence; | |
| auto headers = std::make_unique<BalsaHeaders>(); | |
| headers->AppendHeader("one", "fish"); | |
| // This reference should still be valid, even after transferring ownership to | |
| // the sequence. | |
| BalsaHeaders* headers_ptr = headers.get(); | |
| sequence.Append(std::move(headers)); | |
| ASSERT_TRUE(sequence.HasNext()); | |
| EXPECT_EQ(sequence.Next(), headers_ptr); | |
| } | |
| } // namespace | |
| } // namespace test | |
| } // namespace quiche |