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