]> git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/test/lib/json/parse/json_parse_ut.c
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / spdk / test / lib / json / parse / json_parse_ut.c
1 /*-
2 * BSD LICENSE
3 *
4 * Copyright (c) Intel Corporation.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 * * Neither the name of Intel Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 #include "spdk_cunit.h"
35
36 #include "json_parse.c"
37
38 #include <stdio.h>
39 #include <string.h>
40
41 static uint8_t g_buf[1000];
42 static void *g_end;
43 static struct spdk_json_val g_vals[100];
44 static int g_cur_val;
45
46 /* Fill buf with raw data */
47 #define BUF_SETUP(in) \
48 memset(g_buf, 0, sizeof(g_buf)); \
49 if (sizeof(in) > 1) { \
50 memcpy(g_buf, in, sizeof(in) - 1); \
51 } \
52 g_end = NULL
53
54 /*
55 * Do two checks - first pass NULL for values to ensure the count is correct,
56 * then pass g_vals to get the actual values.
57 */
58 #define PARSE_PASS_FLAGS(in, num_vals, trailing, flags) \
59 BUF_SETUP(in); \
60 CU_ASSERT(spdk_json_parse(g_buf, sizeof(in) - 1, NULL, 0, &g_end, flags) == num_vals); \
61 memset(g_vals, 0, sizeof(g_vals)); \
62 CU_ASSERT(spdk_json_parse(g_buf, sizeof(in) - 1, g_vals, sizeof(g_vals), &g_end, flags | SPDK_JSON_PARSE_FLAG_DECODE_IN_PLACE) == num_vals); \
63 CU_ASSERT(g_end == g_buf + sizeof(in) - sizeof(trailing)); \
64 CU_ASSERT(memcmp(g_end, trailing, sizeof(trailing) - 1) == 0); \
65 g_cur_val = 0
66
67 #define PARSE_PASS(in, num_vals, trailing) \
68 PARSE_PASS_FLAGS(in, num_vals, trailing, 0)
69
70 #define PARSE_FAIL_FLAGS(in, retval, flags) \
71 BUF_SETUP(in); \
72 CU_ASSERT(spdk_json_parse(g_buf, sizeof(in) - 1, NULL, 0, &g_end, flags) == retval)
73
74 #define PARSE_FAIL(in, retval) \
75 PARSE_FAIL_FLAGS(in, retval, 0)
76
77 #define VAL_STRING_MATCH(str, var_type) \
78 CU_ASSERT(g_vals[g_cur_val].type == var_type); \
79 CU_ASSERT(g_vals[g_cur_val].len == sizeof(str) - 1); \
80 if (g_vals[g_cur_val].len == sizeof(str) - 1 && sizeof(str) > 1) { \
81 CU_ASSERT(memcmp(g_vals[g_cur_val].start, str, g_vals[g_cur_val].len) == 0); \
82 } \
83 g_cur_val++
84
85 #define VAL_STRING(str) VAL_STRING_MATCH(str, SPDK_JSON_VAL_STRING)
86 #define VAL_NAME(str) VAL_STRING_MATCH(str, SPDK_JSON_VAL_NAME)
87 #define VAL_NUMBER(num) VAL_STRING_MATCH(num, SPDK_JSON_VAL_NUMBER)
88
89 #define VAL_LITERAL(str, val_type) \
90 CU_ASSERT(g_vals[g_cur_val].type == val_type); \
91 CU_ASSERT(g_vals[g_cur_val].len == strlen(str)); \
92 if (g_vals[g_cur_val].len == strlen(str)) { \
93 CU_ASSERT(memcmp(g_vals[g_cur_val].start, str, g_vals[g_cur_val].len) == 0); \
94 } \
95 g_cur_val++
96
97 #define VAL_TRUE() VAL_LITERAL("true", SPDK_JSON_VAL_TRUE)
98 #define VAL_FALSE() VAL_LITERAL("false", SPDK_JSON_VAL_FALSE)
99 #define VAL_NULL() VAL_LITERAL("null", SPDK_JSON_VAL_NULL)
100
101 #define VAL_ARRAY_BEGIN(count) \
102 CU_ASSERT(g_vals[g_cur_val].type == SPDK_JSON_VAL_ARRAY_BEGIN); \
103 CU_ASSERT(g_vals[g_cur_val].len == count); \
104 g_cur_val++
105
106 #define VAL_ARRAY_END() \
107 CU_ASSERT(g_vals[g_cur_val].type == SPDK_JSON_VAL_ARRAY_END); \
108 g_cur_val++
109
110 #define VAL_OBJECT_BEGIN(count) \
111 CU_ASSERT(g_vals[g_cur_val].type == SPDK_JSON_VAL_OBJECT_BEGIN); \
112 CU_ASSERT(g_vals[g_cur_val].len == count); \
113 g_cur_val++
114
115 #define VAL_OBJECT_END() \
116 CU_ASSERT(g_vals[g_cur_val].type == SPDK_JSON_VAL_OBJECT_END); \
117 g_cur_val++
118
119 /* Simplified macros for string-only testing */
120 #define STR_PASS(in, out) \
121 PARSE_PASS("\"" in "\"", 1, ""); \
122 VAL_STRING(out)
123
124 #define STR_FAIL(in, retval) \
125 PARSE_FAIL("\"" in "\"", retval)
126
127 /* Simplified macros for number-only testing (no whitespace allowed) */
128 #define NUM_PASS(in) \
129 PARSE_PASS(in, 1, ""); \
130 VAL_NUMBER(in)
131
132 #define NUM_FAIL(in, retval) \
133 PARSE_FAIL(in, retval)
134
135 static void
136 test_parse_literal(void)
137 {
138 PARSE_PASS("true", 1, "");
139 VAL_TRUE();
140
141 PARSE_PASS(" true ", 1, "");
142 VAL_TRUE();
143
144 PARSE_PASS("false", 1, "");
145 VAL_FALSE();
146
147 PARSE_PASS("null", 1, "");
148 VAL_NULL();
149
150 PARSE_PASS("trueaaa", 1, "aaa");
151 VAL_TRUE();
152
153 PARSE_PASS("truefalse", 1, "false");
154 VAL_TRUE();
155
156 PARSE_PASS("true false", 1, "false");
157 VAL_TRUE();
158
159 PARSE_PASS("true,false", 1, ",false");
160 VAL_TRUE();
161
162 PARSE_PASS("true,", 1, ",");
163 VAL_TRUE();
164
165 PARSE_FAIL("True", SPDK_JSON_PARSE_INVALID);
166 PARSE_FAIL("abcdef", SPDK_JSON_PARSE_INVALID);
167
168 PARSE_FAIL("t", SPDK_JSON_PARSE_INCOMPLETE);
169 PARSE_FAIL("tru", SPDK_JSON_PARSE_INCOMPLETE);
170 PARSE_FAIL("f", SPDK_JSON_PARSE_INCOMPLETE);
171 PARSE_FAIL("fals", SPDK_JSON_PARSE_INCOMPLETE);
172 PARSE_FAIL("n", SPDK_JSON_PARSE_INCOMPLETE);
173 PARSE_FAIL("nul", SPDK_JSON_PARSE_INCOMPLETE);
174 }
175
176 static void
177 test_parse_string_simple(void)
178 {
179 PARSE_PASS("\"\"", 1, "");
180 VAL_STRING("");
181
182 PARSE_PASS("\"hello world\"", 1, "");
183 VAL_STRING("hello world");
184
185 PARSE_PASS(" \"hello world\" ", 1, "");
186 VAL_STRING("hello world");
187
188 /* Unterminated string */
189 PARSE_FAIL("\"hello world", SPDK_JSON_PARSE_INCOMPLETE);
190
191 /* Trailing comma */
192 PARSE_PASS("\"hello world\",", 1, ",");
193 VAL_STRING("hello world");
194 }
195
196 static void
197 test_parse_string_control_chars(void)
198 {
199 /* U+0000 through U+001F must be escaped */
200 STR_FAIL("\x00", SPDK_JSON_PARSE_INVALID);
201 STR_FAIL("\x01", SPDK_JSON_PARSE_INVALID);
202 STR_FAIL("\x02", SPDK_JSON_PARSE_INVALID);
203 STR_FAIL("\x03", SPDK_JSON_PARSE_INVALID);
204 STR_FAIL("\x04", SPDK_JSON_PARSE_INVALID);
205 STR_FAIL("\x05", SPDK_JSON_PARSE_INVALID);
206 STR_FAIL("\x06", SPDK_JSON_PARSE_INVALID);
207 STR_FAIL("\x07", SPDK_JSON_PARSE_INVALID);
208 STR_FAIL("\x08", SPDK_JSON_PARSE_INVALID);
209 STR_FAIL("\x09", SPDK_JSON_PARSE_INVALID);
210 STR_FAIL("\x0A", SPDK_JSON_PARSE_INVALID);
211 STR_FAIL("\x0B", SPDK_JSON_PARSE_INVALID);
212 STR_FAIL("\x0C", SPDK_JSON_PARSE_INVALID);
213 STR_FAIL("\x0D", SPDK_JSON_PARSE_INVALID);
214 STR_FAIL("\x0E", SPDK_JSON_PARSE_INVALID);
215 STR_FAIL("\x0F", SPDK_JSON_PARSE_INVALID);
216 STR_FAIL("\x10", SPDK_JSON_PARSE_INVALID);
217 STR_FAIL("\x11", SPDK_JSON_PARSE_INVALID);
218 STR_FAIL("\x12", SPDK_JSON_PARSE_INVALID);
219 STR_FAIL("\x13", SPDK_JSON_PARSE_INVALID);
220 STR_FAIL("\x14", SPDK_JSON_PARSE_INVALID);
221 STR_FAIL("\x15", SPDK_JSON_PARSE_INVALID);
222 STR_FAIL("\x16", SPDK_JSON_PARSE_INVALID);
223 STR_FAIL("\x17", SPDK_JSON_PARSE_INVALID);
224 STR_FAIL("\x18", SPDK_JSON_PARSE_INVALID);
225 STR_FAIL("\x19", SPDK_JSON_PARSE_INVALID);
226 STR_FAIL("\x1A", SPDK_JSON_PARSE_INVALID);
227 STR_FAIL("\x1B", SPDK_JSON_PARSE_INVALID);
228 STR_FAIL("\x1C", SPDK_JSON_PARSE_INVALID);
229 STR_FAIL("\x1D", SPDK_JSON_PARSE_INVALID);
230 STR_FAIL("\x1E", SPDK_JSON_PARSE_INVALID);
231 STR_FAIL("\x1F", SPDK_JSON_PARSE_INVALID);
232 STR_PASS(" ", " "); /* \x20 (first valid unescaped char) */
233
234 /* Test control chars in the middle of a string */
235 STR_FAIL("abc\ndef", SPDK_JSON_PARSE_INVALID);
236 STR_FAIL("abc\tdef", SPDK_JSON_PARSE_INVALID);
237 }
238
239 static void
240 test_parse_string_utf8(void)
241 {
242 /* Valid one-, two-, three-, and four-byte sequences */
243 STR_PASS("\x41", "A");
244 STR_PASS("\xC3\xB6", "\xC3\xB6");
245 STR_PASS("\xE2\x88\x9A", "\xE2\x88\x9A");
246 STR_PASS("\xF0\xA0\x9C\x8E", "\xF0\xA0\x9C\x8E");
247
248 /* Examples from RFC 3629 */
249 STR_PASS("\x41\xE2\x89\xA2\xCE\x91\x2E", "\x41\xE2\x89\xA2\xCE\x91\x2E");
250 STR_PASS("\xED\x95\x9C\xEA\xB5\xAD\xEC\x96\xB4", "\xED\x95\x9C\xEA\xB5\xAD\xEC\x96\xB4");
251 STR_PASS("\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E", "\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E");
252 STR_PASS("\xEF\xBB\xBF\xF0\xA3\x8E\xB4", "\xEF\xBB\xBF\xF0\xA3\x8E\xB4");
253
254 /* Edge cases */
255 STR_PASS("\x7F", "\x7F");
256 STR_FAIL("\x80", SPDK_JSON_PARSE_INVALID);
257 STR_FAIL("\xC1", SPDK_JSON_PARSE_INVALID);
258 STR_FAIL("\xC2", SPDK_JSON_PARSE_INVALID);
259 STR_PASS("\xC2\x80", "\xC2\x80");
260 STR_PASS("\xC2\xBF", "\xC2\xBF");
261 STR_PASS("\xDF\x80", "\xDF\x80");
262 STR_PASS("\xDF\xBF", "\xDF\xBF");
263 STR_FAIL("\xDF", SPDK_JSON_PARSE_INVALID);
264 STR_FAIL("\xE0\x80", SPDK_JSON_PARSE_INVALID);
265 STR_FAIL("\xE0\x1F", SPDK_JSON_PARSE_INVALID);
266 STR_FAIL("\xE0\x1F\x80", SPDK_JSON_PARSE_INVALID);
267 STR_FAIL("\xE0", SPDK_JSON_PARSE_INVALID);
268 STR_FAIL("\xE0\xA0", SPDK_JSON_PARSE_INVALID);
269 STR_PASS("\xE0\xA0\x80", "\xE0\xA0\x80");
270 STR_PASS("\xE0\xA0\xBF", "\xE0\xA0\xBF");
271 STR_FAIL("\xE0\xA0\xC0", SPDK_JSON_PARSE_INVALID);
272 STR_PASS("\xE0\xBF\x80", "\xE0\xBF\x80");
273 STR_PASS("\xE0\xBF\xBF", "\xE0\xBF\xBF");
274 STR_FAIL("\xE0\xC0\x80", SPDK_JSON_PARSE_INVALID);
275 STR_FAIL("\xE1", SPDK_JSON_PARSE_INVALID);
276 STR_FAIL("\xE1\x80", SPDK_JSON_PARSE_INVALID);
277 STR_FAIL("\xE1\x7F\x80", SPDK_JSON_PARSE_INVALID);
278 STR_FAIL("\xE1\x80\x7F", SPDK_JSON_PARSE_INVALID);
279 STR_PASS("\xE1\x80\x80", "\xE1\x80\x80");
280 STR_PASS("\xE1\x80\xBF", "\xE1\x80\xBF");
281 STR_PASS("\xE1\xBF\x80", "\xE1\xBF\x80");
282 STR_PASS("\xE1\xBF\xBF", "\xE1\xBF\xBF");
283 STR_FAIL("\xE1\xC0\x80", SPDK_JSON_PARSE_INVALID);
284 STR_FAIL("\xE1\x80\xC0", SPDK_JSON_PARSE_INVALID);
285 STR_PASS("\xEF\x80\x80", "\xEF\x80\x80");
286 STR_PASS("\xEF\xBF\xBF", "\xEF\xBF\xBF");
287 STR_FAIL("\xF0", SPDK_JSON_PARSE_INVALID);
288 STR_FAIL("\xF0\x90", SPDK_JSON_PARSE_INVALID);
289 STR_FAIL("\xF0\x90\x80", SPDK_JSON_PARSE_INVALID);
290 STR_FAIL("\xF0\x80\x80\x80", SPDK_JSON_PARSE_INVALID);
291 STR_FAIL("\xF0\x8F\x80\x80", SPDK_JSON_PARSE_INVALID);
292 STR_PASS("\xF0\x90\x80\x80", "\xF0\x90\x80\x80");
293 STR_PASS("\xF0\x90\x80\xBF", "\xF0\x90\x80\xBF");
294 STR_PASS("\xF0\x90\xBF\x80", "\xF0\x90\xBF\x80");
295 STR_PASS("\xF0\xBF\x80\x80", "\xF0\xBF\x80\x80");
296 STR_FAIL("\xF0\xC0\x80\x80", SPDK_JSON_PARSE_INVALID);
297 STR_FAIL("\xF1", SPDK_JSON_PARSE_INVALID);
298 STR_FAIL("\xF1\x80", SPDK_JSON_PARSE_INVALID);
299 STR_FAIL("\xF1\x80\x80", SPDK_JSON_PARSE_INVALID);
300 STR_FAIL("\xF1\x80\x80\x7F", SPDK_JSON_PARSE_INVALID);
301 STR_PASS("\xF1\x80\x80\x80", "\xF1\x80\x80\x80");
302 STR_PASS("\xF1\x80\x80\xBF", "\xF1\x80\x80\xBF");
303 STR_PASS("\xF1\x80\xBF\x80", "\xF1\x80\xBF\x80");
304 STR_PASS("\xF1\xBF\x80\x80", "\xF1\xBF\x80\x80");
305 STR_PASS("\xF3\x80\x80\x80", "\xF3\x80\x80\x80");
306 STR_FAIL("\xF3\xC0\x80\x80", SPDK_JSON_PARSE_INVALID);
307 STR_FAIL("\xF3\x80\xC0\x80", SPDK_JSON_PARSE_INVALID);
308 STR_FAIL("\xF3\x80\x80\xC0", SPDK_JSON_PARSE_INVALID);
309 STR_FAIL("\xF4", SPDK_JSON_PARSE_INVALID);
310 STR_FAIL("\xF4\x80", SPDK_JSON_PARSE_INVALID);
311 STR_FAIL("\xF4\x80\x80", SPDK_JSON_PARSE_INVALID);
312 STR_PASS("\xF4\x80\x80\x80", "\xF4\x80\x80\x80");
313 STR_PASS("\xF4\x8F\x80\x80", "\xF4\x8F\x80\x80");
314 STR_PASS("\xF4\x8F\xBF\xBF", "\xF4\x8F\xBF\xBF");
315 STR_FAIL("\xF4\x90\x80\x80", SPDK_JSON_PARSE_INVALID);
316 STR_FAIL("\xF5", SPDK_JSON_PARSE_INVALID);
317 STR_FAIL("\xF5\x80", SPDK_JSON_PARSE_INVALID);
318 STR_FAIL("\xF5\x80\x80", SPDK_JSON_PARSE_INVALID);
319 STR_FAIL("\xF5\x80\x80\x80", SPDK_JSON_PARSE_INVALID);
320 STR_FAIL("\xF5\x80\x80\x80\x80", SPDK_JSON_PARSE_INVALID);
321
322 /* Overlong encodings */
323 STR_FAIL("\xC0\x80", SPDK_JSON_PARSE_INVALID);
324
325 /* Surrogate pairs */
326 STR_FAIL("\xED\xA0\x80", SPDK_JSON_PARSE_INVALID); /* U+D800 First high surrogate */
327 STR_FAIL("\xED\xAF\xBF", SPDK_JSON_PARSE_INVALID); /* U+DBFF Last high surrogate */
328 STR_FAIL("\xED\xB0\x80", SPDK_JSON_PARSE_INVALID); /* U+DC00 First low surrogate */
329 STR_FAIL("\xED\xBF\xBF", SPDK_JSON_PARSE_INVALID); /* U+DFFF Last low surrogate */
330 STR_FAIL("\xED\xA1\x8C\xED\xBE\xB4",
331 SPDK_JSON_PARSE_INVALID); /* U+233B4 (invalid surrogate pair encoding) */
332 }
333
334 static void
335 test_parse_string_escapes_twochar(void)
336 {
337 STR_PASS("\\\"", "\"");
338 STR_PASS("\\\\", "\\");
339 STR_PASS("\\/", "/");
340 STR_PASS("\\b", "\b");
341 STR_PASS("\\f", "\f");
342 STR_PASS("\\n", "\n");
343 STR_PASS("\\r", "\r");
344 STR_PASS("\\t", "\t");
345
346 STR_PASS("abc\\tdef", "abc\tdef");
347 STR_PASS("abc\\\"def", "abc\"def");
348
349 /* Backslash at end of string (will be treated as escaped quote) */
350 STR_FAIL("\\", SPDK_JSON_PARSE_INCOMPLETE);
351 STR_FAIL("abc\\", SPDK_JSON_PARSE_INCOMPLETE);
352
353 /* Invalid C-like escapes */
354 STR_FAIL("\\a", SPDK_JSON_PARSE_INVALID);
355 STR_FAIL("\\v", SPDK_JSON_PARSE_INVALID);
356 STR_FAIL("\\'", SPDK_JSON_PARSE_INVALID);
357 STR_FAIL("\\?", SPDK_JSON_PARSE_INVALID);
358 STR_FAIL("\\0", SPDK_JSON_PARSE_INVALID);
359 STR_FAIL("\\x00", SPDK_JSON_PARSE_INVALID);
360
361 /* Other invalid escapes */
362 STR_FAIL("\\B", SPDK_JSON_PARSE_INVALID);
363 STR_FAIL("\\z", SPDK_JSON_PARSE_INVALID);
364 }
365
366 static void
367 test_parse_string_escapes_unicode(void)
368 {
369 STR_PASS("\\u0000", "\0");
370 STR_PASS("\\u0001", "\1");
371 STR_PASS("\\u0041", "A");
372 STR_PASS("\\uAAAA", "\xEA\xAA\xAA");
373 STR_PASS("\\uaaaa", "\xEA\xAA\xAA");
374 STR_PASS("\\uAaAa", "\xEA\xAA\xAA");
375
376 STR_FAIL("\\u", SPDK_JSON_PARSE_INVALID);
377 STR_FAIL("\\u0", SPDK_JSON_PARSE_INVALID);
378 STR_FAIL("\\u00", SPDK_JSON_PARSE_INVALID);
379 STR_FAIL("\\u000", SPDK_JSON_PARSE_INVALID);
380 STR_FAIL("\\u000g", SPDK_JSON_PARSE_INVALID);
381 STR_FAIL("\\U", SPDK_JSON_PARSE_INVALID);
382 STR_FAIL("\\U0000", SPDK_JSON_PARSE_INVALID);
383
384 PARSE_FAIL("\"\\u", SPDK_JSON_PARSE_INCOMPLETE);
385 PARSE_FAIL("\"\\u0", SPDK_JSON_PARSE_INCOMPLETE);
386 PARSE_FAIL("\"\\u00", SPDK_JSON_PARSE_INCOMPLETE);
387 PARSE_FAIL("\"\\u000", SPDK_JSON_PARSE_INCOMPLETE);
388
389 /* Surrogate pair */
390 STR_PASS("\\uD834\\uDD1E", "\xF0\x9D\x84\x9E");
391
392 /* Low surrogate without high */
393 STR_FAIL("\\uDC00", SPDK_JSON_PARSE_INVALID);
394 STR_FAIL("\\uDC00\\uDC00", SPDK_JSON_PARSE_INVALID);
395 STR_FAIL("\\uDC00abcdef", SPDK_JSON_PARSE_INVALID);
396 STR_FAIL("\\uDEAD", SPDK_JSON_PARSE_INVALID);
397 PARSE_FAIL("\"\\uD834", SPDK_JSON_PARSE_INCOMPLETE);
398 PARSE_FAIL("\"\\uD834\\", SPDK_JSON_PARSE_INCOMPLETE);
399 PARSE_FAIL("\"\\uD834\\u", SPDK_JSON_PARSE_INCOMPLETE);
400 PARSE_FAIL("\"\\uD834\\uD", SPDK_JSON_PARSE_INCOMPLETE);
401 PARSE_FAIL("\"\\uD834\\uDD1", SPDK_JSON_PARSE_INCOMPLETE);
402
403 /* High surrogate without low */
404 STR_FAIL("\\uD800", SPDK_JSON_PARSE_INVALID);
405 STR_FAIL("\\uD800abcdef", SPDK_JSON_PARSE_INVALID);
406 }
407
408 static void
409 test_parse_number(void)
410 {
411 NUM_PASS("0");
412 NUM_PASS("1");
413 NUM_PASS("100");
414 NUM_PASS("-1");
415 NUM_PASS("-0");
416 NUM_PASS("3.0");
417 NUM_PASS("3.00");
418 NUM_PASS("3.001");
419 NUM_PASS("3.14159");
420 NUM_PASS("3.141592653589793238462643383279");
421 NUM_PASS("1e400");
422 NUM_PASS("1E400");
423 NUM_PASS("0e10");
424 NUM_PASS("0e0");
425 NUM_PASS("-0e0");
426 NUM_PASS("-0e+0");
427 NUM_PASS("-0e-0");
428 NUM_PASS("1e+400");
429 NUM_PASS("1e-400");
430 NUM_PASS("6.022e23");
431 NUM_PASS("-1.234e+56");
432 NUM_PASS("1.23e+56");
433 NUM_PASS("-1.23e-56");
434 NUM_PASS("1.23e-56");
435 NUM_PASS("1e04");
436
437 /* Trailing garbage */
438 PARSE_PASS("0A", 1, "A");
439 VAL_NUMBER("0");
440
441 PARSE_PASS("0,", 1, ",");
442 VAL_NUMBER("0");
443
444 PARSE_PASS("0true", 1, "true");
445 VAL_NUMBER("0");
446
447 PARSE_PASS("00", 1, "0");
448 VAL_NUMBER("0");
449 PARSE_FAIL("[00", SPDK_JSON_PARSE_INVALID);
450
451 PARSE_PASS("007", 1, "07");
452 VAL_NUMBER("0");
453 PARSE_FAIL("[007]", SPDK_JSON_PARSE_INVALID);
454
455 PARSE_PASS("345.678.1", 1, ".1");
456 VAL_NUMBER("345.678");
457 PARSE_FAIL("[345.678.1]", SPDK_JSON_PARSE_INVALID);
458
459 PARSE_PASS("3.2e-4+5", 1, "+5");
460 VAL_NUMBER("3.2e-4");
461 PARSE_FAIL("[3.2e-4+5]", SPDK_JSON_PARSE_INVALID);
462
463 PARSE_PASS("3.4.5", 1, ".5");
464 VAL_NUMBER("3.4");
465 PARSE_FAIL("[3.4.5]", SPDK_JSON_PARSE_INVALID);
466
467 NUM_FAIL("345.", SPDK_JSON_PARSE_INCOMPLETE);
468 NUM_FAIL("+1", SPDK_JSON_PARSE_INVALID);
469 NUM_FAIL("--1", SPDK_JSON_PARSE_INVALID);
470 NUM_FAIL("3.", SPDK_JSON_PARSE_INCOMPLETE);
471 NUM_FAIL("3.+4", SPDK_JSON_PARSE_INVALID);
472 NUM_FAIL("3.2e+-4", SPDK_JSON_PARSE_INVALID);
473 NUM_FAIL("3.2e-+4", SPDK_JSON_PARSE_INVALID);
474 NUM_FAIL("3e+", SPDK_JSON_PARSE_INCOMPLETE);
475 NUM_FAIL("3e-", SPDK_JSON_PARSE_INCOMPLETE);
476 NUM_FAIL("3.e4", SPDK_JSON_PARSE_INVALID);
477 NUM_FAIL("-", SPDK_JSON_PARSE_INCOMPLETE);
478 NUM_FAIL("NaN", SPDK_JSON_PARSE_INVALID);
479 NUM_FAIL(".123", SPDK_JSON_PARSE_INVALID);
480 }
481
482 static void
483 test_parse_array(void)
484 {
485 PARSE_PASS("[]", 2, "");
486 VAL_ARRAY_BEGIN(0);
487 VAL_ARRAY_END();
488
489 PARSE_PASS("[true]", 3, "");
490 VAL_ARRAY_BEGIN(1);
491 VAL_TRUE();
492 VAL_ARRAY_END();
493
494 PARSE_PASS("[true, false]", 4, "");
495 VAL_ARRAY_BEGIN(2);
496 VAL_TRUE();
497 VAL_FALSE();
498 VAL_ARRAY_END();
499
500 PARSE_PASS("[\"hello\"]", 3, "");
501 VAL_ARRAY_BEGIN(1);
502 VAL_STRING("hello");
503 VAL_ARRAY_END();
504
505 PARSE_PASS("[[]]", 4, "");
506 VAL_ARRAY_BEGIN(2);
507 VAL_ARRAY_BEGIN(0);
508 VAL_ARRAY_END();
509 VAL_ARRAY_END();
510
511 PARSE_PASS("[\"hello\", \"world\"]", 4, "");
512 VAL_ARRAY_BEGIN(2);
513 VAL_STRING("hello");
514 VAL_STRING("world");
515 VAL_ARRAY_END();
516
517 PARSE_PASS("[],", 2, ",");
518 VAL_ARRAY_BEGIN(0);
519 VAL_ARRAY_END();
520
521 PARSE_FAIL("]", SPDK_JSON_PARSE_INVALID);
522 PARSE_FAIL("[", SPDK_JSON_PARSE_INCOMPLETE);
523 PARSE_FAIL("[true", SPDK_JSON_PARSE_INCOMPLETE);
524 PARSE_FAIL("[\"hello", SPDK_JSON_PARSE_INCOMPLETE);
525 PARSE_FAIL("[\"hello\"", SPDK_JSON_PARSE_INCOMPLETE);
526 PARSE_FAIL("[true,]", SPDK_JSON_PARSE_INVALID);
527 PARSE_FAIL("[,]", SPDK_JSON_PARSE_INVALID);
528 PARSE_FAIL("[,true]", SPDK_JSON_PARSE_INVALID);
529 PARSE_FAIL("[true}", SPDK_JSON_PARSE_INVALID);
530 PARSE_FAIL("[true,,true]", SPDK_JSON_PARSE_INVALID);
531 }
532
533 static void
534 test_parse_object(void)
535 {
536 PARSE_PASS("{}", 2, "");
537 VAL_OBJECT_BEGIN(0);
538 VAL_OBJECT_END();
539
540 PARSE_PASS("{\"a\": true}", 4, "");
541 VAL_OBJECT_BEGIN(2);
542 VAL_NAME("a");
543 VAL_TRUE();
544 VAL_OBJECT_END();
545
546 PARSE_PASS("{\"abc\": \"def\"}", 4, "");
547 VAL_OBJECT_BEGIN(2);
548 VAL_NAME("abc");
549 VAL_STRING("def");
550 VAL_OBJECT_END();
551
552 PARSE_PASS("{\"a\": true, \"b\": false}", 6, "");
553 VAL_OBJECT_BEGIN(4);
554 VAL_NAME("a");
555 VAL_TRUE();
556 VAL_NAME("b");
557 VAL_FALSE();
558 VAL_OBJECT_END();
559
560 PARSE_PASS("{\"a\": { \"b\": true } }", 7, "");
561 VAL_OBJECT_BEGIN(5);
562 VAL_NAME("a");
563 VAL_OBJECT_BEGIN(2);
564 VAL_NAME("b");
565 VAL_TRUE();
566 VAL_OBJECT_END();
567 VAL_OBJECT_END();
568
569 PARSE_PASS("{\"{test\": 0}", 4, "");
570 VAL_OBJECT_BEGIN(2);
571 VAL_NAME("{test");
572 VAL_NUMBER("0");
573 VAL_OBJECT_END();
574
575 PARSE_PASS("{\"test}\": 1}", 4, "");
576 VAL_OBJECT_BEGIN(2);
577 VAL_NAME("test}");
578 VAL_NUMBER("1");
579 VAL_OBJECT_END();
580
581 PARSE_PASS("{\"\\\"\": 2}", 4, "");
582 VAL_OBJECT_BEGIN(2);
583 VAL_NAME("\"");
584 VAL_NUMBER("2");
585 VAL_OBJECT_END();
586
587 PARSE_PASS("{\"a\":true},", 4, ",");
588 VAL_OBJECT_BEGIN(2);
589 VAL_NAME("a");
590 VAL_TRUE();
591 VAL_OBJECT_END();
592
593 /* Object end without object begin (trailing garbage) */
594 PARSE_PASS("true}", 1, "}");
595 VAL_TRUE();
596
597 PARSE_PASS("0}", 1, "}");
598 VAL_NUMBER("0");
599
600 PARSE_PASS("\"a\"}", 1, "}");
601 VAL_STRING("a");
602
603 PARSE_FAIL("}", SPDK_JSON_PARSE_INVALID);
604 PARSE_FAIL("{", SPDK_JSON_PARSE_INCOMPLETE);
605 PARSE_FAIL("{\"a", SPDK_JSON_PARSE_INCOMPLETE);
606 PARSE_FAIL("{\"a\"", SPDK_JSON_PARSE_INCOMPLETE);
607 PARSE_FAIL("{\"a\":", SPDK_JSON_PARSE_INCOMPLETE);
608 PARSE_FAIL("{\"a\":true", SPDK_JSON_PARSE_INCOMPLETE);
609 PARSE_FAIL("{\"a\":true,", SPDK_JSON_PARSE_INCOMPLETE);
610 PARSE_FAIL("{\"a\":true,}", SPDK_JSON_PARSE_INVALID);
611 PARSE_FAIL("{\"a\":true,\"}", SPDK_JSON_PARSE_INCOMPLETE);
612 PARSE_FAIL("{\"a\":true,\"b}", SPDK_JSON_PARSE_INCOMPLETE);
613 PARSE_FAIL("{\"a\":true,\"b\"}", SPDK_JSON_PARSE_INVALID);
614 PARSE_FAIL("{\"a\":true,\"b\":}", SPDK_JSON_PARSE_INVALID);
615 PARSE_FAIL("{\"a\":true,\"b\",}", SPDK_JSON_PARSE_INVALID);
616 PARSE_FAIL("{\"a\",}", SPDK_JSON_PARSE_INVALID);
617 PARSE_FAIL("{,\"a\": true}", SPDK_JSON_PARSE_INVALID);
618 PARSE_FAIL("{a:true}", SPDK_JSON_PARSE_INVALID);
619 PARSE_FAIL("{'a':true}", SPDK_JSON_PARSE_INVALID);
620 }
621
622 static void
623 test_parse_nesting(void)
624 {
625 PARSE_PASS("[[[[[[[[]]]]]]]]", 16, "");
626
627 PARSE_PASS("{\"a\": [0, 1, 2]}", 8, "");
628 VAL_OBJECT_BEGIN(6);
629 VAL_NAME("a");
630 VAL_ARRAY_BEGIN(3);
631 VAL_NUMBER("0");
632 VAL_NUMBER("1");
633 VAL_NUMBER("2");
634 VAL_ARRAY_END();
635 VAL_OBJECT_END();
636
637 PARSE_PASS("{\"a\": [0, 1, 2], \"b\": 3 }", 10, "");
638 VAL_OBJECT_BEGIN(8);
639 VAL_NAME("a");
640 VAL_ARRAY_BEGIN(3);
641 VAL_NUMBER("0");
642 VAL_NUMBER("1");
643 VAL_NUMBER("2");
644 VAL_ARRAY_END();
645 VAL_NAME("b");
646 VAL_NUMBER("3");
647 VAL_OBJECT_END();
648
649 PARSE_PASS("[0, 1, {\"a\": 3}, 4, 5]", 10, "");
650 VAL_ARRAY_BEGIN(8);
651 VAL_NUMBER("0");
652 VAL_NUMBER("1");
653 VAL_OBJECT_BEGIN(2);
654 VAL_NAME("a");
655 VAL_NUMBER("3");
656 VAL_OBJECT_END();
657 VAL_NUMBER("4");
658 VAL_NUMBER("5");
659 VAL_ARRAY_END();
660
661 PARSE_PASS("\t[ { \"a\": {\"b\": [ {\"c\": 1}, 2 ],\n\"d\": 3}, \"e\" : 4}, 5 ] ", 20, "");
662 VAL_ARRAY_BEGIN(18);
663 VAL_OBJECT_BEGIN(15);
664 VAL_NAME("a");
665 VAL_OBJECT_BEGIN(10);
666 VAL_NAME("b");
667 VAL_ARRAY_BEGIN(5);
668 VAL_OBJECT_BEGIN(2);
669 VAL_NAME("c");
670 VAL_NUMBER("1");
671 VAL_OBJECT_END();
672 VAL_NUMBER("2");
673 VAL_ARRAY_END();
674 VAL_NAME("d");
675 VAL_NUMBER("3");
676 VAL_OBJECT_END();
677 VAL_NAME("e");
678 VAL_NUMBER("4");
679 VAL_OBJECT_END();
680 VAL_NUMBER("5");
681 VAL_ARRAY_END();
682
683 /* Examples from RFC 7159 */
684 PARSE_PASS(
685 "{\n"
686 " \"Image\": {\n"
687 " \"Width\": 800,\n"
688 " \"Height\": 600,\n"
689 " \"Title\": \"View from 15th Floor\",\n"
690 " \"Thumbnail\": {\n"
691 " \"Url\": \"http://www.example.com/image/481989943\",\n"
692 " \"Height\": 125,\n"
693 " \"Width\": 100\n"
694 " },\n"
695 " \"Animated\" : false,\n"
696 " \"IDs\": [116, 943, 234, 38793]\n"
697 " }\n"
698 "}\n",
699 29, "");
700
701 VAL_OBJECT_BEGIN(27);
702 VAL_NAME("Image");
703 VAL_OBJECT_BEGIN(24);
704 VAL_NAME("Width");
705 VAL_NUMBER("800");
706 VAL_NAME("Height");
707 VAL_NUMBER("600");
708 VAL_NAME("Title");
709 VAL_STRING("View from 15th Floor");
710 VAL_NAME("Thumbnail");
711 VAL_OBJECT_BEGIN(6);
712 VAL_NAME("Url");
713 VAL_STRING("http://www.example.com/image/481989943");
714 VAL_NAME("Height");
715 VAL_NUMBER("125");
716 VAL_NAME("Width");
717 VAL_NUMBER("100");
718 VAL_OBJECT_END();
719 VAL_NAME("Animated");
720 VAL_FALSE();
721 VAL_NAME("IDs");
722 VAL_ARRAY_BEGIN(4);
723 VAL_NUMBER("116");
724 VAL_NUMBER("943");
725 VAL_NUMBER("234");
726 VAL_NUMBER("38793");
727 VAL_ARRAY_END();
728 VAL_OBJECT_END();
729 VAL_OBJECT_END();
730
731 PARSE_PASS(
732 "[\n"
733 " {\n"
734 " \"precision\": \"zip\",\n"
735 " \"Latitude\": 37.7668,\n"
736 " \"Longitude\": -122.3959,\n"
737 " \"Address\": \"\",\n"
738 " \"City\": \"SAN FRANCISCO\",\n"
739 " \"State\": \"CA\",\n"
740 " \"Zip\": \"94107\",\n"
741 " \"Country\": \"US\"\n"
742 " },\n"
743 " {\n"
744 " \"precision\": \"zip\",\n"
745 " \"Latitude\": 37.371991,\n"
746 " \"Longitude\": -122.026020,\n"
747 " \"Address\": \"\",\n"
748 " \"City\": \"SUNNYVALE\",\n"
749 " \"State\": \"CA\",\n"
750 " \"Zip\": \"94085\",\n"
751 " \"Country\": \"US\"\n"
752 " }\n"
753 "]",
754 38, "");
755
756 VAL_ARRAY_BEGIN(36);
757 VAL_OBJECT_BEGIN(16);
758 VAL_NAME("precision");
759 VAL_STRING("zip");
760 VAL_NAME("Latitude");
761 VAL_NUMBER("37.7668");
762 VAL_NAME("Longitude");
763 VAL_NUMBER("-122.3959");
764 VAL_NAME("Address");
765 VAL_STRING("");
766 VAL_NAME("City");
767 VAL_STRING("SAN FRANCISCO");
768 VAL_NAME("State");
769 VAL_STRING("CA");
770 VAL_NAME("Zip");
771 VAL_STRING("94107");
772 VAL_NAME("Country");
773 VAL_STRING("US");
774 VAL_OBJECT_END();
775 VAL_OBJECT_BEGIN(16);
776 VAL_NAME("precision");
777 VAL_STRING("zip");
778 VAL_NAME("Latitude");
779 VAL_NUMBER("37.371991");
780 VAL_NAME("Longitude");
781 VAL_NUMBER("-122.026020");
782 VAL_NAME("Address");
783 VAL_STRING("");
784 VAL_NAME("City");
785 VAL_STRING("SUNNYVALE");
786 VAL_NAME("State");
787 VAL_STRING("CA");
788 VAL_NAME("Zip");
789 VAL_STRING("94085");
790 VAL_NAME("Country");
791 VAL_STRING("US");
792 VAL_OBJECT_END();
793 VAL_ARRAY_END();
794
795 /* Trailing garbage */
796 PARSE_PASS("{\"a\": [0, 1, 2]}]", 8, "]");
797 VAL_OBJECT_BEGIN(6);
798 VAL_NAME("a");
799 VAL_ARRAY_BEGIN(3);
800 VAL_NUMBER("0");
801 VAL_NUMBER("1");
802 VAL_NUMBER("2");
803 VAL_ARRAY_END();
804 VAL_OBJECT_END();
805
806 PARSE_PASS("{\"a\": [0, 1, 2]}}", 8, "}");
807 PARSE_PASS("{\"a\": [0, 1, 2]}]", 8, "]");
808 VAL_OBJECT_BEGIN(6);
809 VAL_NAME("a");
810 VAL_ARRAY_BEGIN(3);
811 VAL_NUMBER("0");
812 VAL_NUMBER("1");
813 VAL_NUMBER("2");
814 VAL_ARRAY_END();
815 VAL_OBJECT_END();
816
817 PARSE_FAIL("{\"a\": [0, 1, 2}]", SPDK_JSON_PARSE_INVALID);
818 PARSE_FAIL("{\"a\": [0, 1, 2]", SPDK_JSON_PARSE_INCOMPLETE);
819 }
820
821
822 static void
823 test_parse_comment(void)
824 {
825 /* Comments are not allowed by the JSON RFC */
826 PARSE_PASS("[0]", 3, "");
827 PARSE_FAIL("/* test */[0]", SPDK_JSON_PARSE_INVALID);
828 PARSE_FAIL("[/* test */0]", SPDK_JSON_PARSE_INVALID);
829 PARSE_FAIL("[0/* test */]", SPDK_JSON_PARSE_INVALID);
830
831 /*
832 * This is allowed since the parser stops once it reads a complete JSON object.
833 * The next parse call would fail (see tests above) when parsing the comment.
834 */
835 PARSE_PASS("[0]/* test */", 3, "/* test */");
836
837 /*
838 * Test with non-standard comments enabled.
839 */
840 PARSE_PASS_FLAGS("/* test */[0]", 3, "", SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
841 VAL_ARRAY_BEGIN(1);
842 VAL_NUMBER("0");
843 VAL_ARRAY_END();
844
845 PARSE_PASS_FLAGS("[/* test */0]", 3, "", SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
846 VAL_ARRAY_BEGIN(1);
847 VAL_NUMBER("0");
848 VAL_ARRAY_END();
849
850 PARSE_PASS_FLAGS("[0/* test */]", 3, "", SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
851 VAL_ARRAY_BEGIN(1);
852 VAL_NUMBER("0");
853 VAL_ARRAY_END();
854
855 PARSE_FAIL_FLAGS("/* test */", SPDK_JSON_PARSE_INCOMPLETE, SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
856 PARSE_FAIL_FLAGS("[/* test */", SPDK_JSON_PARSE_INCOMPLETE, SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
857 PARSE_FAIL_FLAGS("[0/* test */", SPDK_JSON_PARSE_INCOMPLETE, SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
858
859 /*
860 * Single-line comments
861 */
862 PARSE_PASS_FLAGS("// test\n0", 1, "", SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
863 VAL_NUMBER("0");
864
865 PARSE_PASS_FLAGS("// test\r\n0", 1, "", SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
866 VAL_NUMBER("0");
867
868 PARSE_PASS_FLAGS("// [0] test\n0", 1, "", SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
869 VAL_NUMBER("0");
870
871 PARSE_FAIL_FLAGS("//", SPDK_JSON_PARSE_INCOMPLETE, SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
872 PARSE_FAIL_FLAGS("// test", SPDK_JSON_PARSE_INCOMPLETE, SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
873 PARSE_FAIL_FLAGS("//\n", SPDK_JSON_PARSE_INCOMPLETE, SPDK_JSON_PARSE_FLAG_ALLOW_COMMENTS);
874 }
875
876 int main(int argc, char **argv)
877 {
878 CU_pSuite suite = NULL;
879 unsigned int num_failures;
880
881 if (CU_initialize_registry() != CUE_SUCCESS) {
882 return CU_get_error();
883 }
884
885 suite = CU_add_suite("json", NULL, NULL);
886 if (suite == NULL) {
887 CU_cleanup_registry();
888 return CU_get_error();
889 }
890
891 if (
892 CU_add_test(suite, "parse_literal", test_parse_literal) == NULL ||
893 CU_add_test(suite, "parse_string_simple", test_parse_string_simple) == NULL ||
894 CU_add_test(suite, "parse_string_control_chars", test_parse_string_control_chars) == NULL ||
895 CU_add_test(suite, "parse_string_utf8", test_parse_string_utf8) == NULL ||
896 CU_add_test(suite, "parse_string_escapes_twochar", test_parse_string_escapes_twochar) == NULL ||
897 CU_add_test(suite, "parse_string_escapes_unicode", test_parse_string_escapes_unicode) == NULL ||
898 CU_add_test(suite, "parse_number", test_parse_number) == NULL ||
899 CU_add_test(suite, "parse_array", test_parse_array) == NULL ||
900 CU_add_test(suite, "parse_object", test_parse_object) == NULL ||
901 CU_add_test(suite, "parse_nesting", test_parse_nesting) == NULL ||
902 CU_add_test(suite, "parse_comment", test_parse_comment) == NULL) {
903 CU_cleanup_registry();
904 return CU_get_error();
905 }
906
907 CU_basic_set_mode(CU_BRM_VERBOSE);
908
909 CU_basic_run_tests();
910
911 num_failures = CU_get_number_of_failures();
912 CU_cleanup_registry();
913
914 return num_failures;
915 }