blob: a13899d443e9648d1e5e6ebb810caa91d6ab22a7 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice_storage.h"
QUICHE teamea197352019-07-16 16:54:52 -07006
QUICHE teama6ef0a62019-03-07 20:34:33 -05007#include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h"
8#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
QUICHE teamea197352019-07-16 16:54:52 -07009#include "net/third_party/quiche/src/quic/platform/api/quic_test_mem_slice_vector.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050010
11namespace quic {
12namespace test {
13namespace {
14
15class QuicMemSliceStorageImplTest : public QuicTest {
16 public:
17 QuicMemSliceStorageImplTest() = default;
18};
19
20TEST_F(QuicMemSliceStorageImplTest, EmptyIov) {
21 QuicMemSliceStorage storage(nullptr, 0, nullptr, 1024);
22 EXPECT_TRUE(storage.ToSpan().empty());
23}
24
25TEST_F(QuicMemSliceStorageImplTest, SingleIov) {
26 SimpleBufferAllocator allocator;
vasilvvc48c8712019-03-11 13:38:16 -070027 std::string body(3, 'c');
QUICHE teama6ef0a62019-03-07 20:34:33 -050028 struct iovec iov = {const_cast<char*>(body.data()), body.length()};
29 QuicMemSliceStorage storage(&iov, 1, &allocator, 1024);
30 auto span = storage.ToSpan();
31 EXPECT_EQ("ccc", span.GetData(0));
32 EXPECT_NE(static_cast<const void*>(span.GetData(0).data()), body.data());
33}
34
35TEST_F(QuicMemSliceStorageImplTest, MultipleIovInSingleSlice) {
36 SimpleBufferAllocator allocator;
vasilvvc48c8712019-03-11 13:38:16 -070037 std::string body1(3, 'a');
38 std::string body2(4, 'b');
QUICHE teama6ef0a62019-03-07 20:34:33 -050039 struct iovec iov[] = {{const_cast<char*>(body1.data()), body1.length()},
40 {const_cast<char*>(body2.data()), body2.length()}};
41
42 QuicMemSliceStorage storage(iov, 2, &allocator, 1024);
43 auto span = storage.ToSpan();
44 EXPECT_EQ("aaabbbb", span.GetData(0));
45}
46
47TEST_F(QuicMemSliceStorageImplTest, MultipleIovInMultipleSlice) {
48 SimpleBufferAllocator allocator;
vasilvvc48c8712019-03-11 13:38:16 -070049 std::string body1(4, 'a');
50 std::string body2(4, 'b');
QUICHE teama6ef0a62019-03-07 20:34:33 -050051 struct iovec iov[] = {{const_cast<char*>(body1.data()), body1.length()},
52 {const_cast<char*>(body2.data()), body2.length()}};
53
54 QuicMemSliceStorage storage(iov, 2, &allocator, 4);
55 auto span = storage.ToSpan();
56 EXPECT_EQ("aaaa", span.GetData(0));
57 EXPECT_EQ("bbbb", span.GetData(1));
58}
59
QUICHE teamea197352019-07-16 16:54:52 -070060TEST_F(QuicMemSliceStorageImplTest, AppendMemSlices) {
61 std::string body1(3, 'a');
62 std::string body2(4, 'b');
63 std::vector<std::pair<char*, size_t>> buffers;
64 buffers.push_back(
65 std::make_pair(const_cast<char*>(body1.data()), body1.length()));
66 buffers.push_back(
67 std::make_pair(const_cast<char*>(body2.data()), body2.length()));
68 QuicTestMemSliceVector mem_slices(buffers);
69
70 QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
71 mem_slices.span().ConsumeAll(
72 [&storage](QuicMemSlice slice) { storage.Append(std::move(slice)); });
73
74 EXPECT_EQ("aaa", storage.ToSpan().GetData(0));
75 EXPECT_EQ("bbbb", storage.ToSpan().GetData(1));
76}
77
QUICHE teama6ef0a62019-03-07 20:34:33 -050078} // namespace
79} // namespace test
80} // namespace quic