| // 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 "http2/hpack/decoder/hpack_string_collector.h" | |
| #include <stddef.h> | |
| #include <iosfwd> | |
| #include <ostream> | |
| #include "absl/strings/escaping.h" | |
| #include "absl/strings/str_cat.h" | |
| #include "http2/platform/api/http2_test_helpers.h" | |
| #include "common/platform/api/quiche_test.h" | |
| namespace http2 { | |
| namespace test { | |
| namespace { | |
| std::ostream& operator<<(std::ostream& out, | |
| HpackStringCollector::CollectorState v) { | |
| switch (v) { | |
| case HpackStringCollector::CollectorState::kGenesis: | |
| return out << "kGenesis"; | |
| case HpackStringCollector::CollectorState::kStarted: | |
| return out << "kStarted"; | |
| case HpackStringCollector::CollectorState::kEnded: | |
| return out << "kEnded"; | |
| } | |
| return out << "UnknownCollectorState"; | |
| } | |
| } // namespace | |
| HpackStringCollector::HpackStringCollector() { | |
| Clear(); | |
| } | |
| HpackStringCollector::HpackStringCollector(const std::string& str, bool huffman) | |
| : s(str), len(str.size()), huffman_encoded(huffman), state(kEnded) {} | |
| void HpackStringCollector::Clear() { | |
| s = ""; | |
| len = 0; | |
| huffman_encoded = false; | |
| state = kGenesis; | |
| } | |
| bool HpackStringCollector::IsClear() const { | |
| return s.empty() && len == 0 && huffman_encoded == false && state == kGenesis; | |
| } | |
| bool HpackStringCollector::IsInProgress() const { | |
| return state == kStarted; | |
| } | |
| bool HpackStringCollector::HasEnded() const { | |
| return state == kEnded; | |
| } | |
| void HpackStringCollector::OnStringStart(bool huffman, size_t length) { | |
| EXPECT_TRUE(IsClear()) << ToString(); | |
| state = kStarted; | |
| huffman_encoded = huffman; | |
| len = length; | |
| } | |
| void HpackStringCollector::OnStringData(const char* data, size_t length) { | |
| absl::string_view sp(data, length); | |
| EXPECT_TRUE(IsInProgress()) << ToString(); | |
| EXPECT_LE(sp.size(), len) << ToString(); | |
| absl::StrAppend(&s, sp); | |
| EXPECT_LE(s.size(), len) << ToString(); | |
| } | |
| void HpackStringCollector::OnStringEnd() { | |
| EXPECT_TRUE(IsInProgress()) << ToString(); | |
| EXPECT_EQ(s.size(), len) << ToString(); | |
| state = kEnded; | |
| } | |
| ::testing::AssertionResult HpackStringCollector::Collected( | |
| absl::string_view str, | |
| bool is_huffman_encoded) const { | |
| VERIFY_TRUE(HasEnded()); | |
| VERIFY_EQ(str.size(), len); | |
| VERIFY_EQ(is_huffman_encoded, huffman_encoded); | |
| VERIFY_EQ(str, s); | |
| return ::testing::AssertionSuccess(); | |
| } | |
| std::string HpackStringCollector::ToString() const { | |
| std::stringstream ss; | |
| ss << *this; | |
| return ss.str(); | |
| } | |
| bool operator==(const HpackStringCollector& a, const HpackStringCollector& b) { | |
| return a.s == b.s && a.len == b.len && | |
| a.huffman_encoded == b.huffman_encoded && a.state == b.state; | |
| } | |
| bool operator!=(const HpackStringCollector& a, const HpackStringCollector& b) { | |
| return !(a == b); | |
| } | |
| std::ostream& operator<<(std::ostream& out, const HpackStringCollector& v) { | |
| out << "HpackStringCollector(state=" << v.state; | |
| if (v.state == HpackStringCollector::kGenesis) { | |
| return out << ")"; | |
| } | |
| if (v.huffman_encoded) { | |
| out << ", Huffman Encoded"; | |
| } | |
| out << ", Length=" << v.len; | |
| if (!v.s.empty() && v.len != v.s.size()) { | |
| out << " (" << v.s.size() << ")"; | |
| } | |
| return out << ", String=\"" << absl::CHexEscape(v.s) << "\")"; | |
| } | |
| } // namespace test | |
| } // namespace http2 |