blob: 6110a9c865e17d263fa6b4e8647ecb5df946a64b [file] [log] [blame]
// Copyright 2022 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/common/quiche_buffer_allocator.h"
#include "absl/strings/string_view.h"
#include "quiche/common/platform/api/quiche_expect_bug.h"
#include "quiche/common/platform/api/quiche_test.h"
#include "quiche/common/simple_buffer_allocator.h"
#include "quiche/common/test_tools/quiche_test_utils.h"
namespace quiche {
namespace test {
namespace {
TEST(QuicheBuffer, CopyFromEmpty) {
SimpleBufferAllocator allocator;
QuicheBuffer buffer = QuicheBuffer::Copy(&allocator, "");
EXPECT_TRUE(buffer.empty());
}
TEST(QuicheBuffer, Copy) {
SimpleBufferAllocator allocator;
QuicheBuffer buffer = QuicheBuffer::Copy(&allocator, "foobar");
EXPECT_EQ("foobar", buffer.AsStringView());
}
TEST(QuicheBuffer, CopyFromIovecZeroBytes) {
const int buffer_length = 0;
SimpleBufferAllocator allocator;
QuicheBuffer buffer = QuicheBuffer::CopyFromIovec(
&allocator, nullptr,
/* iov_count = */ 0, /* iov_offset = */ 0, buffer_length);
EXPECT_TRUE(buffer.empty());
constexpr absl::string_view kData("foobar");
iovec iov = MakeIOVector(kData);
buffer = QuicheBuffer::CopyFromIovec(&allocator, &iov,
/* iov_count = */ 1,
/* iov_offset = */ 0, buffer_length);
EXPECT_TRUE(buffer.empty());
buffer = QuicheBuffer::CopyFromIovec(&allocator, &iov,
/* iov_count = */ 1,
/* iov_offset = */ 3, buffer_length);
EXPECT_TRUE(buffer.empty());
}
TEST(QuicheBuffer, CopyFromIovecSimple) {
constexpr absl::string_view kData("foobar");
iovec iov = MakeIOVector(kData);
SimpleBufferAllocator allocator;
QuicheBuffer buffer =
QuicheBuffer::CopyFromIovec(&allocator, &iov,
/* iov_count = */ 1, /* iov_offset = */ 0,
/* buffer_length = */ 6);
EXPECT_EQ("foobar", buffer.AsStringView());
buffer =
QuicheBuffer::CopyFromIovec(&allocator, &iov,
/* iov_count = */ 1, /* iov_offset = */ 0,
/* buffer_length = */ 3);
EXPECT_EQ("foo", buffer.AsStringView());
buffer =
QuicheBuffer::CopyFromIovec(&allocator, &iov,
/* iov_count = */ 1, /* iov_offset = */ 3,
/* buffer_length = */ 3);
EXPECT_EQ("bar", buffer.AsStringView());
buffer =
QuicheBuffer::CopyFromIovec(&allocator, &iov,
/* iov_count = */ 1, /* iov_offset = */ 1,
/* buffer_length = */ 4);
EXPECT_EQ("ooba", buffer.AsStringView());
}
TEST(QuicheBuffer, CopyFromIovecMultiple) {
constexpr absl::string_view kData1("foo");
constexpr absl::string_view kData2("bar");
iovec iov[] = {MakeIOVector(kData1), MakeIOVector(kData2)};
SimpleBufferAllocator allocator;
QuicheBuffer buffer =
QuicheBuffer::CopyFromIovec(&allocator, &iov[0],
/* iov_count = */ 2, /* iov_offset = */ 0,
/* buffer_length = */ 6);
EXPECT_EQ("foobar", buffer.AsStringView());
buffer =
QuicheBuffer::CopyFromIovec(&allocator, &iov[0],
/* iov_count = */ 2, /* iov_offset = */ 0,
/* buffer_length = */ 3);
EXPECT_EQ("foo", buffer.AsStringView());
buffer =
QuicheBuffer::CopyFromIovec(&allocator, &iov[0],
/* iov_count = */ 2, /* iov_offset = */ 3,
/* buffer_length = */ 3);
EXPECT_EQ("bar", buffer.AsStringView());
buffer =
QuicheBuffer::CopyFromIovec(&allocator, &iov[0],
/* iov_count = */ 2, /* iov_offset = */ 1,
/* buffer_length = */ 4);
EXPECT_EQ("ooba", buffer.AsStringView());
}
TEST(QuicheBuffer, CopyFromIovecOffsetTooLarge) {
constexpr absl::string_view kData1("foo");
constexpr absl::string_view kData2("bar");
iovec iov[] = {MakeIOVector(kData1), MakeIOVector(kData2)};
SimpleBufferAllocator allocator;
EXPECT_QUICHE_BUG(
QuicheBuffer::CopyFromIovec(&allocator, &iov[0],
/* iov_count = */ 2, /* iov_offset = */ 10,
/* buffer_length = */ 6),
"iov_offset larger than iovec total size");
}
TEST(QuicheBuffer, CopyFromIovecTooManyBytesRequested) {
constexpr absl::string_view kData1("foo");
constexpr absl::string_view kData2("bar");
iovec iov[] = {MakeIOVector(kData1), MakeIOVector(kData2)};
SimpleBufferAllocator allocator;
EXPECT_QUICHE_BUG(
QuicheBuffer::CopyFromIovec(&allocator, &iov[0],
/* iov_count = */ 2, /* iov_offset = */ 2,
/* buffer_length = */ 10),
R"(iov_offset \+ buffer_length larger than iovec total size)");
}
} // anonymous namespace
} // namespace test
} // namespace quiche