]> git.proxmox.com Git - ceph.git/blame - ceph/src/Beast/test/core/prepare_buffers.cpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / Beast / test / core / prepare_buffers.cpp
CommitLineData
7c673cae
FG
1//
2// Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
3//
4// Distributed under the Boost Software License, Version 1.0. (See accompanying
5// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6//
7
8// Test that header file is self-contained.
9#include <beast/core/prepare_buffers.hpp>
10
11#include <beast/core/consuming_buffers.hpp>
12#include <beast/unit_test/suite.hpp>
13#include <boost/asio/buffer.hpp>
14#include <string>
15
16namespace beast {
17
18class prepare_buffers_test : public beast::unit_test::suite
19{
20public:
21 template<class ConstBufferSequence>
22 static
23 std::size_t
24 bsize1(ConstBufferSequence const& bs)
25 {
26 using boost::asio::buffer_size;
27 std::size_t n = 0;
28 for(auto it = bs.begin(); it != bs.end(); ++it)
29 n += buffer_size(*it);
30 return n;
31 }
32
33 template<class ConstBufferSequence>
34 static
35 std::size_t
36 bsize2(ConstBufferSequence const& bs)
37 {
38 using boost::asio::buffer_size;
39 std::size_t n = 0;
40 for(auto it = bs.begin(); it != bs.end(); it++)
41 n += buffer_size(*it);
42 return n;
43 }
44
45 template<class ConstBufferSequence>
46 static
47 std::size_t
48 bsize3(ConstBufferSequence const& bs)
49 {
50 using boost::asio::buffer_size;
51 std::size_t n = 0;
52 for(auto it = bs.end(); it != bs.begin();)
53 n += buffer_size(*--it);
54 return n;
55 }
56
57 template<class ConstBufferSequence>
58 static
59 std::size_t
60 bsize4(ConstBufferSequence const& bs)
61 {
62 using boost::asio::buffer_size;
63 std::size_t n = 0;
64 for(auto it = bs.end(); it != bs.begin();)
65 {
66 it--;
67 n += buffer_size(*it);
68 }
69 return n;
70 }
71
72 template<class ConstBufferSequence>
73 static
74 std::string
75 to_string(ConstBufferSequence const& bs)
76 {
77 using boost::asio::buffer_cast;
78 using boost::asio::buffer_size;
79 std::string s;
80 s.reserve(buffer_size(bs));
81 for(auto const& b : bs)
82 s.append(buffer_cast<char const*>(b),
83 buffer_size(b));
84 return s;
85 }
86
87 template<class BufferType>
88 void testMatrix()
89 {
90 using boost::asio::buffer_size;
91 std::string s = "Hello, world";
92 BEAST_EXPECT(s.size() == 12);
93 for(std::size_t x = 1; x < 4; ++x) {
94 for(std::size_t y = 1; y < 4; ++y) {
95 std::size_t z = s.size() - (x + y);
96 {
97 std::array<BufferType, 3> bs{{
98 BufferType{&s[0], x},
99 BufferType{&s[x], y},
100 BufferType{&s[x+y], z}}};
101 for(std::size_t i = 0; i <= s.size() + 1; ++i)
102 {
103 auto pb = prepare_buffers(i, bs);
104 BEAST_EXPECT(to_string(pb) == s.substr(0, i));
105 auto pb2 = pb;
106 BEAST_EXPECT(to_string(pb2) == to_string(pb));
107 pb = prepare_buffers(0, bs);
108 pb2 = pb;
109 BEAST_EXPECT(buffer_size(pb2) == 0);
110 pb2 = prepare_buffers(i, bs);
111 BEAST_EXPECT(to_string(pb2) == s.substr(0, i));
112 }
113 }
114 }}
115 }
116
117 void testNullBuffers()
118 {
119 using boost::asio::buffer_copy;
120 using boost::asio::buffer_size;
121 using boost::asio::null_buffers;
122 auto pb0 = prepare_buffers(0, null_buffers{});
123 BEAST_EXPECT(buffer_size(pb0) == 0);
124 auto pb1 = prepare_buffers(1, null_buffers{});
125 BEAST_EXPECT(buffer_size(pb1) == 0);
126 BEAST_EXPECT(buffer_copy(pb0, pb1) == 0);
127
128 using pb_type = decltype(pb0);
129 consuming_buffers<pb_type> cb(pb0);
130 BEAST_EXPECT(buffer_size(cb) == 0);
131 BEAST_EXPECT(buffer_copy(cb, pb1) == 0);
132 cb.consume(1);
133 BEAST_EXPECT(buffer_size(cb) == 0);
134 BEAST_EXPECT(buffer_copy(cb, pb1) == 0);
135
136 auto pbc = prepare_buffers(2, cb);
137 BEAST_EXPECT(buffer_size(pbc) == 0);
138 BEAST_EXPECT(buffer_copy(pbc, cb) == 0);
139 }
140
141 void testIterator()
142 {
143 using boost::asio::buffer_size;
144 using boost::asio::const_buffer;
145 char b[3];
146 std::array<const_buffer, 3> bs{{
147 const_buffer{&b[0], 1},
148 const_buffer{&b[1], 1},
149 const_buffer{&b[2], 1}}};
150 auto pb = prepare_buffers(2, bs);
151 BEAST_EXPECT(bsize1(pb) == 2);
152 BEAST_EXPECT(bsize2(pb) == 2);
153 BEAST_EXPECT(bsize3(pb) == 2);
154 BEAST_EXPECT(bsize4(pb) == 2);
155 std::size_t n = 0;
156 for(auto it = pb.end(); it != pb.begin(); --it)
157 {
158 decltype(pb)::const_iterator it2(std::move(it));
159 BEAST_EXPECT(buffer_size(*it2) == 1);
160 it = std::move(it2);
161 ++n;
162 }
163 BEAST_EXPECT(n == 2);
164 }
165
166 void run() override
167 {
168 testMatrix<boost::asio::const_buffer>();
169 testMatrix<boost::asio::mutable_buffer>();
170 testNullBuffers();
171 testIterator();
172 }
173};
174
175BEAST_DEFINE_TESTSUITE(prepare_buffers,core,beast);
176
177} // beast