diff --git a/bazel/external/quiche.BUILD b/bazel/external/quiche.BUILD index 3f3793e6ca3f4..f8a1079ac93cd 100644 --- a/bazel/external/quiche.BUILD +++ b/bazel/external/quiche.BUILD @@ -1038,6 +1038,7 @@ envoy_cc_library( deps = [ ":quic_platform_export", ":quiche_common_lib", + ":quiche_common_platform_default_quiche_platform_impl_export_lib", "@envoy//source/common/quic/platform:quic_platform_base_impl_lib", ], ) @@ -1155,7 +1156,10 @@ envoy_cc_test_library( hdrs = ["quiche/quic/platform/api/quic_test.h"], repository = "@envoy", tags = ["nofips"], - deps = ["@envoy//test/common/quic/platform:quic_platform_test_impl_lib"], + deps = [ + ":quiche_common_platform_test", + "@envoy//test/common/quic/platform:quic_platform_test_impl_lib", + ], ) envoy_cc_test_library( @@ -2272,7 +2276,6 @@ envoy_cc_library( ":quic_core_types_lib", ":quic_core_versions_lib", ":quic_platform_base", - ":quic_platform_mem_slice_span", ], ) @@ -3281,7 +3284,6 @@ envoy_cc_library( ":quic_core_utils_lib", ":quic_core_versions_lib", ":quic_platform", - ":quic_platform_mem_slice_span", ":quiche_common_text_utils_lib", ":spdy_core_protocol_lib", ], @@ -3335,7 +3337,6 @@ envoy_cc_library( ":quic_core_types_lib", ":quic_core_utils_lib", ":quic_platform_base", - ":quic_platform_mem_slice_span", ":quiche_common_circular_deque_lib", ], ) @@ -4009,6 +4010,7 @@ envoy_cc_library( envoy_cc_library( name = "quiche_common_platform_default_quiche_platform_impl_export_lib", hdrs = [ + "quiche/common/platform/default/quiche_platform_impl/quiche_containers_impl.h", "quiche/common/platform/default/quiche_platform_impl/quiche_export_impl.h", "quiche/common/platform/default/quiche_platform_impl/quiche_thread_local_impl.h", ], @@ -4163,32 +4165,17 @@ envoy_cc_test( ], ) -envoy_cc_library( - name = "quic_platform_mem_slice_span", - hdrs = [ - "quiche/quic/platform/api/quic_mem_slice_span.h", - ], - copts = quiche_copts, - repository = "@envoy", - tags = ["nofips"], - visibility = ["//visibility:public"], - deps = ["@envoy//source/common/quic/platform:quic_platform_mem_slice_span_impl_lib"], -) - -envoy_cc_test_library( - name = "quic_platform_test_mem_slice_vector_lib", - hdrs = ["quiche/quic/platform/api/quic_test_mem_slice_vector.h"], - repository = "@envoy", - tags = ["nofips"], - deps = ["@envoy//test/common/quic/platform:quic_platform_test_mem_slice_vector_impl_lib"], -) - envoy_cc_library( name = "quic_platform_mem_slice_storage", + srcs = ["quiche/quic/platform/api/quic_mem_slice_storage.cc"], hdrs = ["quiche/quic/platform/api/quic_mem_slice_storage.h"], repository = "@envoy", visibility = ["//visibility:public"], - deps = ["@envoy//source/common/quic/platform:quic_platform_mem_slice_storage_impl_lib"], + deps = [ + ":quic_core_types_lib", + ":quic_core_utils_lib", + ":quic_platform_base", + ], ) envoy_cc_test( @@ -4207,7 +4194,6 @@ envoy_cc_test( envoy_cc_test( name = "quic_platform_api_test", srcs = [ - "quiche/quic/platform/api/quic_mem_slice_span_test.cc", "quiche/quic/platform/api/quic_mem_slice_storage_test.cc", "quiche/quic/platform/api/quic_mem_slice_test.cc", "quiche/quic/platform/api/quic_reference_counted_test.cc", @@ -4218,10 +4204,8 @@ envoy_cc_test( deps = [ ":quic_core_buffer_allocator_lib", ":quic_platform", - ":quic_platform_mem_slice_span", ":quic_platform_mem_slice_storage", ":quic_platform_test", - ":quic_platform_test_mem_slice_vector_lib", ], ) diff --git a/bazel/repository_locations.bzl b/bazel/repository_locations.bzl index d1daada8725c8..71c268116409e 100644 --- a/bazel/repository_locations.bzl +++ b/bazel/repository_locations.bzl @@ -821,13 +821,13 @@ REPOSITORY_LOCATIONS_SPEC = dict( project_name = "QUICHE", project_desc = "QUICHE (QUIC, HTTP/2, Etc) is Google‘s implementation of QUIC and related protocols", project_url = "https://github.com/google/quiche", - version = "29fb6fc501e4df5874129408b5474a91eaa9b7a0", - sha256 = "bcc17653958c622e475deacbf23e9a215cdb711688671110e20192500ba210dc", + version = "8d5eb27ee2e3f009f7180e8ace0ff97830d9c3e9", + sha256 = "88cc71556b96bbec953a716a12c26f88b8af4d5e9a83cf3ec38aba4caed6bf52", # Static snapshot of https://quiche.googlesource.com/quiche/+archive/{version}.tar.gz urls = ["https://github.com/google/quiche/archive/{version}.tar.gz"], strip_prefix = "quiche-{version}", use_category = ["dataplane_core"], - release_date = "2021-08-06", + release_date = "2021-08-31", cpe = "N/A", ), com_googlesource_googleurl = dict( diff --git a/docs/root/version_history/current.rst b/docs/root/version_history/current.rst index cfe125aa8cff0..2b3f3c18e9d2e 100644 --- a/docs/root/version_history/current.rst +++ b/docs/root/version_history/current.rst @@ -56,6 +56,7 @@ Minor Behavior Changes Windows has been disabled due to suboptimal behavior. See the field documentation for more information. * listener: destroy per network filter chain stats when a network filter chain is removed during the listener in place update. +* quic: enables IETF connection migration. This feature requires stable UDP packet routine in the L4 load balancer with the same first-4-bytes in connection id. It can be turned off by setting runtime guard ``envoy.reloadable_features.FLAGS_quic_reloadable_flag_quic_connection_migration_use_new_cid_v2`` to false. Bug Fixes --------- diff --git a/source/common/quic/BUILD b/source/common/quic/BUILD index e9ba4bcdba7e2..fed592a8ddb11 100644 --- a/source/common/quic/BUILD +++ b/source/common/quic/BUILD @@ -243,7 +243,6 @@ envoy_cc_library( "//source/common/buffer:buffer_lib", "//source/common/common:assert_lib", "//source/common/http:header_map_lib", - "//source/common/quic/platform:quic_platform_mem_slice_storage_impl_lib", "@com_github_google_quiche//:quic_core_http_spdy_session_lib", ], ) @@ -271,7 +270,6 @@ envoy_cc_library( "//source/common/http:codes_lib", "//source/common/http:header_map_lib", "//source/common/http:header_utility_lib", - "//source/common/quic/platform:quic_platform_mem_slice_storage_impl_lib", "@com_github_google_quiche//:quic_core_http_client_lib", ], ) diff --git a/source/common/quic/envoy_quic_client_stream.cc b/source/common/quic/envoy_quic_client_stream.cc index 316ab12f7277c..a4522b6b65485 100644 --- a/source/common/quic/envoy_quic_client_stream.cc +++ b/source/common/quic/envoy_quic_client_stream.cc @@ -9,7 +9,6 @@ #include "quiche/quic/core/quic_session.h" #include "quiche/quic/core/http/quic_header_list.h" #include "quiche/spdy/core/spdy_header_block.h" -#include "source/common/quic/platform/quic_mem_slice_span_impl.h" #if defined(__GNUC__) #pragma GCC diagnostic pop @@ -81,8 +80,20 @@ void EnvoyQuicClientStream::encodeData(Buffer::Instance& data, bool end_stream) ASSERT(!local_end_stream_); local_end_stream_ = end_stream; SendBufferMonitor::ScopedWatermarkBufferUpdater updater(this, this); + Buffer::RawSliceVector raw_slices = data.getRawSlices(); + absl::InlinedVector quic_slices; + quic_slices.reserve(raw_slices.size()); + for (auto& slice : raw_slices) { + ASSERT(slice.len_ != 0); + // Move each slice into a stand-alone buffer. + // TODO(danzh): investigate the cost of allocating one buffer per slice. + // If it turns out to be expensive, add a new function to free data in the middle in buffer + // interface and re-design QuicMemSliceImpl. + quic_slices.emplace_back(quic::QuicMemSliceImpl(data, slice.len_)); + } + absl::Span span(quic_slices); // QUIC stream must take all. - WriteBodySlices(quic::QuicMemSliceSpan(quic::QuicMemSliceSpanImpl(data)), end_stream); + WriteBodySlices(span, end_stream); if (data.length() > 0) { // Send buffer didn't take all the data, threshold needs to be adjusted. Reset(quic::QUIC_BAD_APPLICATION_PAYLOAD); diff --git a/source/common/quic/envoy_quic_server_stream.cc b/source/common/quic/envoy_quic_server_stream.cc index ed00a6ae4159b..f5249c30375c1 100644 --- a/source/common/quic/envoy_quic_server_stream.cc +++ b/source/common/quic/envoy_quic_server_stream.cc @@ -14,7 +14,6 @@ #include "quiche/quic/core/http/quic_header_list.h" #include "quiche/quic/core/quic_session.h" #include "quiche/spdy/core/spdy_header_block.h" -#include "source/common/quic/platform/quic_mem_slice_span_impl.h" #if defined(__GNUC__) #pragma GCC diagnostic pop @@ -74,8 +73,20 @@ void EnvoyQuicServerStream::encodeData(Buffer::Instance& data, bool end_stream) ASSERT(!local_end_stream_); local_end_stream_ = end_stream; SendBufferMonitor::ScopedWatermarkBufferUpdater updater(this, this); + Buffer::RawSliceVector raw_slices = data.getRawSlices(); + absl::InlinedVector quic_slices; + quic_slices.reserve(raw_slices.size()); + for (auto& slice : raw_slices) { + ASSERT(slice.len_ != 0); + // Move each slice into a stand-alone buffer. + // TODO(danzh): investigate the cost of allocating one buffer per slice. + // If it turns out to be expensive, add a new function to free data in the middle in buffer + // interface and re-design QuicMemSliceImpl. + quic_slices.emplace_back(quic::QuicMemSliceImpl(data, slice.len_)); + } + absl::Span span(quic_slices); // QUIC stream must take all. - WriteBodySlices(quic::QuicMemSliceSpan(quic::QuicMemSliceSpanImpl(data)), end_stream); + WriteBodySlices(span, end_stream); if (data.length() > 0) { // Send buffer didn't take all the data, threshold needs to be adjusted. Reset(quic::QUIC_BAD_APPLICATION_PAYLOAD); diff --git a/source/common/quic/platform/BUILD b/source/common/quic/platform/BUILD index a1141ac437997..60fcfe741ae02 100644 --- a/source/common/quic/platform/BUILD +++ b/source/common/quic/platform/BUILD @@ -175,43 +175,6 @@ envoy_cc_library( ], ) -envoy_cc_library( - name = "quic_platform_mem_slice_span_impl_lib", - srcs = ["quic_mem_slice_span_impl.cc"], - hdrs = ["quic_mem_slice_span_impl.h"], - copts = select({ - "//bazel:windows_x86_64": [], - "//conditions:default": ["-Wno-unused-parameter"], - }), - tags = ["nofips"], - visibility = ["//visibility:public"], - deps = [ - "//envoy/buffer:buffer_interface", - "@com_github_google_quiche//:quic_core_types_lib", - "@com_github_google_quiche//:quic_platform_base", - ], -) - -envoy_cc_library( - name = "quic_platform_mem_slice_storage_impl_lib", - srcs = ["quic_mem_slice_storage_impl.cc"], - hdrs = ["quic_mem_slice_storage_impl.h"], - copts = select({ - "//bazel:windows_x86_64": [], - "//conditions:default": [ - "-Wno-error=invalid-offsetof", - "-Wno-unused-parameter", - ], - }), - tags = ["nofips"], - visibility = ["//visibility:public"], - deps = [ - "@com_github_google_quiche//:quic_core_buffer_allocator_lib", - "@com_github_google_quiche//:quic_core_utils_lib", - "@com_github_google_quiche//:quic_platform_mem_slice_span", - ], -) - envoy_cc_library( name = "quic_platform_udp_socket_impl_lib", hdrs = select({ diff --git a/source/common/quic/platform/quic_mem_slice_span_impl.cc b/source/common/quic/platform/quic_mem_slice_span_impl.cc deleted file mode 100644 index 89a7357d37437..0000000000000 --- a/source/common/quic/platform/quic_mem_slice_span_impl.cc +++ /dev/null @@ -1,20 +0,0 @@ -// NOLINT(namespace-envoy) - -// This file is part of the QUICHE platform implementation, and is not to be -// consumed or referenced directly by other Envoy code. It serves purely as a -// porting layer for QUICHE. - -#include "source/common/quic/platform/quic_mem_slice_span_impl.h" - -#include "quiche/quic/platform/api/quic_mem_slice.h" - -namespace quic { - -// NOLINTNEXTLINE(readability-identifier-naming) -absl::string_view QuicMemSliceSpanImpl::GetData(size_t index) { - Envoy::Buffer::RawSliceVector slices = buffer_->getRawSlices(/*max_slices=*/index + 1); - ASSERT(slices.size() > index); - return {reinterpret_cast(slices[index].mem_), slices[index].len_}; -} - -} // namespace quic diff --git a/source/common/quic/platform/quic_mem_slice_span_impl.h b/source/common/quic/platform/quic_mem_slice_span_impl.h deleted file mode 100644 index d1e9855551282..0000000000000 --- a/source/common/quic/platform/quic_mem_slice_span_impl.h +++ /dev/null @@ -1,94 +0,0 @@ -#pragma once - -// NOLINT(namespace-envoy) - -// This file is part of the QUICHE platform implementation, and is not to be -// consumed or referenced directly by other Envoy code. It serves purely as a -// porting layer for QUICHE. - -#include "envoy/buffer/buffer.h" - -#include "absl/container/fixed_array.h" -#include "absl/strings/string_view.h" -#include "quiche/quic/core/quic_types.h" -#include "quiche/quic/platform/api/quic_mem_slice.h" - -namespace quic { - -// Implements the interface required by -// https://quiche.googlesource.com/quiche/+/refs/heads/master/quic/platform/api/quic_mem_slice_span.h -// Wraps a Buffer::Instance and deliver its data with minimum number of copies. -class QuicMemSliceSpanImpl { -public: - QuicMemSliceSpanImpl() = default; - /** - * @param buffer has to outlive the life time of this class. - */ - explicit QuicMemSliceSpanImpl(Envoy::Buffer::Instance& buffer) : buffer_(&buffer) {} - explicit QuicMemSliceSpanImpl(QuicMemSliceImpl* slice) - : buffer_(&slice->getSingleSliceBuffer()), mem_slice_(slice) {} - - QuicMemSliceSpanImpl(const QuicMemSliceSpanImpl& other) = default; - QuicMemSliceSpanImpl& operator=(const QuicMemSliceSpanImpl& other) = default; - - QuicMemSliceSpanImpl(QuicMemSliceSpanImpl&& other) noexcept - : buffer_(other.buffer_), mem_slice_(other.mem_slice_) { - other.buffer_ = nullptr; - other.mem_slice_ = nullptr; - } - - QuicMemSliceSpanImpl& operator=(QuicMemSliceSpanImpl&& other) noexcept { - if (this != &other) { - buffer_ = other.buffer_; - mem_slice_ = other.mem_slice_; - other.buffer_ = nullptr; - other.mem_slice_ = nullptr; - } - return *this; - } - - // QuicMemSliceSpan - // NOLINTNEXTLINE(readability-identifier-naming) - absl::string_view GetData(size_t index); - // NOLINTNEXTLINE(readability-identifier-naming) - QuicByteCount total_length() { return buffer_->length(); }; - // NOLINTNEXTLINE(readability-identifier-naming) - size_t NumSlices() { return buffer_->getRawSlices().size(); } - // NOLINTNEXTLINE(readability-identifier-naming) - template QuicByteCount ConsumeAll(ConsumeFunction consume); - bool empty() const { return buffer_->length() == 0; } - -private: - // If constructed with a QuicMemSlice, mem_slice_ point to that object and this points to - // mem_slice_->getSingleSliceBuffer(). If constructed with an Envoy buffer, this points to the - // buffer itself. - Envoy::Buffer::Instance* buffer_{nullptr}; - // If this span is not constructed with a QuicMemSlice, this points to nullptr. - QuicMemSliceImpl* mem_slice_{nullptr}; -}; - -template -// NOLINTNEXTLINE(readability-identifier-naming) -QuicByteCount QuicMemSliceSpanImpl::ConsumeAll(ConsumeFunction consume) { - size_t saved_length = 0; - if (mem_slice_ == nullptr) { - for (auto& slice : buffer_->getRawSlices()) { - if (slice.len_ == 0) { - continue; - } - // Move each slice into a stand-alone buffer. - // TODO(danzh): investigate the cost of allocating one buffer per slice. - // If it turns out to be expensive, add a new function to free data in the middle in buffer - // interface and re-design QuicMemSliceImpl. - consume(QuicMemSlice(QuicMemSliceImpl(*buffer_, slice.len_))); - saved_length += slice.len_; - } - } else { - saved_length += mem_slice_->length(); - consume(quic::QuicMemSlice(std::move(*mem_slice_))); - } - ASSERT(buffer_->length() == 0); - return saved_length; -} - -} // namespace quic diff --git a/source/common/quic/platform/quic_mem_slice_storage_impl.cc b/source/common/quic/platform/quic_mem_slice_storage_impl.cc deleted file mode 100644 index 0f90210eb992b..0000000000000 --- a/source/common/quic/platform/quic_mem_slice_storage_impl.cc +++ /dev/null @@ -1,44 +0,0 @@ -// NOLINT(namespace-envoy) - -// This file is part of the QUICHE platform implementation, and is not to be -// consumed or referenced directly by other Envoy code. It serves purely as a -// porting layer for QUICHE. - -#include "source/common/quic/platform/quic_mem_slice_storage_impl.h" - -#include - -#include "envoy/buffer/buffer.h" - -#include "quiche/quic/core/quic_utils.h" - -namespace quic { - -// TODO(danzh)Note that |allocator| is not used to allocate memory currently, instead, -// Buffer::OwnedImpl allocates memory on its own. Investigate if a customized -// QuicBufferAllocator can improve cache hit. -QuicMemSliceStorageImpl::QuicMemSliceStorageImpl(const iovec* iov, int iov_count, - QuicBufferAllocator* /*allocator*/, - const QuicByteCount max_slice_len) { - if (iov == nullptr) { - return; - } - QuicByteCount write_len = 0; - for (int i = 0; i < iov_count; ++i) { - write_len += iov[i].iov_len; - } - size_t io_offset = 0; - while (io_offset < write_len) { - size_t slice_len = std::min(write_len - io_offset, max_slice_len); - - // Use a separate slice so that we do not violate the restriction of |max_slice_len| when - // ToSpan() is called. - auto reservation = buffer_.reserveSingleSlice(slice_len, true); - QuicUtils::CopyToBuffer(iov, iov_count, io_offset, slice_len, - static_cast(reservation.slice().mem_)); - io_offset += slice_len; - reservation.commit(slice_len); - } -} - -} // namespace quic diff --git a/source/common/quic/platform/quic_mem_slice_storage_impl.h b/source/common/quic/platform/quic_mem_slice_storage_impl.h deleted file mode 100644 index 797ade760686e..0000000000000 --- a/source/common/quic/platform/quic_mem_slice_storage_impl.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -// NOLINT(namespace-envoy) - -// This file is part of the QUICHE platform implementation, and is not to be -// consumed or referenced directly by other Envoy code. It serves purely as a -// porting layer for QUICHE. - -#include "source/common/buffer/buffer_impl.h" - -#include "quiche/quic/core/quic_buffer_allocator.h" -#include "quiche/quic/platform/api/quic_iovec.h" -#include "quiche/quic/platform/api/quic_mem_slice_span.h" - -namespace quic { - -// QuicMemSliceStorageImpl wraps a MemSlice vector. -class QuicMemSliceStorageImpl { -public: - QuicMemSliceStorageImpl(const iovec* iov, int iov_count, QuicBufferAllocator* allocator, - const QuicByteCount max_slice_len); - - QuicMemSliceStorageImpl(const QuicMemSliceStorageImpl& other) { buffer_.add(other.buffer_); } - - QuicMemSliceStorageImpl& operator=(const QuicMemSliceStorageImpl& other) { - if (this != &other) { - if (buffer_.length() > 0) { - buffer_.drain(buffer_.length()); - } - buffer_.add(other.buffer_); - } - return *this; - } - QuicMemSliceStorageImpl(QuicMemSliceStorageImpl&& other) = default; - QuicMemSliceStorageImpl& operator=(QuicMemSliceStorageImpl&& other) = default; - - // NOLINTNEXTLINE(readability-identifier-naming) - QuicMemSliceSpan ToSpan() { return QuicMemSliceSpan(QuicMemSliceSpanImpl(buffer_)); } - - // NOLINTNEXTLINE(readability-identifier-naming) - void Append(QuicMemSliceImpl mem_slice) { buffer_.move(mem_slice.getSingleSliceBuffer()); } - -private: - Envoy::Buffer::OwnedImpl buffer_; -}; - -} // namespace quic diff --git a/test/common/quic/platform/BUILD b/test/common/quic/platform/BUILD index b9ece83458c77..e45df81e2704d 100644 --- a/test/common/quic/platform/BUILD +++ b/test/common/quic/platform/BUILD @@ -50,7 +50,6 @@ envoy_cc_test( "@com_github_google_quiche//:quic_core_error_codes_lib", "@com_github_google_quiche//:quic_core_types_lib", "@com_github_google_quiche//:quic_platform_expect_bug", - "@com_github_google_quiche//:quic_platform_mem_slice_span", "@com_github_google_quiche//:quic_platform_mem_slice_storage", "@com_github_google_quiche//:quic_platform_mock_log", "@com_github_google_quiche//:quic_platform_sleep", @@ -126,16 +125,6 @@ envoy_cc_test_library( deps = ["@com_github_google_quiche//:quic_platform_base"], ) -envoy_cc_test_library( - name = "quic_platform_test_mem_slice_vector_impl_lib", - hdrs = ["quic_test_mem_slice_vector_impl.h"], - tags = ["nofips"], - deps = [ - "//envoy/buffer:buffer_interface", - "@com_github_google_quiche//:quic_platform_mem_slice_span", - ], -) - envoy_cc_test_library( name = "quic_platform_system_event_loop_impl_lib", hdrs = ["quic_system_event_loop_impl.h"], diff --git a/test/common/quic/platform/quic_platform_test.cc b/test/common/quic/platform/quic_platform_test.cc index 73d13b22a733d..d0ec8aceb95ca 100644 --- a/test/common/quic/platform/quic_platform_test.cc +++ b/test/common/quic/platform/quic_platform_test.cc @@ -37,7 +37,6 @@ #include "quiche/quic/platform/api/quic_hostname_utils.h" #include "quiche/quic/platform/api/quic_logging.h" #include "quiche/quic/platform/api/quic_mem_slice.h" -#include "quiche/quic/platform/api/quic_mem_slice_span.h" #include "quiche/quic/platform/api/quic_mem_slice_storage.h" #include "quiche/quic/platform/api/quic_mock_log.h" #include "quiche/quic/platform/api/quic_mutex.h" @@ -625,46 +624,5 @@ TEST(EnvoyQuicMemSliceTest, ConstructMemSliceFromBuffer) { EXPECT_TRUE(fragment_releaser_called); } -TEST(EnvoyQuicMemSliceTest, ConstructQuicMemSliceSpan) { - Envoy::Buffer::OwnedImpl buffer; - std::string str(1024, 'a'); - buffer.add(str); - quic::QuicMemSlice slice{quic::QuicMemSliceImpl(buffer, str.length())}; - - QuicMemSliceSpan span(&slice); - EXPECT_EQ(1024u, span.total_length()); - EXPECT_EQ(str, span.GetData(0)); - span.ConsumeAll([](quic::QuicMemSlice&& mem_slice) { mem_slice.Reset(); }); - EXPECT_EQ(0u, span.total_length()); - - QuicMemSlice slice3; - { - quic::QuicMemSlice slice2{quic::QuicMemSliceImpl(std::make_unique(5), 5u)}; - - QuicMemSliceSpan span2(&slice2); - EXPECT_EQ(5u, span2.total_length()); - span2.ConsumeAll([&slice3](quic::QuicMemSlice&& mem_slice) { slice3 = std::move(mem_slice); }); - EXPECT_EQ(0u, span2.total_length()); - } - slice3.Reset(); -} - -TEST(EnvoyQuicMemSliceTest, QuicMemSliceStorage) { - std::string str(512, 'a'); - iovec iov = {const_cast(str.data()), str.length()}; - SimpleBufferAllocator allocator; - QuicMemSliceStorage storage(&iov, 1, &allocator, 1024); - // Test copy constructor. - QuicMemSliceStorage other = storage; - QuicMemSliceSpan span = storage.ToSpan(); - EXPECT_EQ(1u, span.NumSlices()); - EXPECT_EQ(str.length(), span.total_length()); - EXPECT_EQ(str, span.GetData(0)); - QuicMemSliceSpan span_other = other.ToSpan(); - EXPECT_EQ(1u, span_other.NumSlices()); - EXPECT_EQ(str, span_other.GetData(0)); - EXPECT_NE(span_other.GetData(0).data(), span.GetData(0).data()); -} - } // namespace } // namespace quic diff --git a/test/common/quic/platform/quic_test_mem_slice_vector_impl.h b/test/common/quic/platform/quic_test_mem_slice_vector_impl.h deleted file mode 100644 index 1f727111d2563..0000000000000 --- a/test/common/quic/platform/quic_test_mem_slice_vector_impl.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -// NOLINT(namespace-envoy) -// -// This file is part of the QUICHE platform implementation, and is not to be -// consumed or referenced directly by other Envoy code. It serves purely as a -// porting layer for QUICHE. - -#include "source/common/buffer/buffer_impl.h" -#include "source/common/quic/platform/quic_mem_slice_span_impl.h" - -namespace quic { -namespace test { - -class QuicTestMemSliceVectorImpl { -public: - explicit QuicTestMemSliceVectorImpl(std::vector> buffers) { - for (auto it : buffers) { - auto fragment = new Envoy::Buffer::BufferFragmentImpl( - it.first, it.second, - [](const void*, size_t, const Envoy::Buffer::BufferFragmentImpl* fragment) { - delete fragment; - }); - buffer_.addBufferFragment(*fragment); - } - } - - QuicMemSliceSpanImpl span() { return QuicMemSliceSpanImpl(buffer_); } - -private: - Envoy::Buffer::OwnedImpl buffer_; -}; - -} // namespace test -} // namespace quic