]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/json/test/limits.cpp
2 // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.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/json
10 #include <boost/json/array.hpp>
11 #include <boost/json/object.hpp>
12 #include <boost/json/string.hpp>
13 #include <boost/json/value.hpp>
14 #include <boost/json/parse.hpp>
15 #include <boost/json/stream_parser.hpp>
19 #include "test_suite.hpp"
25 This translation unit exercises code paths
26 related to library limits such as max string
38 std::initializer_list
<std::pair
<
39 string_view
, value_ref
>> init
= {
40 { "1", 1},{ "2", 2},{ "3", 3},{ "4", 4},{ "5", 5},
41 { "6", 6},{ "7", 7},{ "8", 8},{ "9", 9},{"10",10},
42 {"11",11},{"12",12},{"13",13},{"14",14},{"15",15},
43 {"16",16},{"17",17},{"18",18},{"19",19},{"10",10},
44 {"21",21},{"22",22},{"23",23},{"24",24},{"25",25},
45 {"26",26},{"27",27},{"28",28},{"29",29},{"30",30},
47 BOOST_TEST(init
.size() > object::max_size());
48 BOOST_TEST_THROWS(value
{init
}, std::length_error
);
58 object(object::max_size()+1),
64 std::initializer_list
<std::pair
<
65 string_view
, value_ref
>> init
= {
66 { "1", 1},{ "2", 2},{ "3", 3},{ "4", 4},{ "5", 5},
67 { "6", 6},{ "7", 7},{ "8", 8},{ "9", 9},{"10",10},
68 {"11",11},{"12",12},{"13",13},{"14",14},{"15",15},
69 {"16",16},{"17",17},{"18",18},{"19",19},{"10",10},
70 {"21",21},{"22",22},{"23",23},{"24",24},{"25",25},
71 {"26",26},{"27",27},{"28",28},{"29",29},{"30",30},
73 BOOST_TEST(init
.size() > object::max_size());
78 object(init
.begin(), init
.end()),
82 make_input_iterator(init
.begin()),
83 make_input_iterator(init
.end())),
87 // reserve(), max size
91 o
.reserve(o
.max_size() + 1),
97 std::initializer_list
<std::pair
<
98 string_view
, value_ref
>> init
= {
99 { "1", 1},{ "2", 2},{ "3", 3},{ "4", 4},{ "5", 5},
100 { "6", 6},{ "7", 7},{ "8", 8},{ "9", 9},{"10",10},
101 {"11",11},{"12",12},{"13",13},{"14",14},{"15",15},
102 {"16",16},{"17",17},{"18",18},{"19",19},{"10",10},
103 {"21",21},{"22",22},{"23",23},{"24",24},{"25",25},
104 {"26",26},{"27",27},{"28",28},{"29",29},{"30",30},
106 BOOST_TEST(init
.size() > object::max_size());
112 o
.insert(init
.begin(), init
.end()),
116 make_input_iterator(init
.begin()),
117 make_input_iterator(init
.end())),
123 std::string
const big(
124 string::max_size() + 1, '*');
126 object({ {big
, nullptr} }),
134 obj
.reserve(object::max_size() + 1),
152 array::max_size()+1, 42);
154 array(v
.begin(), v
.end()),
160 array::max_size()+1, 42);
161 BOOST_TEST_THROWS(array(
162 make_input_iterator(v
.begin()),
163 make_input_iterator(v
.end())),
171 array::max_size() + 1,
185 (s
.resize(s
.max_size() + 1)),
193 (s
.append(s
.max_size() - 1, '*')),
199 s
.resize(s
.max_size() - 5);
201 (s
.replace(0, 1, s
.subview(0, 10))),
207 s
.resize(s
.max_size() - 5);
209 (s
.replace(0, 1, 10, 'a')),
215 s
.resize(s
.max_size() - 5);
217 (s
.insert(0, s
.subview(0, 10))),
223 // VFALCO tsan doesn't like this
227 s
.resize(s
.max_size() - 1);
229 catch(std::exception
const&)
239 std::string
const big(
240 string::max_size() + 1, '*');
242 "\"" + big
+ "\":null";
244 auto jv
= parse(js
, ec
);
245 BOOST_TEST(ec
== error::string_too_large
);
246 BOOST_TEST(ec
.has_location());
252 std::string
const big(
253 string::max_size() + 1, '*');
255 "{\"" + big
+ "\":null}";
257 auto jv
= parse(js
, ec
);
258 BOOST_TEST(ec
== error::key_too_large
);
259 BOOST_TEST(ec
.has_location());
266 // string buffer flush
269 "\"\\na\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
270 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
271 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
272 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
273 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
274 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
275 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
276 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
277 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
278 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
279 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
280 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
281 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
282 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
283 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
284 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
285 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
286 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
287 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n"
288 "\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\"";
290 auto jv
= parse(s
, ec
);
293 // overflow in on_key_part
299 string::max_size()*2, '*');
301 "{\"" + big
+ "\":null}";
302 auto jv
= parse(js
, ec
);
303 BOOST_TEST(ec
== error::key_too_large
);
304 BOOST_TEST(ec
.has_location());
307 // overflow in on_key
313 (string::max_size()*3)/2, '*');
315 "{\"" + big
+ "\":null}";
316 auto jv
= parse(js
, ec
);
317 BOOST_TEST(ec
== error::key_too_large
);
318 BOOST_TEST(ec
.has_location());
321 // overflow in on_string_part
327 string::max_size()*2, '*');
330 auto jv
= parse(js
, ec
);
331 BOOST_TEST(ec
== error::string_too_large
);
332 BOOST_TEST(ec
.has_location());
335 // overflow in on_string
341 (string::max_size()*3)/2, '*');
344 auto jv
= parse(js
, ec
);
345 BOOST_TEST(ec
== error::string_too_large
);
346 BOOST_TEST(ec
.has_location());
354 "00":0,"01":0,"02":0,"03":0,"04":0,"05":0,"06":0,"07":0,"08":0,"09":0,
355 "10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,
359 auto jv
= parse(s
, ec
);
360 BOOST_TEST(ec
== error::object_too_large
);
361 BOOST_TEST(ec
.has_location());
368 "0,0,0,0,0,0,0,0,0,0,"
369 "0,0,0,0,0,0,0,0,0,0,"
372 auto jv
= parse(s
, ec
);
373 BOOST_TEST(ec
== error::array_too_large
);
374 BOOST_TEST(ec
.has_location());
381 #if ! defined(BOOST_JSON_NO_MAX_STRUCTURED_SIZE) && \
382 ! defined(BOOST_JSON_NO_MAX_STRING_SIZE) && \
383 ! defined(BOOST_JSON_NO_MAX_STACK_SIZE) && \
384 ! defined(BOOST_JSON_NO_STACK_BUFFER_SIZE)
398 TEST_SUITE(limits_test
, "boost.json.limits");