]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/json/test/limits.cpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / libs / json / test / limits.cpp
1 //
2 // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.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 // Official repository: https://github.com/boostorg/json
8 //
9
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>
16
17 #include <vector>
18
19 #include "test_suite.hpp"
20 #include "test.hpp"
21
22 BOOST_JSON_NS_BEGIN
23
24 /*
25 This translation unit exercises code paths
26 related to library limits such as max string
27 length.
28 */
29
30 class limits_test
31 {
32 public:
33 void
34 testValue()
35 {
36 // object too large
37 {
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},
46 {"31",31}};
47 BOOST_TEST(init.size() > object::max_size());
48 BOOST_TEST_THROWS(value{init}, std::length_error);
49 }
50 }
51
52 void
53 testObject()
54 {
55 // max_size()
56 {
57 BOOST_TEST_THROWS(
58 object(object::max_size()+1),
59 std::length_error);
60 }
61
62 // object(), max size
63 {
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},
72 {"31",31}};
73 BOOST_TEST(init.size() > object::max_size());
74 BOOST_TEST_THROWS(
75 object(init),
76 std::length_error);
77 BOOST_TEST_THROWS(
78 object(init.begin(), init.end()),
79 std::length_error);
80 BOOST_TEST_THROWS(
81 object(
82 make_input_iterator(init.begin()),
83 make_input_iterator(init.end())),
84 std::length_error);
85 }
86
87 // reserve(), max size
88 {
89 object o;
90 BOOST_TEST_THROWS(
91 o.reserve(o.max_size() + 1),
92 std::length_error);
93 }
94
95 // insert(), max size
96 {
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},
105 {"31",31}};
106 BOOST_TEST(init.size() > object::max_size());
107 object o;
108 BOOST_TEST_THROWS(
109 o.insert(init),
110 std::length_error);
111 BOOST_TEST_THROWS(
112 o.insert(init.begin(), init.end()),
113 std::length_error);
114 BOOST_TEST_THROWS(
115 o.insert(
116 make_input_iterator(init.begin()),
117 make_input_iterator(init.end())),
118 std::length_error);
119 }
120
121 // max key size
122 {
123 std::string const big(
124 string::max_size() + 1, '*');
125 BOOST_TEST_THROWS(
126 object({ {big, nullptr} }),
127 std::length_error);
128 }
129
130 // reserve
131 {
132 object obj;
133 BOOST_TEST_THROWS(
134 obj.reserve(object::max_size() + 1),
135 std::length_error);
136 }
137 }
138
139 void
140 testArray()
141 {
142 {
143 BOOST_TEST_THROWS(
144 array(
145 array::max_size()+1,
146 value(nullptr)),
147 std::length_error);
148 }
149
150 {
151 std::vector<int> v(
152 array::max_size()+1, 42);
153 BOOST_TEST_THROWS(
154 array(v.begin(), v.end()),
155 std::length_error);
156 }
157
158 {
159 std::vector<int> v(
160 array::max_size()+1, 42);
161 BOOST_TEST_THROWS(array(
162 make_input_iterator(v.begin()),
163 make_input_iterator(v.end())),
164 std::length_error);
165 }
166
167 {
168 array a;
169 BOOST_TEST_THROWS(
170 a.insert(a.begin(),
171 array::max_size() + 1,
172 nullptr),
173 std::length_error);
174 }
175 }
176
177 void
178 testString()
179 {
180 // strings
181 {
182 {
183 string s;
184 BOOST_TEST_THROWS(
185 (s.resize(s.max_size() + 1)),
186 std::length_error);
187 }
188
189 {
190 string s;
191 s.resize(100);
192 BOOST_TEST_THROWS(
193 (s.append(s.max_size() - 1, '*')),
194 std::length_error);
195 }
196
197 {
198 string s;
199 s.resize(s.max_size() - 5);
200 BOOST_TEST_THROWS(
201 (s.replace(0, 1, s.subview(0, 10))),
202 std::length_error);
203 }
204
205 {
206 string s;
207 s.resize(s.max_size() - 5);
208 BOOST_TEST_THROWS(
209 (s.replace(0, 1, 10, 'a')),
210 std::length_error);
211 }
212
213 {
214 string s;
215 s.resize(s.max_size() - 5);
216 BOOST_TEST_THROWS(
217 (s.insert(0, s.subview(0, 10))),
218 std::length_error);
219 }
220
221 #if 0
222 {
223 // VFALCO tsan doesn't like this
224 string s;
225 try
226 {
227 s.resize(s.max_size() - 1);
228 }
229 catch(std::exception const&)
230 {
231 }
232 }
233 #endif
234 }
235
236 // string in parser
237 {
238 stream_parser p;
239 std::string const big(
240 string::max_size() + 1, '*');
241 auto const js =
242 "\"" + big + "\":null";
243 error_code ec;
244 auto jv = parse(js, ec);
245 BOOST_TEST(ec == error::string_too_large);
246 BOOST_TEST(ec.has_location());
247 }
248
249 // key in parser
250 {
251 stream_parser p;
252 std::string const big(
253 string::max_size() + 1, '*');
254 auto const js =
255 "{\"" + big + "\":null}";
256 error_code ec;
257 auto jv = parse(js, ec);
258 BOOST_TEST(ec == error::key_too_large);
259 BOOST_TEST(ec.has_location());
260 }
261 }
262
263 void
264 testParser()
265 {
266 // string buffer flush
267 {
268 string_view s =
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\"";
289 error_code ec;
290 auto jv = parse(s, ec);
291 BOOST_TEST(! ec);
292 }
293 // overflow in on_key_part
294 {
295 error_code ec;
296 std::string big;
297 big = "\\b";
298 big += std::string(
299 string::max_size()*2, '*');
300 auto const js =
301 "{\"" + big + "\":null}";
302 auto jv = parse(js, ec);
303 BOOST_TEST(ec == error::key_too_large);
304 BOOST_TEST(ec.has_location());
305 }
306
307 // overflow in on_key
308 {
309 error_code ec;
310 std::string big;
311 big = "\\b";
312 big += std::string(
313 (string::max_size()*3)/2, '*');
314 auto const js =
315 "{\"" + big + "\":null}";
316 auto jv = parse(js, ec);
317 BOOST_TEST(ec == error::key_too_large);
318 BOOST_TEST(ec.has_location());
319 }
320
321 // overflow in on_string_part
322 {
323 error_code ec;
324 std::string big;
325 big = "\\b";
326 big += std::string(
327 string::max_size()*2, '*');
328 auto const js =
329 "\"" + big + "\"";
330 auto jv = parse(js, ec);
331 BOOST_TEST(ec == error::string_too_large);
332 BOOST_TEST(ec.has_location());
333 }
334
335 // overflow in on_string
336 {
337 error_code ec;
338 std::string big;
339 big = "\\b";
340 big += std::string(
341 (string::max_size()*3)/2, '*');
342 auto const js =
343 "\"" + big + "\"";
344 auto jv = parse(js, ec);
345 BOOST_TEST(ec == error::string_too_large);
346 BOOST_TEST(ec.has_location());
347 }
348
349
350 // object overflow
351 {
352 error_code ec;
353 string_view s = R"({
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,
356 "20":0
357 })";
358
359 auto jv = parse(s, ec);
360 BOOST_TEST(ec == error::object_too_large);
361 BOOST_TEST(ec.has_location());
362 }
363
364 // array overflow
365 {
366 error_code ec;
367 string_view s = "["
368 "0,0,0,0,0,0,0,0,0,0,"
369 "0,0,0,0,0,0,0,0,0,0,"
370 "0"
371 "]";
372 auto jv = parse(s, ec);
373 BOOST_TEST(ec == error::array_too_large);
374 BOOST_TEST(ec.has_location());
375 }
376 }
377
378 void
379 run()
380 {
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)
385
386 //testValue();
387 testObject();
388 testArray();
389 testString();
390 testParser();
391
392 #else
393 BOOST_TEST_PASS();
394 #endif
395 }
396 };
397
398 TEST_SUITE(limits_test, "boost.json.limits");
399
400 BOOST_JSON_NS_END