Deletes classes in //third_party/spdy/core that are only referenced by unit tests.
Protected by deleting unused code; not protected.
PiperOrigin-RevId: 596095895
diff --git a/build/source_list.bzl b/build/source_list.bzl
index bd02a2f..fd8192c 100644
--- a/build/source_list.bzl
+++ b/build/source_list.bzl
@@ -387,10 +387,7 @@
"spdy/core/spdy_frame_builder.h",
"spdy/core/spdy_framer.h",
"spdy/core/spdy_headers_handler_interface.h",
- "spdy/core/spdy_intrusive_list.h",
"spdy/core/spdy_no_op_visitor.h",
- "spdy/core/spdy_pinnable_buffer_piece.h",
- "spdy/core/spdy_prefixed_buffer_reader.h",
"spdy/core/spdy_protocol.h",
"spdy/core/zero_copy_output_buffer.h",
"web_transport/complete_buffer_visitor.h",
@@ -682,8 +679,6 @@
"spdy/core/spdy_frame_builder.cc",
"spdy/core/spdy_framer.cc",
"spdy/core/spdy_no_op_visitor.cc",
- "spdy/core/spdy_pinnable_buffer_piece.cc",
- "spdy/core/spdy_prefixed_buffer_reader.cc",
"spdy/core/spdy_protocol.cc",
"web_transport/complete_buffer_visitor.cc",
"web_transport/encapsulated/encapsulated_web_transport.cc",
@@ -1313,9 +1308,6 @@
"spdy/core/spdy_alt_svc_wire_format_test.cc",
"spdy/core/spdy_frame_builder_test.cc",
"spdy/core/spdy_framer_test.cc",
- "spdy/core/spdy_intrusive_list_test.cc",
- "spdy/core/spdy_pinnable_buffer_piece_test.cc",
- "spdy/core/spdy_prefixed_buffer_reader_test.cc",
"spdy/core/spdy_protocol_test.cc",
"web_transport/encapsulated/encapsulated_web_transport_test.cc",
"web_transport/web_transport_headers_test.cc",
diff --git a/build/source_list.gni b/build/source_list.gni
index 49ae31f..d3fb7a0 100644
--- a/build/source_list.gni
+++ b/build/source_list.gni
@@ -387,10 +387,7 @@
"src/quiche/spdy/core/spdy_frame_builder.h",
"src/quiche/spdy/core/spdy_framer.h",
"src/quiche/spdy/core/spdy_headers_handler_interface.h",
- "src/quiche/spdy/core/spdy_intrusive_list.h",
"src/quiche/spdy/core/spdy_no_op_visitor.h",
- "src/quiche/spdy/core/spdy_pinnable_buffer_piece.h",
- "src/quiche/spdy/core/spdy_prefixed_buffer_reader.h",
"src/quiche/spdy/core/spdy_protocol.h",
"src/quiche/spdy/core/zero_copy_output_buffer.h",
"src/quiche/web_transport/complete_buffer_visitor.h",
@@ -682,8 +679,6 @@
"src/quiche/spdy/core/spdy_frame_builder.cc",
"src/quiche/spdy/core/spdy_framer.cc",
"src/quiche/spdy/core/spdy_no_op_visitor.cc",
- "src/quiche/spdy/core/spdy_pinnable_buffer_piece.cc",
- "src/quiche/spdy/core/spdy_prefixed_buffer_reader.cc",
"src/quiche/spdy/core/spdy_protocol.cc",
"src/quiche/web_transport/complete_buffer_visitor.cc",
"src/quiche/web_transport/encapsulated/encapsulated_web_transport.cc",
@@ -1314,9 +1309,6 @@
"src/quiche/spdy/core/spdy_alt_svc_wire_format_test.cc",
"src/quiche/spdy/core/spdy_frame_builder_test.cc",
"src/quiche/spdy/core/spdy_framer_test.cc",
- "src/quiche/spdy/core/spdy_intrusive_list_test.cc",
- "src/quiche/spdy/core/spdy_pinnable_buffer_piece_test.cc",
- "src/quiche/spdy/core/spdy_prefixed_buffer_reader_test.cc",
"src/quiche/spdy/core/spdy_protocol_test.cc",
"src/quiche/web_transport/encapsulated/encapsulated_web_transport_test.cc",
"src/quiche/web_transport/web_transport_headers_test.cc",
diff --git a/build/source_list.json b/build/source_list.json
index 252c803..69eeccd 100644
--- a/build/source_list.json
+++ b/build/source_list.json
@@ -386,10 +386,7 @@
"quiche/spdy/core/spdy_frame_builder.h",
"quiche/spdy/core/spdy_framer.h",
"quiche/spdy/core/spdy_headers_handler_interface.h",
- "quiche/spdy/core/spdy_intrusive_list.h",
"quiche/spdy/core/spdy_no_op_visitor.h",
- "quiche/spdy/core/spdy_pinnable_buffer_piece.h",
- "quiche/spdy/core/spdy_prefixed_buffer_reader.h",
"quiche/spdy/core/spdy_protocol.h",
"quiche/spdy/core/zero_copy_output_buffer.h",
"quiche/web_transport/complete_buffer_visitor.h",
@@ -681,8 +678,6 @@
"quiche/spdy/core/spdy_frame_builder.cc",
"quiche/spdy/core/spdy_framer.cc",
"quiche/spdy/core/spdy_no_op_visitor.cc",
- "quiche/spdy/core/spdy_pinnable_buffer_piece.cc",
- "quiche/spdy/core/spdy_prefixed_buffer_reader.cc",
"quiche/spdy/core/spdy_protocol.cc",
"quiche/web_transport/complete_buffer_visitor.cc",
"quiche/web_transport/encapsulated/encapsulated_web_transport.cc",
@@ -1313,9 +1308,6 @@
"quiche/spdy/core/spdy_alt_svc_wire_format_test.cc",
"quiche/spdy/core/spdy_frame_builder_test.cc",
"quiche/spdy/core/spdy_framer_test.cc",
- "quiche/spdy/core/spdy_intrusive_list_test.cc",
- "quiche/spdy/core/spdy_pinnable_buffer_piece_test.cc",
- "quiche/spdy/core/spdy_prefixed_buffer_reader_test.cc",
"quiche/spdy/core/spdy_protocol_test.cc",
"quiche/web_transport/encapsulated/encapsulated_web_transport_test.cc",
"quiche/web_transport/web_transport_headers_test.cc"
diff --git a/quiche/spdy/core/spdy_intrusive_list.h b/quiche/spdy/core/spdy_intrusive_list.h
deleted file mode 100644
index 3ba8f8e..0000000
--- a/quiche/spdy/core/spdy_intrusive_list.h
+++ /dev/null
@@ -1,342 +0,0 @@
-// 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.
-
-#ifndef QUICHE_SPDY_CORE_SPDY_INTRUSIVE_LIST_H_
-#define QUICHE_SPDY_CORE_SPDY_INTRUSIVE_LIST_H_
-
-// A SpdyIntrusiveList<> is a doubly-linked list where the link pointers are
-// embedded in the elements. They are circularly linked making insertion and
-// removal into a known position constant time and branch-free operations.
-//
-// Usage is similar to an STL list<> where feasible, but there are important
-// differences. First and foremost, the elements must derive from the
-// SpdyIntrusiveLink<> base class:
-//
-// struct Foo : public SpdyIntrusiveLink<Foo> {
-// // ...
-// }
-//
-// SpdyIntrusiveList<Foo> l;
-// l.push_back(new Foo);
-// l.push_front(new Foo);
-// l.erase(&l.front());
-// l.erase(&l.back());
-//
-// Intrusive lists are primarily useful when you would have considered embedding
-// link pointers in your class directly for space or performance reasons. An
-// SpdyIntrusiveLink<> is the size of 2 pointers, usually 16 bytes on 64-bit
-// systems. Intrusive lists do not perform memory allocation (unlike the STL
-// list<> class) and thus may use less memory than list<>. In particular, if the
-// list elements are pointers to objects, using a list<> would perform an extra
-// memory allocation for each list node structure, while an SpdyIntrusiveList<>
-// would not.
-//
-// Note that SpdyIntrusiveLink is exempt from the C++ style guide's limitations
-// on multiple inheritance, so it's fine to inherit from both SpdyIntrusiveLink
-// and a base class, even if the base class is not a pure interface.
-//
-// Because the list pointers are embedded in the objects stored in an
-// SpdyIntrusiveList<>, erasing an item from a list is constant time. Consider
-// the following:
-//
-// map<string,Foo> foo_map;
-// list<Foo*> foo_list;
-//
-// foo_list.push_back(&foo_map["bar"]);
-// foo_list.erase(&foo_map["bar"]); // Compile error!
-//
-// The problem here is that a Foo* doesn't know where on foo_list it resides,
-// so removal requires iteration over the list. Various tricks can be performed
-// to overcome this. For example, a foo_list::iterator can be stored inside of
-// the Foo object. But at that point you'd be better off using an
-// SpdyIntrusiveList<>:
-//
-// map<string,Foo> foo_map;
-// SpdyIntrusiveList<Foo> foo_list;
-//
-// foo_list.push_back(&foo_map["bar"]);
-// foo_list.erase(&foo_map["bar"]); // Yeah!
-//
-// Note that SpdyIntrusiveLists come with a few limitations. The primary
-// limitation is that the SpdyIntrusiveLink<> base class is not copyable or
-// assignable. The result is that STL algorithms which mutate the order of
-// iterators, such as reverse() and unique(), will not work by default with
-// SpdyIntrusiveLists. In order to allow these algorithms to work you'll need to
-// define swap() and/or operator= for your class.
-//
-// Another limitation is that the SpdyIntrusiveList<> structure itself is not
-// copyable or assignable since an item/link combination can only exist on one
-// SpdyIntrusiveList<> at a time. This limitation is a result of the link
-// pointers for an item being intrusive in the item itself. For example, the
-// following will not compile:
-//
-// FooList a;
-// FooList b(a); // no copy constructor
-// b = a; // no assignment operator
-//
-// The similar STL code does work since the link pointers are external to the
-// item:
-//
-// list<int*> a;
-// a.push_back(new int);
-// list<int*> b(a);
-// QUICHE_CHECK(a.front() == b.front());
-//
-// Note that SpdyIntrusiveList::size() runs in O(N) time.
-
-#include <stddef.h>
-
-#include <cstddef>
-#include <iterator>
-
-#include "quiche/common/platform/api/quiche_export.h"
-
-namespace spdy {
-
-template <typename T, typename ListID>
-class SpdyIntrusiveList;
-
-template <typename T, typename ListID = void>
-class QUICHE_EXPORT SpdyIntrusiveLink {
- protected:
- // We declare the constructor protected so that only derived types and the
- // befriended list can construct this.
- SpdyIntrusiveLink() : next_(nullptr), prev_(nullptr) {}
-
-#ifndef SWIG
- SpdyIntrusiveLink(const SpdyIntrusiveLink&) = delete;
- SpdyIntrusiveLink& operator=(const SpdyIntrusiveLink&) = delete;
-#endif // SWIG
-
- private:
- // We befriend the matching list type so that it can manipulate the links
- // while they are kept private from others.
- friend class SpdyIntrusiveList<T, ListID>;
-
- // Encapsulates the logic to convert from a link to its derived type.
- T* cast_to_derived() { return static_cast<T*>(this); }
- const T* cast_to_derived() const { return static_cast<const T*>(this); }
-
- SpdyIntrusiveLink* next_;
- SpdyIntrusiveLink* prev_;
-};
-
-template <typename T, typename ListID = void>
-class QUICHE_EXPORT SpdyIntrusiveList {
- template <typename QualifiedT, typename QualifiedLinkT>
- class iterator_impl;
-
- public:
- typedef T value_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
-
- typedef SpdyIntrusiveLink<T, ListID> link_type;
- typedef iterator_impl<T, link_type> iterator;
- typedef iterator_impl<const T, const link_type> const_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
-
- SpdyIntrusiveList() { clear(); }
- // After the move constructor the moved-from list will be empty.
- //
- // NOTE: There is no move assign operator (for now).
- // The reason is that at the moment 'clear()' does not unlink the nodes.
- // It makes is_linked() return true when it should return false.
- // If such node is removed from the list (e.g. from its destructor), or is
- // added to another list - a memory corruption will occur.
- // Admitedly the destructor does not unlink the nodes either, but move-assign
- // will likely make the problem more prominent.
-#ifndef SWIG
- SpdyIntrusiveList(SpdyIntrusiveList&& src) noexcept {
- clear();
- if (src.empty()) return;
- sentinel_link_.next_ = src.sentinel_link_.next_;
- sentinel_link_.prev_ = src.sentinel_link_.prev_;
- // Fix head and tail nodes of the list.
- sentinel_link_.prev_->next_ = &sentinel_link_;
- sentinel_link_.next_->prev_ = &sentinel_link_;
- src.clear();
- }
-#endif // SWIG
-
- iterator begin() { return iterator(sentinel_link_.next_); }
- const_iterator begin() const { return const_iterator(sentinel_link_.next_); }
- iterator end() { return iterator(&sentinel_link_); }
- const_iterator end() const { return const_iterator(&sentinel_link_); }
- reverse_iterator rbegin() { return reverse_iterator(end()); }
- const_reverse_iterator rbegin() const {
- return const_reverse_iterator(end());
- }
- reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rend() const {
- return const_reverse_iterator(begin());
- }
-
- bool empty() const { return (sentinel_link_.next_ == &sentinel_link_); }
- // This runs in O(N) time.
- size_type size() const { return std::distance(begin(), end()); }
- size_type max_size() const { return size_type(-1); }
-
- reference front() { return *begin(); }
- const_reference front() const { return *begin(); }
- reference back() { return *(--end()); }
- const_reference back() const { return *(--end()); }
-
- static iterator insert(iterator position, T* obj) {
- return insert_link(position.link(), obj);
- }
- void push_front(T* obj) { insert(begin(), obj); }
- void push_back(T* obj) { insert(end(), obj); }
-
- static iterator erase(T* obj) {
- link_type* obj_link = obj;
- // Fix up the next and previous links for the previous and next objects.
- obj_link->next_->prev_ = obj_link->prev_;
- obj_link->prev_->next_ = obj_link->next_;
- // Zero out the next and previous links for the removed item. This will
- // cause any future attempt to remove the item from the list to cause a
- // crash instead of possibly corrupting the list structure.
- link_type* next_link = obj_link->next_;
- obj_link->next_ = nullptr;
- obj_link->prev_ = nullptr;
- return iterator(next_link);
- }
-
- static iterator erase(iterator position) {
- return erase(position.operator->());
- }
- void pop_front() { erase(begin()); }
- void pop_back() { erase(--end()); }
-
- // Check whether the given element is linked into some list. Note that this
- // does *not* check whether it is linked into a particular list.
- // Also, if clear() is used to clear the containing list, is_linked() will
- // still return true even though obj is no longer in any list.
- static bool is_linked(const T* obj) {
- return obj->link_type::next_ != nullptr;
- }
-
- void clear() {
- sentinel_link_.next_ = sentinel_link_.prev_ = &sentinel_link_;
- }
- void swap(SpdyIntrusiveList& x) {
- SpdyIntrusiveList tmp;
- tmp.splice(tmp.begin(), *this);
- this->splice(this->begin(), x);
- x.splice(x.begin(), tmp);
- }
-
- void splice(iterator pos, SpdyIntrusiveList& src) {
- splice(pos, src.begin(), src.end());
- }
-
- void splice(iterator pos, iterator i) { splice(pos, i, std::next(i)); }
-
- void splice(iterator pos, iterator first, iterator last) {
- if (first == last) return;
-
- link_type* const last_prev = last.link()->prev_;
-
- // Remove from the source.
- first.link()->prev_->next_ = last.operator->();
- last.link()->prev_ = first.link()->prev_;
-
- // Attach to the destination.
- first.link()->prev_ = pos.link()->prev_;
- pos.link()->prev_->next_ = first.operator->();
- last_prev->next_ = pos.operator->();
- pos.link()->prev_ = last_prev;
- }
-
- private:
- static iterator insert_link(link_type* next_link, T* obj) {
- link_type* obj_link = obj;
- obj_link->next_ = next_link;
- link_type* const initial_next_prev = next_link->prev_;
- obj_link->prev_ = initial_next_prev;
- initial_next_prev->next_ = obj_link;
- next_link->prev_ = obj_link;
- return iterator(obj_link);
- }
-
- // The iterator implementation is parameterized on a potentially qualified
- // variant of T and the matching qualified link type. Essentially, QualifiedT
- // will either be 'T' or 'const T', the latter for a const_iterator.
- template <typename QualifiedT, typename QualifiedLinkT>
- class QUICHE_EXPORT iterator_impl {
- public:
- using iterator_category = std::bidirectional_iterator_tag;
- using value_type = QualifiedT;
- using difference_type = std::ptrdiff_t;
- using pointer = QualifiedT*;
- using reference = QualifiedT&;
-
- iterator_impl() = default;
- iterator_impl(QualifiedLinkT* link) : link_(link) {}
- iterator_impl(const iterator_impl& x) = default;
- iterator_impl& operator=(const iterator_impl& x) = default;
-
- // Allow converting and comparing across iterators where the pointer
- // assignment and comparisons (respectively) are allowed.
- template <typename U, typename V>
- iterator_impl(const iterator_impl<U, V>& x) : link_(x.link_) {}
- template <typename U, typename V>
- bool operator==(const iterator_impl<U, V>& x) const {
- return link_ == x.link_;
- }
- template <typename U, typename V>
- bool operator!=(const iterator_impl<U, V>& x) const {
- return link_ != x.link_;
- }
-
- reference operator*() const { return *operator->(); }
- pointer operator->() const { return link_->cast_to_derived(); }
-
- QualifiedLinkT* link() const { return link_; }
-
-#ifndef SWIG // SWIG can't wrap these operator overloads.
- iterator_impl& operator++() {
- link_ = link_->next_;
- return *this;
- }
- iterator_impl operator++(int /*unused*/) {
- iterator_impl tmp = *this;
- ++*this;
- return tmp;
- }
- iterator_impl& operator--() {
- link_ = link_->prev_;
- return *this;
- }
- iterator_impl operator--(int /*unused*/) {
- iterator_impl tmp = *this;
- --*this;
- return tmp;
- }
-#endif // SWIG
-
- private:
- // Ensure iterators can access other iterators node directly.
- template <typename U, typename V>
- friend class iterator_impl;
-
- QualifiedLinkT* link_ = nullptr;
- };
-
- // This bare link acts as the sentinel node.
- link_type sentinel_link_;
-
- // These are private and undefined to prevent copying and assigning.
- SpdyIntrusiveList(const SpdyIntrusiveList&);
- void operator=(const SpdyIntrusiveList&);
-};
-
-} // namespace spdy
-
-#endif // QUICHE_SPDY_CORE_SPDY_INTRUSIVE_LIST_H_
diff --git a/quiche/spdy/core/spdy_intrusive_list_test.cc b/quiche/spdy/core/spdy_intrusive_list_test.cc
deleted file mode 100644
index 750608f..0000000
--- a/quiche/spdy/core/spdy_intrusive_list_test.cc
+++ /dev/null
@@ -1,420 +0,0 @@
-// 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 "quiche/spdy/core/spdy_intrusive_list.h"
-
-#include <algorithm>
-#include <iterator>
-#include <list>
-#include <string>
-#include <utility>
-
-#include "quiche/common/platform/api/quiche_test.h"
-
-namespace spdy {
-namespace test {
-
-struct ListId2 {};
-
-struct TestItem : public SpdyIntrusiveLink<TestItem>,
- public SpdyIntrusiveLink<TestItem, ListId2> {
- int n;
-};
-typedef SpdyIntrusiveList<TestItem> TestList;
-typedef std::list<TestItem *> CanonicalList;
-
-void swap(TestItem &a, TestItem &b) {
- using std::swap;
- swap(a.n, b.n);
-}
-
-class IntrusiveListTest : public quiche::test::QuicheTest {
- protected:
- void CheckLists() {
- CheckLists(l1, ll1);
- if (quiche::test::QuicheTest::HasFailure()) return;
- CheckLists(l2, ll2);
- }
-
- void CheckLists(const TestList &list_a, const CanonicalList &list_b) {
- ASSERT_EQ(list_a.size(), list_b.size());
- TestList::const_iterator it_a = list_a.begin();
- CanonicalList::const_iterator it_b = list_b.begin();
- while (it_a != list_a.end()) {
- EXPECT_EQ(&*it_a++, *it_b++);
- }
- EXPECT_EQ(list_a.end(), it_a);
- EXPECT_EQ(list_b.end(), it_b);
- }
-
- void PrepareLists(int num_elems_1, int num_elems_2 = 0) {
- FillLists(&l1, &ll1, e, num_elems_1);
- FillLists(&l2, &ll2, e + num_elems_1, num_elems_2);
- }
-
- void FillLists(TestList *list_a, CanonicalList *list_b, TestItem *elems,
- int num_elems) {
- list_a->clear();
- list_b->clear();
- for (int i = 0; i < num_elems; ++i) {
- list_a->push_back(elems + i);
- list_b->push_back(elems + i);
- }
- CheckLists(*list_a, *list_b);
- }
-
- TestItem e[10];
- TestList l1, l2;
- CanonicalList ll1, ll2;
-};
-
-TEST(NewIntrusiveListTest, Basic) {
- TestList list1;
-
- EXPECT_EQ(sizeof(SpdyIntrusiveLink<TestItem>), sizeof(void *) * 2);
-
- for (int i = 0; i < 10; ++i) {
- TestItem *e = new TestItem;
- e->n = i;
- list1.push_front(e);
- }
- EXPECT_EQ(list1.size(), 10u);
-
- // Verify we can reverse a list because we defined swap for TestItem.
- std::reverse(list1.begin(), list1.end());
- EXPECT_EQ(list1.size(), 10u);
-
- // Check both const and non-const forward iteration.
- const TestList &clist1 = list1;
- int i = 0;
- TestList::iterator iter = list1.begin();
- for (; iter != list1.end(); ++iter, ++i) {
- EXPECT_EQ(iter->n, i);
- }
- EXPECT_EQ(iter, clist1.end());
- EXPECT_NE(iter, clist1.begin());
- i = 0;
- iter = list1.begin();
- for (; iter != list1.end(); ++iter, ++i) {
- EXPECT_EQ(iter->n, i);
- }
- EXPECT_EQ(iter, clist1.end());
- EXPECT_NE(iter, clist1.begin());
-
- EXPECT_EQ(list1.front().n, 0);
- EXPECT_EQ(list1.back().n, 9);
-
- // Verify we can swap 2 lists.
- TestList list2;
- list2.swap(list1);
- EXPECT_EQ(list1.size(), 0u);
- EXPECT_EQ(list2.size(), 10u);
-
- // Check both const and non-const reverse iteration.
- const TestList &clist2 = list2;
- TestList::reverse_iterator riter = list2.rbegin();
- i = 9;
- for (; riter != list2.rend(); ++riter, --i) {
- EXPECT_EQ(riter->n, i);
- }
- EXPECT_EQ(riter, clist2.rend());
- EXPECT_NE(riter, clist2.rbegin());
-
- riter = list2.rbegin();
- i = 9;
- for (; riter != list2.rend(); ++riter, --i) {
- EXPECT_EQ(riter->n, i);
- }
- EXPECT_EQ(riter, clist2.rend());
- EXPECT_NE(riter, clist2.rbegin());
-
- while (!list2.empty()) {
- TestItem *e = &list2.front();
- list2.pop_front();
- delete e;
- }
-}
-
-TEST(NewIntrusiveListTest, Erase) {
- TestList l;
- TestItem *e[10];
-
- // Create a list with 10 items.
- for (int i = 0; i < 10; ++i) {
- e[i] = new TestItem;
- l.push_front(e[i]);
- }
-
- // Test that erase works.
- for (int i = 0; i < 10; ++i) {
- EXPECT_EQ(l.size(), (10u - i));
-
- TestList::iterator iter = l.erase(e[i]);
- EXPECT_NE(iter, TestList::iterator(e[i]));
-
- EXPECT_EQ(l.size(), (10u - i - 1));
- delete e[i];
- }
-}
-
-TEST(NewIntrusiveListTest, Insert) {
- TestList l;
- TestList::iterator iter = l.end();
- TestItem *e[10];
-
- // Create a list with 10 items.
- for (int i = 9; i >= 0; --i) {
- e[i] = new TestItem;
- iter = l.insert(iter, e[i]);
- EXPECT_EQ(&(*iter), e[i]);
- }
-
- EXPECT_EQ(l.size(), 10u);
-
- // Verify insertion order.
- iter = l.begin();
- for (TestItem *item : e) {
- EXPECT_EQ(&(*iter), item);
- iter = l.erase(item);
- delete item;
- }
-}
-
-TEST(NewIntrusiveListTest, Move) {
- // Move contructible.
-
- { // Move-construct from an empty list.
- TestList src;
- TestList dest(std::move(src));
- EXPECT_TRUE(dest.empty());
- }
-
- { // Move-construct from a single item list.
- TestItem e;
- TestList src;
- src.push_front(&e);
-
- TestList dest(std::move(src));
- EXPECT_TRUE(src.empty()); // NOLINT bugprone-use-after-move
- ASSERT_THAT(dest.size(), 1);
- EXPECT_THAT(&dest.front(), &e);
- EXPECT_THAT(&dest.back(), &e);
- }
-
- { // Move-construct from a list with multiple items.
- TestItem items[10];
- TestList src;
- for (TestItem &e : items) src.push_back(&e);
-
- TestList dest(std::move(src));
- EXPECT_TRUE(src.empty()); // NOLINT bugprone-use-after-move
- // Verify the items on the destination list.
- ASSERT_THAT(dest.size(), 10);
- int i = 0;
- for (TestItem &e : dest) {
- EXPECT_THAT(&e, &items[i++]) << " for index " << i;
- }
- }
-}
-
-TEST(NewIntrusiveListTest, StaticInsertErase) {
- TestList l;
- TestItem e[2];
- TestList::iterator i = l.begin();
- TestList::insert(i, &e[0]);
- TestList::insert(&e[0], &e[1]);
- TestList::erase(&e[0]);
- TestList::erase(TestList::iterator(&e[1]));
- EXPECT_TRUE(l.empty());
-}
-
-TEST_F(IntrusiveListTest, Splice) {
- // We verify that the contents of this secondary list aren't affected by any
- // of the splices.
- SpdyIntrusiveList<TestItem, ListId2> secondary_list;
- for (int i = 0; i < 3; ++i) {
- secondary_list.push_back(&e[i]);
- }
-
- // Test the basic cases:
- // - The lists range from 0 to 2 elements.
- // - The insertion point ranges from begin() to end()
- // - The transfered range has multiple sizes and locations in the source.
- for (int l1_count = 0; l1_count < 3; ++l1_count) {
- for (int l2_count = 0; l2_count < 3; ++l2_count) {
- for (int pos = 0; pos <= l1_count; ++pos) {
- for (int first = 0; first <= l2_count; ++first) {
- for (int last = first; last <= l2_count; ++last) {
- PrepareLists(l1_count, l2_count);
-
- l1.splice(std::next(l1.begin(), pos), std::next(l2.begin(), first),
- std::next(l2.begin(), last));
- ll1.splice(std::next(ll1.begin(), pos), ll2,
- std::next(ll2.begin(), first),
- std::next(ll2.begin(), last));
-
- CheckLists();
-
- ASSERT_EQ(3u, secondary_list.size());
- for (int i = 0; i < 3; ++i) {
- EXPECT_EQ(&e[i], &*std::next(secondary_list.begin(), i));
- }
- }
- }
- }
- }
- }
-}
-
-// Build up a set of classes which form "challenging" type hierarchies to use
-// with an SpdyIntrusiveList.
-struct BaseLinkId {};
-struct DerivedLinkId {};
-
-struct AbstractBase : public SpdyIntrusiveLink<AbstractBase, BaseLinkId> {
- virtual ~AbstractBase() = 0;
- virtual std::string name() { return "AbstractBase"; }
-};
-AbstractBase::~AbstractBase() {}
-struct DerivedClass : public SpdyIntrusiveLink<DerivedClass, DerivedLinkId>,
- public AbstractBase {
- ~DerivedClass() override {}
- std::string name() override { return "DerivedClass"; }
-};
-struct VirtuallyDerivedBaseClass : public virtual AbstractBase {
- ~VirtuallyDerivedBaseClass() override = 0;
- std::string name() override { return "VirtuallyDerivedBaseClass"; }
-};
-VirtuallyDerivedBaseClass::~VirtuallyDerivedBaseClass() {}
-struct VirtuallyDerivedClassA
- : public SpdyIntrusiveLink<VirtuallyDerivedClassA, DerivedLinkId>,
- public virtual VirtuallyDerivedBaseClass {
- ~VirtuallyDerivedClassA() override {}
- std::string name() override { return "VirtuallyDerivedClassA"; }
-};
-struct NonceClass {
- virtual ~NonceClass() {}
- int data_;
-};
-struct VirtuallyDerivedClassB
- : public SpdyIntrusiveLink<VirtuallyDerivedClassB, DerivedLinkId>,
- public virtual NonceClass,
- public virtual VirtuallyDerivedBaseClass {
- ~VirtuallyDerivedClassB() override {}
- std::string name() override { return "VirtuallyDerivedClassB"; }
-};
-struct VirtuallyDerivedClassC
- : public SpdyIntrusiveLink<VirtuallyDerivedClassC, DerivedLinkId>,
- public virtual AbstractBase,
- public virtual NonceClass,
- public virtual VirtuallyDerivedBaseClass {
- ~VirtuallyDerivedClassC() override {}
- std::string name() override { return "VirtuallyDerivedClassC"; }
-};
-
-// Test for multiple layers between the element type and the link.
-namespace templated_base_link {
-template <typename T>
-struct AbstractBase : public SpdyIntrusiveLink<T> {
- virtual ~AbstractBase() = 0;
-};
-template <typename T>
-AbstractBase<T>::~AbstractBase() {}
-struct DerivedClass : public AbstractBase<DerivedClass> {
- int n;
-};
-} // namespace templated_base_link
-
-TEST(NewIntrusiveListTest, HandleInheritanceHierarchies) {
- {
- SpdyIntrusiveList<DerivedClass, DerivedLinkId> list;
- DerivedClass elements[2];
- EXPECT_TRUE(list.empty());
- list.push_back(&elements[0]);
- EXPECT_EQ(1u, list.size());
- list.push_back(&elements[1]);
- EXPECT_EQ(2u, list.size());
- list.pop_back();
- EXPECT_EQ(1u, list.size());
- list.pop_back();
- EXPECT_TRUE(list.empty());
- }
- {
- SpdyIntrusiveList<VirtuallyDerivedClassA, DerivedLinkId> list;
- VirtuallyDerivedClassA elements[2];
- EXPECT_TRUE(list.empty());
- list.push_back(&elements[0]);
- EXPECT_EQ(1u, list.size());
- list.push_back(&elements[1]);
- EXPECT_EQ(2u, list.size());
- list.pop_back();
- EXPECT_EQ(1u, list.size());
- list.pop_back();
- EXPECT_TRUE(list.empty());
- }
- {
- SpdyIntrusiveList<VirtuallyDerivedClassC, DerivedLinkId> list;
- VirtuallyDerivedClassC elements[2];
- EXPECT_TRUE(list.empty());
- list.push_back(&elements[0]);
- EXPECT_EQ(1u, list.size());
- list.push_back(&elements[1]);
- EXPECT_EQ(2u, list.size());
- list.pop_back();
- EXPECT_EQ(1u, list.size());
- list.pop_back();
- EXPECT_TRUE(list.empty());
- }
- {
- SpdyIntrusiveList<AbstractBase, BaseLinkId> list;
- DerivedClass d1;
- VirtuallyDerivedClassA d2;
- VirtuallyDerivedClassB d3;
- VirtuallyDerivedClassC d4;
- EXPECT_TRUE(list.empty());
- list.push_back(&d1);
- EXPECT_EQ(1u, list.size());
- list.push_back(&d2);
- EXPECT_EQ(2u, list.size());
- list.push_back(&d3);
- EXPECT_EQ(3u, list.size());
- list.push_back(&d4);
- EXPECT_EQ(4u, list.size());
- SpdyIntrusiveList<AbstractBase, BaseLinkId>::iterator it = list.begin();
- EXPECT_EQ("DerivedClass", (it++)->name());
- EXPECT_EQ("VirtuallyDerivedClassA", (it++)->name());
- EXPECT_EQ("VirtuallyDerivedClassB", (it++)->name());
- EXPECT_EQ("VirtuallyDerivedClassC", (it++)->name());
- }
- {
- SpdyIntrusiveList<templated_base_link::DerivedClass> list;
- templated_base_link::DerivedClass elements[2];
- EXPECT_TRUE(list.empty());
- list.push_back(&elements[0]);
- EXPECT_EQ(1u, list.size());
- list.push_back(&elements[1]);
- EXPECT_EQ(2u, list.size());
- list.pop_back();
- EXPECT_EQ(1u, list.size());
- list.pop_back();
- EXPECT_TRUE(list.empty());
- }
-}
-
-class IntrusiveListTagTypeTest : public quiche::test::QuicheTest {
- protected:
- struct Tag {};
- class Element : public SpdyIntrusiveLink<Element, Tag> {};
-};
-
-TEST_F(IntrusiveListTagTypeTest, TagTypeListID) {
- SpdyIntrusiveList<Element, Tag> list;
- {
- Element e;
- list.push_back(&e);
- }
-}
-
-} // namespace test
-} // namespace spdy
diff --git a/quiche/spdy/core/spdy_pinnable_buffer_piece.cc b/quiche/spdy/core/spdy_pinnable_buffer_piece.cc
deleted file mode 100644
index 86e67ac..0000000
--- a/quiche/spdy/core/spdy_pinnable_buffer_piece.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 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 "quiche/spdy/core/spdy_pinnable_buffer_piece.h"
-
-#include <algorithm>
-#include <cstddef>
-
-namespace spdy {
-
-SpdyPinnableBufferPiece::SpdyPinnableBufferPiece()
- : buffer_(nullptr), length_(0) {}
-
-SpdyPinnableBufferPiece::~SpdyPinnableBufferPiece() = default;
-
-void SpdyPinnableBufferPiece::Pin() {
- if (!storage_ && buffer_ != nullptr && length_ != 0) {
- storage_.reset(new char[length_]);
- std::copy(buffer_, buffer_ + length_, storage_.get());
- buffer_ = storage_.get();
- }
-}
-
-void SpdyPinnableBufferPiece::Swap(SpdyPinnableBufferPiece* other) {
- size_t length = length_;
- length_ = other->length_;
- other->length_ = length;
-
- const char* buffer = buffer_;
- buffer_ = other->buffer_;
- other->buffer_ = buffer;
-
- storage_.swap(other->storage_);
-}
-
-} // namespace spdy
diff --git a/quiche/spdy/core/spdy_pinnable_buffer_piece.h b/quiche/spdy/core/spdy_pinnable_buffer_piece.h
deleted file mode 100644
index d73a400..0000000
--- a/quiche/spdy/core/spdy_pinnable_buffer_piece.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 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.
-
-#ifndef QUICHE_SPDY_CORE_SPDY_PINNABLE_BUFFER_PIECE_H_
-#define QUICHE_SPDY_CORE_SPDY_PINNABLE_BUFFER_PIECE_H_
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "absl/strings/string_view.h"
-#include "quiche/common/platform/api/quiche_export.h"
-
-namespace spdy {
-
-class SpdyPrefixedBufferReader;
-
-// Helper class of SpdyPrefixedBufferReader.
-// Represents a piece of consumed buffer which may (or may not) own its
-// underlying storage. Users may "pin" the buffer at a later time to ensure
-// a SpdyPinnableBufferPiece owns and retains storage of the buffer.
-struct QUICHE_EXPORT SpdyPinnableBufferPiece {
- public:
- SpdyPinnableBufferPiece();
- ~SpdyPinnableBufferPiece();
-
- const char* buffer() const { return buffer_; }
-
- explicit operator absl::string_view() const {
- return absl::string_view(buffer_, length_);
- }
-
- // Allocates and copies the buffer to internal storage.
- void Pin();
-
- bool IsPinned() const { return storage_ != nullptr; }
-
- // Swaps buffers, including internal storage, with |other|.
- void Swap(SpdyPinnableBufferPiece* other);
-
- private:
- friend class SpdyPrefixedBufferReader;
-
- const char* buffer_;
- size_t length_;
- // Null iff |buffer_| isn't pinned.
- std::unique_ptr<char[]> storage_;
-};
-
-} // namespace spdy
-
-#endif // QUICHE_SPDY_CORE_SPDY_PINNABLE_BUFFER_PIECE_H_
diff --git a/quiche/spdy/core/spdy_pinnable_buffer_piece_test.cc b/quiche/spdy/core/spdy_pinnable_buffer_piece_test.cc
deleted file mode 100644
index 9e3f804..0000000
--- a/quiche/spdy/core/spdy_pinnable_buffer_piece_test.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2014 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 "quiche/spdy/core/spdy_pinnable_buffer_piece.h"
-
-#include <string>
-
-#include "absl/strings/string_view.h"
-#include "quiche/common/platform/api/quiche_test.h"
-#include "quiche/spdy/core/spdy_prefixed_buffer_reader.h"
-
-namespace spdy {
-
-namespace test {
-
-class SpdyPinnableBufferPieceTest : public quiche::test::QuicheTest {
- protected:
- SpdyPrefixedBufferReader Build(const std::string& prefix,
- const std::string& suffix) {
- prefix_ = prefix;
- suffix_ = suffix;
- return SpdyPrefixedBufferReader(prefix_.data(), prefix_.length(),
- suffix_.data(), suffix_.length());
- }
- std::string prefix_, suffix_;
-};
-
-TEST_F(SpdyPinnableBufferPieceTest, Pin) {
- SpdyPrefixedBufferReader reader = Build("foobar", "");
- SpdyPinnableBufferPiece piece;
- EXPECT_TRUE(reader.ReadN(6, &piece));
-
- // Piece points to underlying prefix storage.
- EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
- EXPECT_FALSE(piece.IsPinned());
- EXPECT_EQ(prefix_.data(), piece.buffer());
-
- piece.Pin();
-
- // Piece now points to allocated storage.
- EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
- EXPECT_TRUE(piece.IsPinned());
- EXPECT_NE(prefix_.data(), piece.buffer());
-
- // Pinning again has no effect.
- const char* buffer = piece.buffer();
- piece.Pin();
- EXPECT_EQ(buffer, piece.buffer());
-}
-
-TEST_F(SpdyPinnableBufferPieceTest, Swap) {
- SpdyPrefixedBufferReader reader = Build("foobar", "");
- SpdyPinnableBufferPiece piece1, piece2;
- EXPECT_TRUE(reader.ReadN(4, &piece1));
- EXPECT_TRUE(reader.ReadN(2, &piece2));
-
- piece1.Pin();
-
- EXPECT_EQ(absl::string_view("foob"), absl::string_view(piece1));
- EXPECT_TRUE(piece1.IsPinned());
- EXPECT_EQ(absl::string_view("ar"), absl::string_view(piece2));
- EXPECT_FALSE(piece2.IsPinned());
-
- piece1.Swap(&piece2);
-
- EXPECT_EQ(absl::string_view("ar"), absl::string_view(piece1));
- EXPECT_FALSE(piece1.IsPinned());
- EXPECT_EQ(absl::string_view("foob"), absl::string_view(piece2));
- EXPECT_TRUE(piece2.IsPinned());
-
- SpdyPinnableBufferPiece empty;
- piece2.Swap(&empty);
-
- EXPECT_EQ(absl::string_view(""), absl::string_view(piece2));
- EXPECT_FALSE(piece2.IsPinned());
-}
-
-} // namespace test
-
-} // namespace spdy
diff --git a/quiche/spdy/core/spdy_prefixed_buffer_reader.cc b/quiche/spdy/core/spdy_prefixed_buffer_reader.cc
deleted file mode 100644
index 843e139..0000000
--- a/quiche/spdy/core/spdy_prefixed_buffer_reader.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2014 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 "quiche/spdy/core/spdy_prefixed_buffer_reader.h"
-
-#include <algorithm>
-#include <cstddef>
-
-#include "quiche/common/platform/api/quiche_logging.h"
-#include "quiche/spdy/core/spdy_pinnable_buffer_piece.h"
-
-namespace spdy {
-
-SpdyPrefixedBufferReader::SpdyPrefixedBufferReader(const char* prefix,
- size_t prefix_length,
- const char* suffix,
- size_t suffix_length)
- : prefix_(prefix),
- suffix_(suffix),
- prefix_length_(prefix_length),
- suffix_length_(suffix_length) {}
-
-size_t SpdyPrefixedBufferReader::Available() {
- return prefix_length_ + suffix_length_;
-}
-
-bool SpdyPrefixedBufferReader::ReadN(size_t count, char* out) {
- if (Available() < count) {
- return false;
- }
-
- if (prefix_length_ >= count) {
- // Read is fully satisfied by the prefix.
- std::copy(prefix_, prefix_ + count, out);
- prefix_ += count;
- prefix_length_ -= count;
- return true;
- } else if (prefix_length_ != 0) {
- // Read is partially satisfied by the prefix.
- out = std::copy(prefix_, prefix_ + prefix_length_, out);
- count -= prefix_length_;
- prefix_length_ = 0;
- // Fallthrough to suffix read.
- }
- QUICHE_DCHECK(suffix_length_ >= count);
- // Read is satisfied by the suffix.
- std::copy(suffix_, suffix_ + count, out);
- suffix_ += count;
- suffix_length_ -= count;
- return true;
-}
-
-bool SpdyPrefixedBufferReader::ReadN(size_t count,
- SpdyPinnableBufferPiece* out) {
- if (Available() < count) {
- return false;
- }
-
- out->storage_.reset();
- out->length_ = count;
-
- if (prefix_length_ >= count) {
- // Read is fully satisfied by the prefix.
- out->buffer_ = prefix_;
- prefix_ += count;
- prefix_length_ -= count;
- return true;
- } else if (prefix_length_ != 0) {
- // Read is only partially satisfied by the prefix. We need to allocate
- // contiguous storage as the read spans the prefix & suffix.
- out->storage_.reset(new char[count]);
- out->buffer_ = out->storage_.get();
- ReadN(count, out->storage_.get());
- return true;
- } else {
- QUICHE_DCHECK(suffix_length_ >= count);
- // Read is fully satisfied by the suffix.
- out->buffer_ = suffix_;
- suffix_ += count;
- suffix_length_ -= count;
- return true;
- }
-}
-
-} // namespace spdy
diff --git a/quiche/spdy/core/spdy_prefixed_buffer_reader.h b/quiche/spdy/core/spdy_prefixed_buffer_reader.h
deleted file mode 100644
index c102ee6..0000000
--- a/quiche/spdy/core/spdy_prefixed_buffer_reader.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 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.
-
-#ifndef QUICHE_SPDY_CORE_SPDY_PREFIXED_BUFFER_READER_H_
-#define QUICHE_SPDY_CORE_SPDY_PREFIXED_BUFFER_READER_H_
-
-#include <stddef.h>
-
-#include "quiche/common/platform/api/quiche_export.h"
-#include "quiche/spdy/core/spdy_pinnable_buffer_piece.h"
-
-namespace spdy {
-
-// Reader class which simplifies reading contiguously from
-// from a disjoint buffer prefix & suffix.
-class QUICHE_EXPORT SpdyPrefixedBufferReader {
- public:
- SpdyPrefixedBufferReader(const char* prefix, size_t prefix_length,
- const char* suffix, size_t suffix_length);
-
- // Returns number of bytes available to be read.
- size_t Available();
-
- // Reads |count| bytes, copying into |*out|. Returns true on success,
- // false if not enough bytes were available.
- bool ReadN(size_t count, char* out);
-
- // Reads |count| bytes, returned in |*out|. Returns true on success,
- // false if not enough bytes were available.
- bool ReadN(size_t count, SpdyPinnableBufferPiece* out);
-
- private:
- const char* prefix_;
- const char* suffix_;
-
- size_t prefix_length_;
- size_t suffix_length_;
-};
-
-} // namespace spdy
-
-#endif // QUICHE_SPDY_CORE_SPDY_PREFIXED_BUFFER_READER_H_
diff --git a/quiche/spdy/core/spdy_prefixed_buffer_reader_test.cc b/quiche/spdy/core/spdy_prefixed_buffer_reader_test.cc
deleted file mode 100644
index 0c67d8c..0000000
--- a/quiche/spdy/core/spdy_prefixed_buffer_reader_test.cc
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2014 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 "quiche/spdy/core/spdy_prefixed_buffer_reader.h"
-
-#include <string>
-
-#include "absl/strings/string_view.h"
-#include "quiche/common/platform/api/quiche_test.h"
-#include "quiche/spdy/core/spdy_pinnable_buffer_piece.h"
-
-namespace spdy {
-
-namespace test {
-
-using testing::ElementsAreArray;
-
-class SpdyPrefixedBufferReaderTest : public quiche::test::QuicheTest {
- protected:
- SpdyPrefixedBufferReader Build(const std::string& prefix,
- const std::string& suffix) {
- prefix_ = prefix;
- suffix_ = suffix;
- return SpdyPrefixedBufferReader(prefix_.data(), prefix_.length(),
- suffix_.data(), suffix_.length());
- }
- std::string prefix_, suffix_;
-};
-
-TEST_F(SpdyPrefixedBufferReaderTest, ReadRawFromPrefix) {
- SpdyPrefixedBufferReader reader = Build("foobar", "");
- EXPECT_EQ(6u, reader.Available());
-
- char buffer[] = "123456";
- EXPECT_FALSE(reader.ReadN(10, buffer)); // Not enough buffer.
- EXPECT_TRUE(reader.ReadN(6, buffer));
- EXPECT_THAT(buffer, ElementsAreArray("foobar"));
- EXPECT_EQ(0u, reader.Available());
-}
-
-TEST_F(SpdyPrefixedBufferReaderTest, ReadPieceFromPrefix) {
- SpdyPrefixedBufferReader reader = Build("foobar", "");
- EXPECT_EQ(6u, reader.Available());
-
- SpdyPinnableBufferPiece piece;
- EXPECT_FALSE(reader.ReadN(10, &piece)); // Not enough buffer.
- EXPECT_TRUE(reader.ReadN(6, &piece));
- EXPECT_FALSE(piece.IsPinned());
- EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
- EXPECT_EQ(0u, reader.Available());
-}
-
-TEST_F(SpdyPrefixedBufferReaderTest, ReadRawFromSuffix) {
- SpdyPrefixedBufferReader reader = Build("", "foobar");
- EXPECT_EQ(6u, reader.Available());
-
- char buffer[] = "123456";
- EXPECT_FALSE(reader.ReadN(10, buffer)); // Not enough buffer.
- EXPECT_TRUE(reader.ReadN(6, buffer));
- EXPECT_THAT(buffer, ElementsAreArray("foobar"));
- EXPECT_EQ(0u, reader.Available());
-}
-
-TEST_F(SpdyPrefixedBufferReaderTest, ReadPieceFromSuffix) {
- SpdyPrefixedBufferReader reader = Build("", "foobar");
- EXPECT_EQ(6u, reader.Available());
-
- SpdyPinnableBufferPiece piece;
- EXPECT_FALSE(reader.ReadN(10, &piece)); // Not enough buffer.
- EXPECT_TRUE(reader.ReadN(6, &piece));
- EXPECT_FALSE(piece.IsPinned());
- EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
- EXPECT_EQ(0u, reader.Available());
-}
-
-TEST_F(SpdyPrefixedBufferReaderTest, ReadRawSpanning) {
- SpdyPrefixedBufferReader reader = Build("foob", "ar");
- EXPECT_EQ(6u, reader.Available());
-
- char buffer[] = "123456";
- EXPECT_FALSE(reader.ReadN(10, buffer)); // Not enough buffer.
- EXPECT_TRUE(reader.ReadN(6, buffer));
- EXPECT_THAT(buffer, ElementsAreArray("foobar"));
- EXPECT_EQ(0u, reader.Available());
-}
-
-TEST_F(SpdyPrefixedBufferReaderTest, ReadPieceSpanning) {
- SpdyPrefixedBufferReader reader = Build("foob", "ar");
- EXPECT_EQ(6u, reader.Available());
-
- SpdyPinnableBufferPiece piece;
- EXPECT_FALSE(reader.ReadN(10, &piece)); // Not enough buffer.
- EXPECT_TRUE(reader.ReadN(6, &piece));
- EXPECT_TRUE(piece.IsPinned());
- EXPECT_EQ(absl::string_view("foobar"), absl::string_view(piece));
- EXPECT_EQ(0u, reader.Available());
-}
-
-TEST_F(SpdyPrefixedBufferReaderTest, ReadMixed) {
- SpdyPrefixedBufferReader reader = Build("abcdef", "hijkl");
- EXPECT_EQ(11u, reader.Available());
-
- char buffer[] = "1234";
- SpdyPinnableBufferPiece piece;
-
- EXPECT_TRUE(reader.ReadN(3, buffer));
- EXPECT_THAT(buffer, ElementsAreArray("abc4"));
- EXPECT_EQ(8u, reader.Available());
-
- EXPECT_TRUE(reader.ReadN(2, buffer));
- EXPECT_THAT(buffer, ElementsAreArray("dec4"));
- EXPECT_EQ(6u, reader.Available());
-
- EXPECT_TRUE(reader.ReadN(3, &piece));
- EXPECT_EQ(absl::string_view("fhi"), absl::string_view(piece));
- EXPECT_TRUE(piece.IsPinned());
- EXPECT_EQ(3u, reader.Available());
-
- EXPECT_TRUE(reader.ReadN(2, &piece));
- EXPECT_EQ(absl::string_view("jk"), absl::string_view(piece));
- EXPECT_FALSE(piece.IsPinned());
- EXPECT_EQ(1u, reader.Available());
-
- EXPECT_TRUE(reader.ReadN(1, buffer));
- EXPECT_THAT(buffer, ElementsAreArray("lec4"));
- EXPECT_EQ(0u, reader.Available());
-}
-
-} // namespace test
-
-} // namespace spdy