]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/beast/test/beast/http/chunk_encode.cpp
2 // Copyright (c) 2016-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)
7 // Official repository: https://github.com/boostorg/beast
10 // Test that header file is self-contained.
11 #include <boost/beast/http/chunk_encode.hpp>
13 #include "message_fuzz.hpp"
15 #include <boost/beast/core/static_string.hpp>
16 #include <boost/beast/http/fields.hpp>
17 #include <boost/beast/test/fuzz.hpp>
18 #include <boost/beast/unit_test/suite.hpp>
19 #include <boost/optional.hpp>
26 class chunk_encode_test
27 : public beast::unit_test::suite
30 struct not_chunk_extensions
{};
33 detail::is_chunk_extensions
<chunk_extensions
>::value
);
36 ! detail::is_chunk_extensions
<not_chunk_extensions
>::value
);
38 template<class ConstBufferSequence
>
41 to_string(ConstBufferSequence
const& buffers
)
44 s
.reserve(boost::asio::buffer_size(buffers
));
45 for(boost::asio::const_buffer b
: beast::detail::buffers_range(buffers
))
47 reinterpret_cast<char const*>(b
.data()),
52 template<class T
, class... Args
>
54 check(string_view match
, Args
&&... args
)
56 T
t(std::forward
<Args
>(args
)...);
57 BEAST_EXPECT(to_string(t
) == match
);
59 BEAST_EXPECT(to_string(t2
) == match
);
61 BEAST_EXPECT(to_string(t3
) == match
);
64 template<class T
, class... Args
>
66 check_fwd(string_view match
, Args
&&... args
)
68 T
t(std::forward
<Args
>(args
)...);
69 BEAST_EXPECT(to_string(t
) == match
);
71 BEAST_EXPECT(to_string(t2
) == match
);
73 BEAST_EXPECT(to_string(t3
) == match
);
76 using cb_t
= boost::asio::const_buffer
;
82 return {s
.data(), s
.size()};
88 #if ! defined(BOOST_GCC) || BOOST_GCC >= 50000
89 check
<chunk_crlf
>("\r\n");
96 check
<chunk_header
>("10\r\n", 16u);
98 check
<chunk_header
>("20;x\r\n", 32u, ";x");
100 chunk_extensions exts
;
104 check
<chunk_header
>("30;y;z\r\n", 48u, exts
);
109 check_fwd
<chunk_header
>(
110 "30;y;z\r\n", 48u, std::move(exts2
));
113 check
<chunk_header
>("30;y;z\r\n", 48u, exts
,
114 std::allocator
<double>{});
120 "30;y;z\r\n", 48u, std::move(exts2
),
121 std::allocator
<double>{});
128 check
<chunk_body
<cb_t
>>(
129 "3\r\n***\r\n", cb("***"));
131 check
<chunk_body
<cb_t
>>(
132 "3;x\r\n***\r\n", cb("***"), ";x");
134 chunk_extensions exts
;
138 check
<chunk_body
<cb_t
>>(
145 check_fwd
<chunk_body
<cb_t
>>(
147 cb("***"), std::move(exts2
));
150 check
<chunk_body
<cb_t
>>(
152 cb("***"), exts
, std::allocator
<double>{});
157 check_fwd
<chunk_body
<cb_t
>>(
159 cb("***"), std::move(exts2
),
160 std::allocator
<double>{});
170 check
<chunk_last
<cb_t
>>(
171 "0\r\nMD5:ou812\r\n\r\n",
172 cb("MD5:ou812\r\n\r\n"));
175 trailers
.set(field::content_md5
, "ou812");
177 check
<chunk_last
<fields
>>(
178 "0\r\nContent-MD5: ou812\r\n\r\n",
182 auto trailers2
= trailers
;
184 check_fwd
<chunk_last
<fields
>>(
185 "0\r\nContent-MD5: ou812\r\n\r\n",
186 std::move(trailers2
));
189 check
<chunk_last
<fields
>>(
190 "0\r\nContent-MD5: ou812\r\n\r\n",
191 trailers
, std::allocator
<double>{});
194 auto trailers2
= trailers
;
196 check
<chunk_last
<fields
>>(
197 "0\r\nContent-MD5: ou812\r\n\r\n",
198 std::move(trailers2
), std::allocator
<double>{});
203 testChunkExtensions()
206 [](chunk_extensions
const& ce
)
209 for(auto const& v
: ce
)
211 s
.append(v
.first
.to_string());
213 if(! v
.second
.empty())
215 s
.append(v
.second
.to_string());
223 BEAST_EXPECT(ce
.str() == ";x");
224 BEAST_EXPECT(str(ce
) == "x,");
226 BEAST_EXPECT(ce
.str() == ";x;y=z");
227 BEAST_EXPECT(str(ce
) == "x,y,z,");
228 ce
.insert("z", R
"(")");
229 BEAST_EXPECT(ce.str() == R"(;x
;y
=z
;z
="\"")");
230 BEAST_EXPECT(str(ce) == R"(x
,y
,z
,z
,",)");
231 ce
.insert("p", R
"(\)");
232 BEAST_EXPECT(ce
.str() == R
"(;x;y=z;z="\"";p="\\")");
233 BEAST_EXPECT(str(ce
) == R
"(x,y,z,z,",p
,\
,)");
234 ce.insert("q
", R"(1"2\)");
235 BEAST_EXPECT(ce
.str() == R
"(;x;y=z;z="\"";p="\\";q="1\"2\\")");
236 BEAST_EXPECT(str(ce
) == R
"(x,y,z,z,",p
,\
,q
,1"2\,)");
240 testParseChunkExtensions()
246 static_string
<200> ss
{s
};
248 for(auto i
= 3; i
--;)
250 test::fuzz(ss
, 5, 5, r
,
261 c2
.parse(c1
.str(), ec
);
262 if(! BEAST_EXPECTS(! ec
, ec
.message()))
265 for(auto const& v
: c2
)
269 c3
.insert(v
.first
, v
.second
);
270 BEAST_EXPECTS(c2
.str() == c3
.str(), c3
.str());
280 BEAST_EXPECTS(! ec
, ec
.message());
292 chunkExtensionsTest(good
, bad
);
302 testChunkExtensions();
303 testParseChunkExtensions();
307 BEAST_DEFINE_TESTSUITE(beast
,http
,chunk_encode
);