]> git.proxmox.com Git - ceph.git/blame - ceph/src/Beast/test/core/static_streambuf.cpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / Beast / test / core / static_streambuf.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/static_streambuf.hpp>
10
11#include <beast/unit_test/suite.hpp>
12#include <boost/asio/buffer.hpp>
13#include <string>
14
15namespace beast {
16
17class static_streambuf_test : public beast::unit_test::suite
18{
19public:
20 template<class ConstBufferSequence>
21 static
22 std::string
23 to_string(ConstBufferSequence const& bs)
24 {
25 using boost::asio::buffer_cast;
26 using boost::asio::buffer_size;
27 std::string s;
28 s.reserve(buffer_size(bs));
29 for(auto const& b : bs)
30 s.append(buffer_cast<char const*>(b),
31 buffer_size(b));
32 return s;
33 }
34
35 void testStaticStreambuf()
36 {
37 using boost::asio::buffer;
38 using boost::asio::buffer_cast;
39 using boost::asio::buffer_size;
40 char buf[12];
41 std::string const s = "Hello, world";
42 BEAST_EXPECT(s.size() == sizeof(buf));
43 for(std::size_t i = 1; i < 4; ++i) {
44 for(std::size_t j = 1; j < 4; ++j) {
45 for(std::size_t x = 1; x < 4; ++x) {
46 for(std::size_t y = 1; y < 4; ++y) {
47 for(std::size_t t = 1; t < 4; ++ t) {
48 for(std::size_t u = 1; u < 4; ++ u) {
49 std::size_t z = sizeof(buf) - (x + y);
50 std::size_t v = sizeof(buf) - (t + u);
51 {
52 std::memset(buf, 0, sizeof(buf));
53 static_streambuf_n<sizeof(buf)> ba;
54 {
55 auto d = ba.prepare(z);
56 BEAST_EXPECT(buffer_size(d) == z);
57 }
58 {
59 auto d = ba.prepare(0);
60 BEAST_EXPECT(buffer_size(d) == 0);
61 }
62 {
63 auto d = ba.prepare(y);
64 BEAST_EXPECT(buffer_size(d) == y);
65 }
66 {
67 auto d = ba.prepare(x);
68 BEAST_EXPECT(buffer_size(d) == x);
69 ba.commit(buffer_copy(d, buffer(s.data(), x)));
70 }
71 BEAST_EXPECT(ba.size() == x);
72 BEAST_EXPECT(buffer_size(ba.data()) == ba.size());
73 {
74 auto d = ba.prepare(x);
75 BEAST_EXPECT(buffer_size(d) == x);
76 }
77 {
78 auto d = ba.prepare(0);
79 BEAST_EXPECT(buffer_size(d) == 0);
80 }
81 {
82 auto d = ba.prepare(z);
83 BEAST_EXPECT(buffer_size(d) == z);
84 }
85 {
86 auto d = ba.prepare(y);
87 BEAST_EXPECT(buffer_size(d) == y);
88 ba.commit(buffer_copy(d, buffer(s.data()+x, y)));
89 }
90 ba.commit(1);
91 BEAST_EXPECT(ba.size() == x + y);
92 BEAST_EXPECT(buffer_size(ba.data()) == ba.size());
93 {
94 auto d = ba.prepare(x);
95 BEAST_EXPECT(buffer_size(d) == x);
96 }
97 {
98 auto d = ba.prepare(y);
99 BEAST_EXPECT(buffer_size(d) == y);
100 }
101 {
102 auto d = ba.prepare(0);
103 BEAST_EXPECT(buffer_size(d) == 0);
104 }
105 {
106 auto d = ba.prepare(z);
107 BEAST_EXPECT(buffer_size(d) == z);
108 ba.commit(buffer_copy(d, buffer(s.data()+x+y, z)));
109 }
110 ba.commit(2);
111 BEAST_EXPECT(ba.size() == x + y + z);
112 BEAST_EXPECT(buffer_size(ba.data()) == ba.size());
113 BEAST_EXPECT(to_string(ba.data()) == s);
114 ba.consume(t);
115 {
116 auto d = ba.prepare(0);
117 BEAST_EXPECT(buffer_size(d) == 0);
118 }
119 BEAST_EXPECT(to_string(ba.data()) == s.substr(t, std::string::npos));
120 ba.consume(u);
121 BEAST_EXPECT(to_string(ba.data()) == s.substr(t + u, std::string::npos));
122 ba.consume(v);
123 BEAST_EXPECT(to_string(ba.data()) == "");
124 ba.consume(1);
125 {
126 auto d = ba.prepare(0);
127 BEAST_EXPECT(buffer_size(d) == 0);
128 }
129 try
130 {
131 ba.prepare(1);
132 fail();
133 }
134 catch(...)
135 {
136 pass();
137 }
138 }
139 }}}}}}
140 }
141
142 void testIterators()
143 {
144 static_streambuf_n<2> ba;
145 {
146 auto mb = ba.prepare(2);
147 std::size_t n;
148 n = 0;
149 for(auto it = mb.begin();
150 it != mb.end(); it++)
151 ++n;
152 BEAST_EXPECT(n == 1);
153 mb = ba.prepare(2);
154 n = 0;
155 for(auto it = mb.begin();
156 it != mb.end(); ++it)
157 ++n;
158 BEAST_EXPECT(n == 1);
159 mb = ba.prepare(2);
160 n = 0;
161 for(auto it = mb.end();
162 it != mb.begin(); it--)
163 ++n;
164 BEAST_EXPECT(n == 1);
165 mb = ba.prepare(2);
166 n = 0;
167 for(auto it = mb.end();
168 it != mb.begin(); --it)
169 ++n;
170 BEAST_EXPECT(n == 1);
171 }
172 ba.prepare(2);
173 ba.commit(1);
174 std::size_t n;
175 n = 0;
176 for(auto it = ba.data().begin();
177 it != ba.data().end(); it++)
178 ++n;
179 BEAST_EXPECT(n == 1);
180 n = 0;
181 for(auto it = ba.data().begin();
182 it != ba.data().end(); ++it)
183 ++n;
184 BEAST_EXPECT(n == 1);
185 n = 0;
186 for(auto it = ba.data().end();
187 it != ba.data().begin(); it--)
188 ++n;
189 BEAST_EXPECT(n == 1);
190 n = 0;
191 for(auto it = ba.data().end();
192 it != ba.data().begin(); --it)
193 ++n;
194 BEAST_EXPECT(n == 1);
195 }
196
197 void run() override
198 {
199 testStaticStreambuf();
200 testIterators();
201 }
202};
203
204BEAST_DEFINE_TESTSUITE(static_streambuf,core,beast);
205
206} // beastp