]>
git.proxmox.com Git - ceph.git/blob - ceph/src/Beast/test/core/prepare_buffers.cpp
2 // Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
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)
8 // Test that header file is self-contained.
9 #include <beast/core/prepare_buffers.hpp>
11 #include <beast/core/consuming_buffers.hpp>
12 #include <beast/unit_test/suite.hpp>
13 #include <boost/asio/buffer.hpp>
18 class prepare_buffers_test
: public beast::unit_test::suite
21 template<class ConstBufferSequence
>
24 bsize1(ConstBufferSequence
const& bs
)
26 using boost::asio::buffer_size
;
28 for(auto it
= bs
.begin(); it
!= bs
.end(); ++it
)
29 n
+= buffer_size(*it
);
33 template<class ConstBufferSequence
>
36 bsize2(ConstBufferSequence
const& bs
)
38 using boost::asio::buffer_size
;
40 for(auto it
= bs
.begin(); it
!= bs
.end(); it
++)
41 n
+= buffer_size(*it
);
45 template<class ConstBufferSequence
>
48 bsize3(ConstBufferSequence
const& bs
)
50 using boost::asio::buffer_size
;
52 for(auto it
= bs
.end(); it
!= bs
.begin();)
53 n
+= buffer_size(*--it
);
57 template<class ConstBufferSequence
>
60 bsize4(ConstBufferSequence
const& bs
)
62 using boost::asio::buffer_size
;
64 for(auto it
= bs
.end(); it
!= bs
.begin();)
67 n
+= buffer_size(*it
);
72 template<class ConstBufferSequence
>
75 to_string(ConstBufferSequence
const& bs
)
77 using boost::asio::buffer_cast
;
78 using boost::asio::buffer_size
;
80 s
.reserve(buffer_size(bs
));
81 for(auto const& b
: bs
)
82 s
.append(buffer_cast
<char const*>(b
),
87 template<class BufferType
>
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
);
97 std::array
<BufferType
, 3> bs
{{
100 BufferType
{&s
[x
+y
], z
}}};
101 for(std::size_t i
= 0; i
<= s
.size() + 1; ++i
)
103 auto pb
= prepare_buffers(i
, bs
);
104 BEAST_EXPECT(to_string(pb
) == s
.substr(0, i
));
106 BEAST_EXPECT(to_string(pb2
) == to_string(pb
));
107 pb
= prepare_buffers(0, bs
);
109 BEAST_EXPECT(buffer_size(pb2
) == 0);
110 pb2
= prepare_buffers(i
, bs
);
111 BEAST_EXPECT(to_string(pb2
) == s
.substr(0, i
));
117 void testNullBuffers()
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);
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);
133 BEAST_EXPECT(buffer_size(cb
) == 0);
134 BEAST_EXPECT(buffer_copy(cb
, pb1
) == 0);
136 auto pbc
= prepare_buffers(2, cb
);
137 BEAST_EXPECT(buffer_size(pbc
) == 0);
138 BEAST_EXPECT(buffer_copy(pbc
, cb
) == 0);
143 using boost::asio::buffer_size
;
144 using boost::asio::const_buffer
;
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);
156 for(auto it
= pb
.end(); it
!= pb
.begin(); --it
)
158 decltype(pb
)::const_iterator
it2(std::move(it
));
159 BEAST_EXPECT(buffer_size(*it2
) == 1);
163 BEAST_EXPECT(n
== 2);
168 testMatrix
<boost::asio::const_buffer
>();
169 testMatrix
<boost::asio::mutable_buffer
>();
175 BEAST_DEFINE_TESTSUITE(prepare_buffers
,core
,beast
);