1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse * Copyright (C) 2016 Intel Corporation.
3d57bf4ccSDaniel Verkamp * All rights reserved.
4d57bf4ccSDaniel Verkamp */
5d57bf4ccSDaniel Verkamp
6d57bf4ccSDaniel Verkamp #include "spdk/stdinc.h"
7d57bf4ccSDaniel Verkamp
8ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
9d57bf4ccSDaniel Verkamp
10f8ad4dcaSJim Harris #include "json/json_write.c"
11f8ad4dcaSJim Harris #include "json/json_parse.c"
12d57bf4ccSDaniel Verkamp
13d57bf4ccSDaniel Verkamp #include "spdk/util.h"
14d57bf4ccSDaniel Verkamp
15d57bf4ccSDaniel Verkamp static uint8_t g_buf[1000];
16d57bf4ccSDaniel Verkamp static uint8_t *g_write_pos;
17d57bf4ccSDaniel Verkamp
18d57bf4ccSDaniel Verkamp static int
write_cb(void * cb_ctx,const void * data,size_t size)19d57bf4ccSDaniel Verkamp write_cb(void *cb_ctx, const void *data, size_t size)
20d57bf4ccSDaniel Verkamp {
21d57bf4ccSDaniel Verkamp size_t buf_free = g_buf + sizeof(g_buf) - g_write_pos;
22d57bf4ccSDaniel Verkamp
23d57bf4ccSDaniel Verkamp if (size > buf_free) {
24d57bf4ccSDaniel Verkamp return -1;
25d57bf4ccSDaniel Verkamp }
26d57bf4ccSDaniel Verkamp
27d57bf4ccSDaniel Verkamp memcpy(g_write_pos, data, size);
28d57bf4ccSDaniel Verkamp g_write_pos += size;
29d57bf4ccSDaniel Verkamp
30d57bf4ccSDaniel Verkamp return 0;
31d57bf4ccSDaniel Verkamp }
32d57bf4ccSDaniel Verkamp
33d57bf4ccSDaniel Verkamp #define BEGIN() \
34d57bf4ccSDaniel Verkamp memset(g_buf, 0, sizeof(g_buf)); \
35d57bf4ccSDaniel Verkamp g_write_pos = g_buf; \
36d57bf4ccSDaniel Verkamp w = spdk_json_write_begin(write_cb, NULL, 0); \
3756d35c5dSJim Harris SPDK_CU_ASSERT_FATAL(w != NULL)
38d57bf4ccSDaniel Verkamp
39d57bf4ccSDaniel Verkamp #define END(json) \
40d57bf4ccSDaniel Verkamp CU_ASSERT(spdk_json_write_end(w) == 0); \
41d57bf4ccSDaniel Verkamp CU_ASSERT(g_write_pos - g_buf == sizeof(json) - 1); \
42d57bf4ccSDaniel Verkamp CU_ASSERT(memcmp(json, g_buf, sizeof(json) - 1) == 0)
43d57bf4ccSDaniel Verkamp
442d629511SWindYu #define END_SIZE(val, size) \
452d629511SWindYu CU_ASSERT(spdk_json_write_end(w) == 0); \
462d629511SWindYu CU_ASSERT(g_write_pos - g_buf == size); \
472d629511SWindYu CU_ASSERT(memcmp(val, g_buf, size) == 0)
482d629511SWindYu
49d57bf4ccSDaniel Verkamp #define END_NOCMP() \
50d57bf4ccSDaniel Verkamp CU_ASSERT(spdk_json_write_end(w) == 0)
51d57bf4ccSDaniel Verkamp
5270f185eaSThanos Makatos #define END_SIZE_NOCMP(size) \
5370f185eaSThanos Makatos CU_ASSERT(spdk_json_write_end(w) == 0); \
5470f185eaSThanos Makatos CU_ASSERT(g_write_pos - g_buf == size)
5570f185eaSThanos Makatos
56d57bf4ccSDaniel Verkamp #define END_FAIL() \
57d57bf4ccSDaniel Verkamp CU_ASSERT(spdk_json_write_end(w) < 0)
58d57bf4ccSDaniel Verkamp
59d57bf4ccSDaniel Verkamp #define VAL_STRING(str) \
60d57bf4ccSDaniel Verkamp CU_ASSERT(spdk_json_write_string_raw(w, str, sizeof(str) - 1) == 0)
61d57bf4ccSDaniel Verkamp
62d57bf4ccSDaniel Verkamp #define VAL_STRING_FAIL(str) \
63d57bf4ccSDaniel Verkamp CU_ASSERT(spdk_json_write_string_raw(w, str, sizeof(str) - 1) < 0)
64d57bf4ccSDaniel Verkamp
65d57bf4ccSDaniel Verkamp #define STR_PASS(in, out) \
66d57bf4ccSDaniel Verkamp BEGIN(); VAL_STRING(in); END("\"" out "\"")
67d57bf4ccSDaniel Verkamp
68d57bf4ccSDaniel Verkamp #define STR_FAIL(in) \
69d57bf4ccSDaniel Verkamp BEGIN(); VAL_STRING_FAIL(in); END_FAIL()
70d57bf4ccSDaniel Verkamp
71429672d3SDaniel Verkamp #define VAL_STRING_UTF16LE(str) \
72429672d3SDaniel Verkamp CU_ASSERT(spdk_json_write_string_utf16le_raw(w, (const uint16_t *)str, sizeof(str) / sizeof(uint16_t) - 1) == 0)
73429672d3SDaniel Verkamp
74429672d3SDaniel Verkamp #define VAL_STRING_UTF16LE_FAIL(str) \
75429672d3SDaniel Verkamp CU_ASSERT(spdk_json_write_string_utf16le_raw(w, (const uint16_t *)str, sizeof(str) / sizeof(uint16_t) - 1) < 0)
76429672d3SDaniel Verkamp
77429672d3SDaniel Verkamp #define STR_UTF16LE_PASS(in, out) \
78429672d3SDaniel Verkamp BEGIN(); VAL_STRING_UTF16LE(in); END("\"" out "\"")
79429672d3SDaniel Verkamp
80429672d3SDaniel Verkamp #define STR_UTF16LE_FAIL(in) \
81429672d3SDaniel Verkamp BEGIN(); VAL_STRING_UTF16LE_FAIL(in); END_FAIL()
82429672d3SDaniel Verkamp
83d57bf4ccSDaniel Verkamp #define VAL_NAME(name) \
84d57bf4ccSDaniel Verkamp CU_ASSERT(spdk_json_write_name_raw(w, name, sizeof(name) - 1) == 0)
85d57bf4ccSDaniel Verkamp
86d57bf4ccSDaniel Verkamp #define VAL_NULL() CU_ASSERT(spdk_json_write_null(w) == 0)
87d57bf4ccSDaniel Verkamp #define VAL_TRUE() CU_ASSERT(spdk_json_write_bool(w, true) == 0)
88d57bf4ccSDaniel Verkamp #define VAL_FALSE() CU_ASSERT(spdk_json_write_bool(w, false) == 0)
89d57bf4ccSDaniel Verkamp
90d57bf4ccSDaniel Verkamp #define VAL_INT32(i) CU_ASSERT(spdk_json_write_int32(w, i) == 0);
91d57bf4ccSDaniel Verkamp #define VAL_UINT32(u) CU_ASSERT(spdk_json_write_uint32(w, u) == 0);
92d57bf4ccSDaniel Verkamp
93a26050b3SPawel Wodkowski #define VAL_INT64(i) CU_ASSERT(spdk_json_write_int64(w, i) == 0);
94a26050b3SPawel Wodkowski #define VAL_UINT64(u) CU_ASSERT(spdk_json_write_uint64(w, u) == 0);
95a26050b3SPawel Wodkowski
962d629511SWindYu #define VAL_UINT128(low, high) \
972d629511SWindYu CU_ASSERT(spdk_json_write_uint128(w, low, high) == 0);
982d629511SWindYu #define VAL_NAME_UINT128(name, low, high) \
992d629511SWindYu CU_ASSERT(spdk_json_write_named_uint128(w, name, low, high) == 0);
1002d629511SWindYu
10170f185eaSThanos Makatos #define VAL_DOUBLE(d) CU_ASSERT(spdk_json_write_double(w, d) == 0);
10270f185eaSThanos Makatos
103*973075d4SKonrad Sztyber #define VAL_UUID(u) CU_ASSERT(spdk_json_write_uuid(w, u) == 0)
104*973075d4SKonrad Sztyber
105d57bf4ccSDaniel Verkamp #define VAL_ARRAY_BEGIN() CU_ASSERT(spdk_json_write_array_begin(w) == 0)
106d57bf4ccSDaniel Verkamp #define VAL_ARRAY_END() CU_ASSERT(spdk_json_write_array_end(w) == 0)
107d57bf4ccSDaniel Verkamp
108d57bf4ccSDaniel Verkamp #define VAL_OBJECT_BEGIN() CU_ASSERT(spdk_json_write_object_begin(w) == 0)
109d57bf4ccSDaniel Verkamp #define VAL_OBJECT_END() CU_ASSERT(spdk_json_write_object_end(w) == 0)
110d57bf4ccSDaniel Verkamp
111d57bf4ccSDaniel Verkamp #define VAL(v) CU_ASSERT(spdk_json_write_val(w, v) == 0)
112d57bf4ccSDaniel Verkamp
113d57bf4ccSDaniel Verkamp static void
test_write_literal(void)114d57bf4ccSDaniel Verkamp test_write_literal(void)
115d57bf4ccSDaniel Verkamp {
116d57bf4ccSDaniel Verkamp struct spdk_json_write_ctx *w;
117d57bf4ccSDaniel Verkamp
118d57bf4ccSDaniel Verkamp BEGIN();
119d57bf4ccSDaniel Verkamp VAL_NULL();
120d57bf4ccSDaniel Verkamp END("null");
121d57bf4ccSDaniel Verkamp
122d57bf4ccSDaniel Verkamp BEGIN();
123d57bf4ccSDaniel Verkamp VAL_TRUE();
124d57bf4ccSDaniel Verkamp END("true");
125d57bf4ccSDaniel Verkamp
126d57bf4ccSDaniel Verkamp BEGIN();
127d57bf4ccSDaniel Verkamp VAL_FALSE();
128d57bf4ccSDaniel Verkamp END("false");
129d57bf4ccSDaniel Verkamp }
130d57bf4ccSDaniel Verkamp
131d57bf4ccSDaniel Verkamp static void
test_write_string_simple(void)132d57bf4ccSDaniel Verkamp test_write_string_simple(void)
133d57bf4ccSDaniel Verkamp {
134d57bf4ccSDaniel Verkamp struct spdk_json_write_ctx *w;
135d57bf4ccSDaniel Verkamp
136d57bf4ccSDaniel Verkamp STR_PASS("hello world", "hello world");
137d57bf4ccSDaniel Verkamp STR_PASS(" ", " ");
138d57bf4ccSDaniel Verkamp STR_PASS("~", "~");
139d57bf4ccSDaniel Verkamp }
140d57bf4ccSDaniel Verkamp
141d57bf4ccSDaniel Verkamp static void
test_write_string_escapes(void)142d57bf4ccSDaniel Verkamp test_write_string_escapes(void)
143d57bf4ccSDaniel Verkamp {
144d57bf4ccSDaniel Verkamp struct spdk_json_write_ctx *w;
145d57bf4ccSDaniel Verkamp
146d57bf4ccSDaniel Verkamp /* Two-character escapes */
147d57bf4ccSDaniel Verkamp STR_PASS("\b", "\\b");
148d57bf4ccSDaniel Verkamp STR_PASS("\f", "\\f");
149d57bf4ccSDaniel Verkamp STR_PASS("\n", "\\n");
150d57bf4ccSDaniel Verkamp STR_PASS("\r", "\\r");
151d57bf4ccSDaniel Verkamp STR_PASS("\t", "\\t");
152d57bf4ccSDaniel Verkamp STR_PASS("\"", "\\\"");
153d57bf4ccSDaniel Verkamp STR_PASS("\\", "\\\\");
154d57bf4ccSDaniel Verkamp
155d57bf4ccSDaniel Verkamp /* JSON defines an escape for forward slash, but it is optional */
156d57bf4ccSDaniel Verkamp STR_PASS("/", "/");
157d57bf4ccSDaniel Verkamp
158d57bf4ccSDaniel Verkamp STR_PASS("hello\nworld", "hello\\nworld");
159d57bf4ccSDaniel Verkamp
160d57bf4ccSDaniel Verkamp STR_PASS("\x00", "\\u0000");
161d57bf4ccSDaniel Verkamp STR_PASS("\x01", "\\u0001");
162d57bf4ccSDaniel Verkamp STR_PASS("\x02", "\\u0002");
163d57bf4ccSDaniel Verkamp
164d57bf4ccSDaniel Verkamp STR_PASS("\xC3\xB6", "\\u00F6");
165d57bf4ccSDaniel Verkamp STR_PASS("\xE2\x88\x9A", "\\u221A");
166d57bf4ccSDaniel Verkamp STR_PASS("\xEA\xAA\xAA", "\\uAAAA");
167d57bf4ccSDaniel Verkamp
168d57bf4ccSDaniel Verkamp /* Surrogate pairs */
169d57bf4ccSDaniel Verkamp STR_PASS("\xF0\x9D\x84\x9E", "\\uD834\\uDD1E");
170d57bf4ccSDaniel Verkamp STR_PASS("\xF0\xA0\x9C\x8E", "\\uD841\\uDF0E");
171d57bf4ccSDaniel Verkamp
172d57bf4ccSDaniel Verkamp /* Examples from RFC 3629 */
173d57bf4ccSDaniel Verkamp STR_PASS("\x41\xE2\x89\xA2\xCE\x91\x2E", "A\\u2262\\u0391.");
174d57bf4ccSDaniel Verkamp STR_PASS("\xED\x95\x9C\xEA\xB5\xAD\xEC\x96\xB4", "\\uD55C\\uAD6D\\uC5B4");
175d57bf4ccSDaniel Verkamp STR_PASS("\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E", "\\u65E5\\u672C\\u8A9E");
176d57bf4ccSDaniel Verkamp STR_PASS("\xEF\xBB\xBF\xF0\xA3\x8E\xB4", "\\uFEFF\\uD84C\\uDFB4");
177d57bf4ccSDaniel Verkamp
178d57bf4ccSDaniel Verkamp /* UTF-8 edge cases */
179d57bf4ccSDaniel Verkamp STR_PASS("\x7F", "\\u007F");
180d57bf4ccSDaniel Verkamp STR_FAIL("\x80");
181d57bf4ccSDaniel Verkamp STR_FAIL("\xC1");
182d57bf4ccSDaniel Verkamp STR_FAIL("\xC2");
183d57bf4ccSDaniel Verkamp STR_PASS("\xC2\x80", "\\u0080");
184d57bf4ccSDaniel Verkamp STR_PASS("\xC2\xBF", "\\u00BF");
185d57bf4ccSDaniel Verkamp STR_PASS("\xDF\x80", "\\u07C0");
186d57bf4ccSDaniel Verkamp STR_PASS("\xDF\xBF", "\\u07FF");
187d57bf4ccSDaniel Verkamp STR_FAIL("\xDF");
188d57bf4ccSDaniel Verkamp STR_FAIL("\xE0\x80");
189d57bf4ccSDaniel Verkamp STR_FAIL("\xE0\x1F");
190d57bf4ccSDaniel Verkamp STR_FAIL("\xE0\x1F\x80");
191d57bf4ccSDaniel Verkamp STR_FAIL("\xE0");
192d57bf4ccSDaniel Verkamp STR_FAIL("\xE0\xA0");
193d57bf4ccSDaniel Verkamp STR_PASS("\xE0\xA0\x80", "\\u0800");
194d57bf4ccSDaniel Verkamp STR_PASS("\xE0\xA0\xBF", "\\u083F");
195d57bf4ccSDaniel Verkamp STR_FAIL("\xE0\xA0\xC0");
196d57bf4ccSDaniel Verkamp STR_PASS("\xE0\xBF\x80", "\\u0FC0");
197d57bf4ccSDaniel Verkamp STR_PASS("\xE0\xBF\xBF", "\\u0FFF");
198d57bf4ccSDaniel Verkamp STR_FAIL("\xE0\xC0\x80");
199d57bf4ccSDaniel Verkamp STR_FAIL("\xE1");
200d57bf4ccSDaniel Verkamp STR_FAIL("\xE1\x80");
201d57bf4ccSDaniel Verkamp STR_FAIL("\xE1\x7F\x80");
202d57bf4ccSDaniel Verkamp STR_FAIL("\xE1\x80\x7F");
203d57bf4ccSDaniel Verkamp STR_PASS("\xE1\x80\x80", "\\u1000");
204d57bf4ccSDaniel Verkamp STR_PASS("\xE1\x80\xBF", "\\u103F");
205d57bf4ccSDaniel Verkamp STR_PASS("\xE1\xBF\x80", "\\u1FC0");
206d57bf4ccSDaniel Verkamp STR_PASS("\xE1\xBF\xBF", "\\u1FFF");
207d57bf4ccSDaniel Verkamp STR_FAIL("\xE1\xC0\x80");
208d57bf4ccSDaniel Verkamp STR_FAIL("\xE1\x80\xC0");
209d57bf4ccSDaniel Verkamp STR_PASS("\xEF\x80\x80", "\\uF000");
210d57bf4ccSDaniel Verkamp STR_PASS("\xEF\xBF\xBF", "\\uFFFF");
211d57bf4ccSDaniel Verkamp STR_FAIL("\xF0");
212d57bf4ccSDaniel Verkamp STR_FAIL("\xF0\x90");
213d57bf4ccSDaniel Verkamp STR_FAIL("\xF0\x90\x80");
214d57bf4ccSDaniel Verkamp STR_FAIL("\xF0\x80\x80\x80");
215d57bf4ccSDaniel Verkamp STR_FAIL("\xF0\x8F\x80\x80");
216d57bf4ccSDaniel Verkamp STR_PASS("\xF0\x90\x80\x80", "\\uD800\\uDC00");
217d57bf4ccSDaniel Verkamp STR_PASS("\xF0\x90\x80\xBF", "\\uD800\\uDC3F");
218d57bf4ccSDaniel Verkamp STR_PASS("\xF0\x90\xBF\x80", "\\uD803\\uDFC0");
219d57bf4ccSDaniel Verkamp STR_PASS("\xF0\xBF\x80\x80", "\\uD8BC\\uDC00");
220d57bf4ccSDaniel Verkamp STR_FAIL("\xF0\xC0\x80\x80");
221d57bf4ccSDaniel Verkamp STR_FAIL("\xF1");
222d57bf4ccSDaniel Verkamp STR_FAIL("\xF1\x80");
223d57bf4ccSDaniel Verkamp STR_FAIL("\xF1\x80\x80");
224d57bf4ccSDaniel Verkamp STR_FAIL("\xF1\x80\x80\x7F");
225d57bf4ccSDaniel Verkamp STR_PASS("\xF1\x80\x80\x80", "\\uD8C0\\uDC00");
226d57bf4ccSDaniel Verkamp STR_PASS("\xF1\x80\x80\xBF", "\\uD8C0\\uDC3F");
227d57bf4ccSDaniel Verkamp STR_PASS("\xF1\x80\xBF\x80", "\\uD8C3\\uDFC0");
228d57bf4ccSDaniel Verkamp STR_PASS("\xF1\xBF\x80\x80", "\\uD9BC\\uDC00");
229d57bf4ccSDaniel Verkamp STR_PASS("\xF3\x80\x80\x80", "\\uDAC0\\uDC00");
230d57bf4ccSDaniel Verkamp STR_FAIL("\xF3\xC0\x80\x80");
231d57bf4ccSDaniel Verkamp STR_FAIL("\xF3\x80\xC0\x80");
232d57bf4ccSDaniel Verkamp STR_FAIL("\xF3\x80\x80\xC0");
233d57bf4ccSDaniel Verkamp STR_FAIL("\xF4");
234d57bf4ccSDaniel Verkamp STR_FAIL("\xF4\x80");
235d57bf4ccSDaniel Verkamp STR_FAIL("\xF4\x80\x80");
236d57bf4ccSDaniel Verkamp STR_PASS("\xF4\x80\x80\x80", "\\uDBC0\\uDC00");
237d57bf4ccSDaniel Verkamp STR_PASS("\xF4\x8F\x80\x80", "\\uDBFC\\uDC00");
238d57bf4ccSDaniel Verkamp STR_PASS("\xF4\x8F\xBF\xBF", "\\uDBFF\\uDFFF");
239d57bf4ccSDaniel Verkamp STR_FAIL("\xF4\x90\x80\x80");
240d57bf4ccSDaniel Verkamp STR_FAIL("\xF5");
241d57bf4ccSDaniel Verkamp STR_FAIL("\xF5\x80");
242d57bf4ccSDaniel Verkamp STR_FAIL("\xF5\x80\x80");
243d57bf4ccSDaniel Verkamp STR_FAIL("\xF5\x80\x80\x80");
244d57bf4ccSDaniel Verkamp STR_FAIL("\xF5\x80\x80\x80\x80");
245d57bf4ccSDaniel Verkamp
246d57bf4ccSDaniel Verkamp /* Overlong encodings */
247d57bf4ccSDaniel Verkamp STR_FAIL("\xC0\x80");
248d57bf4ccSDaniel Verkamp
249d57bf4ccSDaniel Verkamp /* Surrogate pairs */
250d57bf4ccSDaniel Verkamp STR_FAIL("\xED\xA0\x80"); /* U+D800 First high surrogate */
251d57bf4ccSDaniel Verkamp STR_FAIL("\xED\xAF\xBF"); /* U+DBFF Last high surrogate */
252d57bf4ccSDaniel Verkamp STR_FAIL("\xED\xB0\x80"); /* U+DC00 First low surrogate */
253d57bf4ccSDaniel Verkamp STR_FAIL("\xED\xBF\xBF"); /* U+DFFF Last low surrogate */
254d57bf4ccSDaniel Verkamp STR_FAIL("\xED\xA1\x8C\xED\xBE\xB4"); /* U+233B4 (invalid surrogate pair encoding) */
255d57bf4ccSDaniel Verkamp }
256d57bf4ccSDaniel Verkamp
257d57bf4ccSDaniel Verkamp static void
test_write_string_utf16le(void)258429672d3SDaniel Verkamp test_write_string_utf16le(void)
259429672d3SDaniel Verkamp {
260429672d3SDaniel Verkamp struct spdk_json_write_ctx *w;
261429672d3SDaniel Verkamp
262429672d3SDaniel Verkamp /* All characters in BMP */
263429672d3SDaniel Verkamp STR_UTF16LE_PASS(((uint8_t[]) {
264429672d3SDaniel Verkamp 'H', 0, 'e', 0, 'l', 0, 'l', 0, 'o', 0, 0x15, 0xFE, 0, 0
265429672d3SDaniel Verkamp }), "Hello\\uFE15");
266429672d3SDaniel Verkamp
267429672d3SDaniel Verkamp /* Surrogate pair */
268429672d3SDaniel Verkamp STR_UTF16LE_PASS(((uint8_t[]) {
269429672d3SDaniel Verkamp 'H', 0, 'i', 0, 0x34, 0xD8, 0x1E, 0xDD, '!', 0, 0, 0
270429672d3SDaniel Verkamp }), "Hi\\uD834\\uDD1E!");
271429672d3SDaniel Verkamp
272429672d3SDaniel Verkamp /* Valid high surrogate, but no low surrogate */
273429672d3SDaniel Verkamp STR_UTF16LE_FAIL(((uint8_t[]) {
274429672d3SDaniel Verkamp 0x00, 0xD8, 0, 0 /* U+D800 */
275429672d3SDaniel Verkamp }));
276429672d3SDaniel Verkamp
277429672d3SDaniel Verkamp /* Invalid leading low surrogate */
278429672d3SDaniel Verkamp STR_UTF16LE_FAIL(((uint8_t[]) {
279429672d3SDaniel Verkamp 0x00, 0xDC, 0x00, 0xDC, 0, 0 /* U+DC00 U+DC00 */
280429672d3SDaniel Verkamp }));
281429672d3SDaniel Verkamp
282429672d3SDaniel Verkamp /* Valid high surrogate followed by another high surrogate (invalid) */
283429672d3SDaniel Verkamp STR_UTF16LE_FAIL(((uint8_t[]) {
284429672d3SDaniel Verkamp 0x00, 0xD8, 0x00, 0xD8, 0, 0 /* U+D800 U+D800 */
285429672d3SDaniel Verkamp }));
286429672d3SDaniel Verkamp }
287429672d3SDaniel Verkamp
288429672d3SDaniel Verkamp static void
test_write_number_int32(void)289d57bf4ccSDaniel Verkamp test_write_number_int32(void)
290d57bf4ccSDaniel Verkamp {
291d57bf4ccSDaniel Verkamp struct spdk_json_write_ctx *w;
292d57bf4ccSDaniel Verkamp
293d57bf4ccSDaniel Verkamp BEGIN();
294d57bf4ccSDaniel Verkamp VAL_INT32(0);
295d57bf4ccSDaniel Verkamp END("0");
296d57bf4ccSDaniel Verkamp
297d57bf4ccSDaniel Verkamp BEGIN();
298d57bf4ccSDaniel Verkamp VAL_INT32(1);
299d57bf4ccSDaniel Verkamp END("1");
300d57bf4ccSDaniel Verkamp
301d57bf4ccSDaniel Verkamp BEGIN();
302d57bf4ccSDaniel Verkamp VAL_INT32(123);
303d57bf4ccSDaniel Verkamp END("123");
304d57bf4ccSDaniel Verkamp
305d57bf4ccSDaniel Verkamp BEGIN();
306d57bf4ccSDaniel Verkamp VAL_INT32(-123);
307d57bf4ccSDaniel Verkamp END("-123");
308d57bf4ccSDaniel Verkamp
309d57bf4ccSDaniel Verkamp BEGIN();
310d57bf4ccSDaniel Verkamp VAL_INT32(2147483647);
311d57bf4ccSDaniel Verkamp END("2147483647");
312d57bf4ccSDaniel Verkamp
313d57bf4ccSDaniel Verkamp BEGIN();
314d57bf4ccSDaniel Verkamp VAL_INT32(-2147483648);
315d57bf4ccSDaniel Verkamp END("-2147483648");
316d57bf4ccSDaniel Verkamp }
317d57bf4ccSDaniel Verkamp
318d57bf4ccSDaniel Verkamp static void
test_write_number_uint32(void)319d57bf4ccSDaniel Verkamp test_write_number_uint32(void)
320d57bf4ccSDaniel Verkamp {
321d57bf4ccSDaniel Verkamp struct spdk_json_write_ctx *w;
322d57bf4ccSDaniel Verkamp
323d57bf4ccSDaniel Verkamp BEGIN();
324d57bf4ccSDaniel Verkamp VAL_UINT32(0);
325d57bf4ccSDaniel Verkamp END("0");
326d57bf4ccSDaniel Verkamp
327d57bf4ccSDaniel Verkamp BEGIN();
328d57bf4ccSDaniel Verkamp VAL_UINT32(1);
329d57bf4ccSDaniel Verkamp END("1");
330d57bf4ccSDaniel Verkamp
331d57bf4ccSDaniel Verkamp BEGIN();
332d57bf4ccSDaniel Verkamp VAL_UINT32(123);
333d57bf4ccSDaniel Verkamp END("123");
334d57bf4ccSDaniel Verkamp
335d57bf4ccSDaniel Verkamp BEGIN();
336d57bf4ccSDaniel Verkamp VAL_UINT32(2147483647);
337d57bf4ccSDaniel Verkamp END("2147483647");
338d57bf4ccSDaniel Verkamp
339d57bf4ccSDaniel Verkamp BEGIN();
340d57bf4ccSDaniel Verkamp VAL_UINT32(4294967295);
341d57bf4ccSDaniel Verkamp END("4294967295");
342d57bf4ccSDaniel Verkamp }
343d57bf4ccSDaniel Verkamp
3442d629511SWindYu static int
test_generate_string_uint128(char * buf,int buf_size,uint64_t low,uint64_t high)3452d629511SWindYu test_generate_string_uint128(char *buf, int buf_size, uint64_t low, uint64_t high)
3462d629511SWindYu {
3472d629511SWindYu char tmp_buf[256] = {0};
3482d629511SWindYu unsigned __int128 total;
3492d629511SWindYu uint64_t seg;
3502d629511SWindYu int count = 0;
3512d629511SWindYu
3522d629511SWindYu memset(buf, 0, buf_size);
3532d629511SWindYu total = ((unsigned __int128)high << 64) + (unsigned __int128)low;
3542d629511SWindYu while (total) {
3552d629511SWindYu /* Use the different calculation to get the 128bits decimal value in UT */
3562d629511SWindYu seg = total % 1000000000000000;
3572d629511SWindYu total = total / 1000000000000000;
3582d629511SWindYu if (total) {
3592d629511SWindYu snprintf(tmp_buf, buf_size, "%015" PRIu64 "%s", seg, buf);
3602d629511SWindYu } else {
3612d629511SWindYu snprintf(tmp_buf, buf_size, "%" PRIu64 "%s", seg, buf);
3622d629511SWindYu }
3632d629511SWindYu
3642d629511SWindYu count = snprintf(buf, buf_size, "%s", tmp_buf);
3652d629511SWindYu }
3662d629511SWindYu
3672d629511SWindYu return count;
3682d629511SWindYu }
3692d629511SWindYu
3702d629511SWindYu static int
test_generate_string_name_uint128(char * name,char * buf,int buf_size,uint64_t low,uint64_t high)3712d629511SWindYu test_generate_string_name_uint128(char *name, char *buf, int buf_size, uint64_t low, uint64_t high)
3722d629511SWindYu {
3732d629511SWindYu char tmp_buf[256] = {0};
3742d629511SWindYu int count = test_generate_string_uint128(buf, buf_size, low, high);
3752d629511SWindYu
3762d629511SWindYu memcpy(tmp_buf, buf, buf_size);
3772d629511SWindYu count = snprintf(buf, 256, "\"%s\":%s", name, tmp_buf);
3782d629511SWindYu
3792d629511SWindYu return count;
3802d629511SWindYu }
3812d629511SWindYu
3822d629511SWindYu static void
test_write_number_uint128(void)3832d629511SWindYu test_write_number_uint128(void)
3842d629511SWindYu {
3852d629511SWindYu struct spdk_json_write_ctx *w;
3862d629511SWindYu char buf[256] = {0};
3872d629511SWindYu int used_count = 0;
3882d629511SWindYu
3892d629511SWindYu BEGIN();
3902d629511SWindYu VAL_UINT128(0, 0);
3912d629511SWindYu END("0");
3922d629511SWindYu
3932d629511SWindYu BEGIN();
3942d629511SWindYu VAL_UINT128(1, 0);
3952d629511SWindYu used_count = test_generate_string_uint128(buf, sizeof(buf), 1, 0);
3962d629511SWindYu END_SIZE(buf, used_count);
3972d629511SWindYu
3982d629511SWindYu BEGIN();
3992d629511SWindYu VAL_UINT128(123, 0);
4002d629511SWindYu used_count = test_generate_string_uint128(buf, sizeof(buf), 123, 0);
4012d629511SWindYu END_SIZE(buf, used_count);
4022d629511SWindYu
4032d629511SWindYu BEGIN();
4042d629511SWindYu VAL_UINT128(2147483647, 0);
4052d629511SWindYu used_count = test_generate_string_uint128(buf, sizeof(buf), 2147483647, 0);
4062d629511SWindYu END_SIZE(buf, used_count);
4072d629511SWindYu
4082d629511SWindYu BEGIN();
4092d629511SWindYu VAL_UINT128(0, 1);
4102d629511SWindYu used_count = test_generate_string_uint128(buf, sizeof(buf), 0, 1);
4112d629511SWindYu END_SIZE(buf, used_count);
4122d629511SWindYu
4132d629511SWindYu BEGIN();
4142d629511SWindYu VAL_UINT128(4294967295, 1);
4152d629511SWindYu used_count = test_generate_string_uint128(buf, sizeof(buf), 4294967295, 1);
4162d629511SWindYu END_SIZE(buf, used_count);
4172d629511SWindYu
4182d629511SWindYu BEGIN();
4192d629511SWindYu VAL_UINT128(2147483647, 4294967295);
4202d629511SWindYu used_count = test_generate_string_uint128(buf, sizeof(buf), 2147483647, 4294967295);
4212d629511SWindYu END_SIZE(buf, used_count);
4222d629511SWindYu
4232d629511SWindYu BEGIN();
4242d629511SWindYu VAL_UINT128(4294967295, 4294967295);
4252d629511SWindYu used_count = test_generate_string_uint128(buf, sizeof(buf), 4294967295, 4294967295);
4262d629511SWindYu END_SIZE(buf, used_count);
4272d629511SWindYu }
4282d629511SWindYu
4292d629511SWindYu static void
test_write_string_number_uint128(void)4302d629511SWindYu test_write_string_number_uint128(void)
4312d629511SWindYu {
4322d629511SWindYu struct spdk_json_write_ctx *w;
4332d629511SWindYu char buf[256] = {0};
4342d629511SWindYu int used_count = 0;
4352d629511SWindYu
4362d629511SWindYu BEGIN();
4372d629511SWindYu VAL_NAME_UINT128("case1", 0, 0);
4382d629511SWindYu END("\"case1\":0");
4392d629511SWindYu
4402d629511SWindYu BEGIN();
4412d629511SWindYu VAL_NAME_UINT128("case2", 1, 0);
4422d629511SWindYu used_count = test_generate_string_name_uint128("case2", buf, sizeof(buf), 1, 0);
4432d629511SWindYu END_SIZE(buf, used_count);
4442d629511SWindYu
4452d629511SWindYu BEGIN();
4462d629511SWindYu VAL_NAME_UINT128("case3", 123, 0);
4472d629511SWindYu used_count = test_generate_string_name_uint128("case3", buf, sizeof(buf), 123, 0);
4482d629511SWindYu END_SIZE(buf, used_count);
4492d629511SWindYu
4502d629511SWindYu BEGIN();
4512d629511SWindYu VAL_NAME_UINT128("case4", 2147483647, 0);
4522d629511SWindYu used_count = test_generate_string_name_uint128("case4", buf, sizeof(buf), 2147483647, 0);
4532d629511SWindYu END_SIZE(buf, used_count);
4542d629511SWindYu
4552d629511SWindYu BEGIN();
4562d629511SWindYu VAL_NAME_UINT128("case5", 0, 1);
4572d629511SWindYu used_count = test_generate_string_name_uint128("case5", buf, sizeof(buf), 0, 1);
4582d629511SWindYu END_SIZE(buf, used_count);
4592d629511SWindYu
4602d629511SWindYu BEGIN();
4612d629511SWindYu VAL_NAME_UINT128("case6", 4294967295, 1);
4622d629511SWindYu used_count = test_generate_string_name_uint128("case6", buf, sizeof(buf), 4294967295, 1);
4632d629511SWindYu END_SIZE(buf, used_count);
4642d629511SWindYu
4652d629511SWindYu BEGIN();
4662d629511SWindYu VAL_NAME_UINT128("case7", 2147483647, 4294967295);
4672d629511SWindYu used_count = test_generate_string_name_uint128("case7", buf, sizeof(buf), 2147483647, 4294967295);
4682d629511SWindYu END_SIZE(buf, used_count);
4692d629511SWindYu
4702d629511SWindYu BEGIN();
4712d629511SWindYu VAL_NAME_UINT128("case8", 4294967295, 4294967295);
4722d629511SWindYu used_count = test_generate_string_name_uint128("case8", buf, sizeof(buf), 4294967295, 4294967295);
4732d629511SWindYu END_SIZE(buf, used_count);
4742d629511SWindYu }
4752d629511SWindYu
476d57bf4ccSDaniel Verkamp static void
test_write_number_int64(void)477a26050b3SPawel Wodkowski test_write_number_int64(void)
478a26050b3SPawel Wodkowski {
479a26050b3SPawel Wodkowski struct spdk_json_write_ctx *w;
480a26050b3SPawel Wodkowski
481a26050b3SPawel Wodkowski BEGIN();
482a26050b3SPawel Wodkowski VAL_INT64(0);
483a26050b3SPawel Wodkowski END("0");
484a26050b3SPawel Wodkowski
485a26050b3SPawel Wodkowski BEGIN();
486a26050b3SPawel Wodkowski VAL_INT64(1);
487a26050b3SPawel Wodkowski END("1");
488a26050b3SPawel Wodkowski
489a26050b3SPawel Wodkowski BEGIN();
490a26050b3SPawel Wodkowski VAL_INT64(123);
491a26050b3SPawel Wodkowski END("123");
492a26050b3SPawel Wodkowski
493a26050b3SPawel Wodkowski BEGIN();
494a26050b3SPawel Wodkowski VAL_INT64(-123);
495a26050b3SPawel Wodkowski END("-123");
496a26050b3SPawel Wodkowski
497a26050b3SPawel Wodkowski BEGIN();
498a26050b3SPawel Wodkowski VAL_INT64(INT64_MAX);
499a26050b3SPawel Wodkowski END("9223372036854775807");
500a26050b3SPawel Wodkowski
501a26050b3SPawel Wodkowski BEGIN();
502a26050b3SPawel Wodkowski VAL_INT64(INT64_MIN);
503a26050b3SPawel Wodkowski END("-9223372036854775808");
504a26050b3SPawel Wodkowski }
505a26050b3SPawel Wodkowski
506a26050b3SPawel Wodkowski static void
test_write_number_uint64(void)507a26050b3SPawel Wodkowski test_write_number_uint64(void)
508a26050b3SPawel Wodkowski {
509a26050b3SPawel Wodkowski struct spdk_json_write_ctx *w;
510a26050b3SPawel Wodkowski
511a26050b3SPawel Wodkowski BEGIN();
512a26050b3SPawel Wodkowski VAL_UINT64(0);
513a26050b3SPawel Wodkowski END("0");
514a26050b3SPawel Wodkowski
515a26050b3SPawel Wodkowski BEGIN();
516a26050b3SPawel Wodkowski VAL_UINT64(1);
517a26050b3SPawel Wodkowski END("1");
518a26050b3SPawel Wodkowski
519a26050b3SPawel Wodkowski BEGIN();
520a26050b3SPawel Wodkowski VAL_UINT64(123);
521a26050b3SPawel Wodkowski END("123");
522a26050b3SPawel Wodkowski
523a26050b3SPawel Wodkowski BEGIN();
524a26050b3SPawel Wodkowski VAL_UINT64(INT64_MAX);
525a26050b3SPawel Wodkowski END("9223372036854775807");
526a26050b3SPawel Wodkowski
527a26050b3SPawel Wodkowski BEGIN();
528a26050b3SPawel Wodkowski VAL_UINT64(UINT64_MAX);
529a26050b3SPawel Wodkowski END("18446744073709551615");
530a26050b3SPawel Wodkowski }
531a26050b3SPawel Wodkowski
532a26050b3SPawel Wodkowski static void
test_write_number_double(void)53370f185eaSThanos Makatos test_write_number_double(void)
53470f185eaSThanos Makatos {
53570f185eaSThanos Makatos struct spdk_json_write_ctx *w;
53670f185eaSThanos Makatos
53770f185eaSThanos Makatos BEGIN();
53870f185eaSThanos Makatos VAL_DOUBLE(0);
53970f185eaSThanos Makatos END_SIZE("0.00000000000000000000e+00", 26);
54070f185eaSThanos Makatos
54170f185eaSThanos Makatos BEGIN();
54270f185eaSThanos Makatos VAL_DOUBLE(1.2);
54370f185eaSThanos Makatos END_SIZE("1.19999999999999995559e+00", 26);
54470f185eaSThanos Makatos
54570f185eaSThanos Makatos
54670f185eaSThanos Makatos BEGIN();
54770f185eaSThanos Makatos VAL_DOUBLE(1234.5678);
54870f185eaSThanos Makatos END_SIZE("1.23456780000000003383e+03", 26);
54970f185eaSThanos Makatos
55070f185eaSThanos Makatos BEGIN();
55170f185eaSThanos Makatos VAL_DOUBLE(-1234.5678);
55270f185eaSThanos Makatos END_SIZE("-1.23456780000000003383e+03", 27);
55370f185eaSThanos Makatos }
55470f185eaSThanos Makatos
55570f185eaSThanos Makatos static void
test_write_uuid(void)556*973075d4SKonrad Sztyber test_write_uuid(void)
557*973075d4SKonrad Sztyber {
558*973075d4SKonrad Sztyber #define UT_UUID "e524acae-8c26-43e4-882a-461b8690583b"
559*973075d4SKonrad Sztyber struct spdk_json_write_ctx *w;
560*973075d4SKonrad Sztyber struct spdk_uuid uuid;
561*973075d4SKonrad Sztyber int rc;
562*973075d4SKonrad Sztyber
563*973075d4SKonrad Sztyber rc = spdk_uuid_parse(&uuid, UT_UUID);
564*973075d4SKonrad Sztyber CU_ASSERT_EQUAL(rc, 0);
565*973075d4SKonrad Sztyber
566*973075d4SKonrad Sztyber BEGIN();
567*973075d4SKonrad Sztyber VAL_UUID(&uuid);
568*973075d4SKonrad Sztyber END("\"" UT_UUID "\"");
569*973075d4SKonrad Sztyber }
570*973075d4SKonrad Sztyber
571*973075d4SKonrad Sztyber static void
test_write_array(void)572d57bf4ccSDaniel Verkamp test_write_array(void)
573d57bf4ccSDaniel Verkamp {
574d57bf4ccSDaniel Verkamp struct spdk_json_write_ctx *w;
575d57bf4ccSDaniel Verkamp
576d57bf4ccSDaniel Verkamp BEGIN();
577d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
578d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
579d57bf4ccSDaniel Verkamp END("[]");
580d57bf4ccSDaniel Verkamp
581d57bf4ccSDaniel Verkamp BEGIN();
582d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
583d57bf4ccSDaniel Verkamp VAL_INT32(0);
584d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
585d57bf4ccSDaniel Verkamp END("[0]");
586d57bf4ccSDaniel Verkamp
587d57bf4ccSDaniel Verkamp BEGIN();
588d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
589d57bf4ccSDaniel Verkamp VAL_INT32(0);
590d57bf4ccSDaniel Verkamp VAL_INT32(1);
591d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
592d57bf4ccSDaniel Verkamp END("[0,1]");
593d57bf4ccSDaniel Verkamp
594d57bf4ccSDaniel Verkamp BEGIN();
595d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
596d57bf4ccSDaniel Verkamp VAL_INT32(0);
597d57bf4ccSDaniel Verkamp VAL_INT32(1);
598d57bf4ccSDaniel Verkamp VAL_INT32(2);
599d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
600d57bf4ccSDaniel Verkamp END("[0,1,2]");
601d57bf4ccSDaniel Verkamp
602d57bf4ccSDaniel Verkamp BEGIN();
603d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
604d57bf4ccSDaniel Verkamp VAL_STRING("a");
605d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
606d57bf4ccSDaniel Verkamp END("[\"a\"]");
607d57bf4ccSDaniel Verkamp
608d57bf4ccSDaniel Verkamp BEGIN();
609d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
610d57bf4ccSDaniel Verkamp VAL_STRING("a");
611d57bf4ccSDaniel Verkamp VAL_STRING("b");
612d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
613d57bf4ccSDaniel Verkamp END("[\"a\",\"b\"]");
614d57bf4ccSDaniel Verkamp
615d57bf4ccSDaniel Verkamp BEGIN();
616d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
617d57bf4ccSDaniel Verkamp VAL_STRING("a");
618d57bf4ccSDaniel Verkamp VAL_STRING("b");
619d57bf4ccSDaniel Verkamp VAL_STRING("c");
620d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
621d57bf4ccSDaniel Verkamp END("[\"a\",\"b\",\"c\"]");
622d57bf4ccSDaniel Verkamp
623d57bf4ccSDaniel Verkamp BEGIN();
624d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
625d57bf4ccSDaniel Verkamp VAL_TRUE();
626d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
627d57bf4ccSDaniel Verkamp END("[true]");
628d57bf4ccSDaniel Verkamp
629d57bf4ccSDaniel Verkamp BEGIN();
630d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
631d57bf4ccSDaniel Verkamp VAL_TRUE();
632d57bf4ccSDaniel Verkamp VAL_FALSE();
633d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
634d57bf4ccSDaniel Verkamp END("[true,false]");
635d57bf4ccSDaniel Verkamp
636d57bf4ccSDaniel Verkamp BEGIN();
637d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
638d57bf4ccSDaniel Verkamp VAL_TRUE();
639d57bf4ccSDaniel Verkamp VAL_FALSE();
640d57bf4ccSDaniel Verkamp VAL_TRUE();
641d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
642d57bf4ccSDaniel Verkamp END("[true,false,true]");
643d57bf4ccSDaniel Verkamp }
644d57bf4ccSDaniel Verkamp
645d57bf4ccSDaniel Verkamp static void
test_write_object(void)646d57bf4ccSDaniel Verkamp test_write_object(void)
647d57bf4ccSDaniel Verkamp {
648d57bf4ccSDaniel Verkamp struct spdk_json_write_ctx *w;
649d57bf4ccSDaniel Verkamp
650d57bf4ccSDaniel Verkamp BEGIN();
651d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
652d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
653d57bf4ccSDaniel Verkamp END("{}");
654d57bf4ccSDaniel Verkamp
655d57bf4ccSDaniel Verkamp BEGIN();
656d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
657d57bf4ccSDaniel Verkamp VAL_NAME("a");
658d57bf4ccSDaniel Verkamp VAL_INT32(0);
659d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
660d57bf4ccSDaniel Verkamp END("{\"a\":0}");
661d57bf4ccSDaniel Verkamp
662d57bf4ccSDaniel Verkamp BEGIN();
663d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
664d57bf4ccSDaniel Verkamp VAL_NAME("a");
665d57bf4ccSDaniel Verkamp VAL_INT32(0);
666d57bf4ccSDaniel Verkamp VAL_NAME("b");
667d57bf4ccSDaniel Verkamp VAL_INT32(1);
668d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
669d57bf4ccSDaniel Verkamp END("{\"a\":0,\"b\":1}");
670d57bf4ccSDaniel Verkamp
671d57bf4ccSDaniel Verkamp BEGIN();
672d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
673d57bf4ccSDaniel Verkamp VAL_NAME("a");
674d57bf4ccSDaniel Verkamp VAL_INT32(0);
675d57bf4ccSDaniel Verkamp VAL_NAME("b");
676d57bf4ccSDaniel Verkamp VAL_INT32(1);
677d57bf4ccSDaniel Verkamp VAL_NAME("c");
678d57bf4ccSDaniel Verkamp VAL_INT32(2);
679d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
680d57bf4ccSDaniel Verkamp END("{\"a\":0,\"b\":1,\"c\":2}");
681d57bf4ccSDaniel Verkamp }
682d57bf4ccSDaniel Verkamp
683d57bf4ccSDaniel Verkamp static void
test_write_nesting(void)684d57bf4ccSDaniel Verkamp test_write_nesting(void)
685d57bf4ccSDaniel Verkamp {
686d57bf4ccSDaniel Verkamp struct spdk_json_write_ctx *w;
687d57bf4ccSDaniel Verkamp
688d57bf4ccSDaniel Verkamp BEGIN();
689d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
690d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
691d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
692d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
693d57bf4ccSDaniel Verkamp END("[[]]");
694d57bf4ccSDaniel Verkamp
695d57bf4ccSDaniel Verkamp BEGIN();
696d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
697d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
698d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
699d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
700d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
701d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
702d57bf4ccSDaniel Verkamp END("[[[]]]");
703d57bf4ccSDaniel Verkamp
704d57bf4ccSDaniel Verkamp BEGIN();
705d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
706d57bf4ccSDaniel Verkamp VAL_INT32(0);
707d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
708d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
709d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
710d57bf4ccSDaniel Verkamp END("[0,[]]");
711d57bf4ccSDaniel Verkamp
712d57bf4ccSDaniel Verkamp BEGIN();
713d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
714d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
715d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
716d57bf4ccSDaniel Verkamp VAL_INT32(0);
717d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
718d57bf4ccSDaniel Verkamp END("[[],0]");
719d57bf4ccSDaniel Verkamp
720d57bf4ccSDaniel Verkamp BEGIN();
721d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
722d57bf4ccSDaniel Verkamp VAL_INT32(0);
723d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
724d57bf4ccSDaniel Verkamp VAL_INT32(1);
725d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
726d57bf4ccSDaniel Verkamp VAL_INT32(2);
727d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
728d57bf4ccSDaniel Verkamp END("[0,[1],2]");
729d57bf4ccSDaniel Verkamp
730d57bf4ccSDaniel Verkamp BEGIN();
731d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
732d57bf4ccSDaniel Verkamp VAL_INT32(0);
733d57bf4ccSDaniel Verkamp VAL_INT32(1);
734d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
735d57bf4ccSDaniel Verkamp VAL_INT32(2);
736d57bf4ccSDaniel Verkamp VAL_INT32(3);
737d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
738d57bf4ccSDaniel Verkamp VAL_INT32(4);
739d57bf4ccSDaniel Verkamp VAL_INT32(5);
740d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
741d57bf4ccSDaniel Verkamp END("[0,1,[2,3],4,5]");
742d57bf4ccSDaniel Verkamp
743d57bf4ccSDaniel Verkamp BEGIN();
744d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
745d57bf4ccSDaniel Verkamp VAL_NAME("a");
746d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
747d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
748d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
749d57bf4ccSDaniel Verkamp END("{\"a\":{}}");
750d57bf4ccSDaniel Verkamp
751d57bf4ccSDaniel Verkamp BEGIN();
752d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
753d57bf4ccSDaniel Verkamp VAL_NAME("a");
754d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
755d57bf4ccSDaniel Verkamp VAL_NAME("b");
756d57bf4ccSDaniel Verkamp VAL_INT32(0);
757d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
758d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
759d57bf4ccSDaniel Verkamp END("{\"a\":{\"b\":0}}");
760d57bf4ccSDaniel Verkamp
761d57bf4ccSDaniel Verkamp BEGIN();
762d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
763d57bf4ccSDaniel Verkamp VAL_NAME("a");
764d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
765d57bf4ccSDaniel Verkamp VAL_INT32(0);
766d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
767d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
768d57bf4ccSDaniel Verkamp END("{\"a\":[0]}");
769d57bf4ccSDaniel Verkamp
770d57bf4ccSDaniel Verkamp BEGIN();
771d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
772d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
773d57bf4ccSDaniel Verkamp VAL_NAME("a");
774d57bf4ccSDaniel Verkamp VAL_INT32(0);
775d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
776d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
777d57bf4ccSDaniel Verkamp END("[{\"a\":0}]");
778d57bf4ccSDaniel Verkamp
779d57bf4ccSDaniel Verkamp BEGIN();
780d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
781d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
782d57bf4ccSDaniel Verkamp VAL_NAME("a");
783d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
784d57bf4ccSDaniel Verkamp VAL_NAME("b");
785d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
786d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
787d57bf4ccSDaniel Verkamp VAL_NAME("c");
788d57bf4ccSDaniel Verkamp VAL_INT32(1);
789d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
790d57bf4ccSDaniel Verkamp VAL_INT32(2);
791d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
792d57bf4ccSDaniel Verkamp VAL_NAME("d");
793d57bf4ccSDaniel Verkamp VAL_INT32(3);
794d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
795d57bf4ccSDaniel Verkamp VAL_NAME("e");
796d57bf4ccSDaniel Verkamp VAL_INT32(4);
797d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
798d57bf4ccSDaniel Verkamp VAL_INT32(5);
799d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
800d57bf4ccSDaniel Verkamp END("[{\"a\":{\"b\":[{\"c\":1},2],\"d\":3},\"e\":4},5]");
801d57bf4ccSDaniel Verkamp
802d57bf4ccSDaniel Verkamp /* Examples from RFC 7159 */
803d57bf4ccSDaniel Verkamp BEGIN();
804d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
805d57bf4ccSDaniel Verkamp VAL_NAME("Image");
806d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
807d57bf4ccSDaniel Verkamp VAL_NAME("Width");
808d57bf4ccSDaniel Verkamp VAL_INT32(800);
809d57bf4ccSDaniel Verkamp VAL_NAME("Height");
810d57bf4ccSDaniel Verkamp VAL_INT32(600);
811d57bf4ccSDaniel Verkamp VAL_NAME("Title");
812d57bf4ccSDaniel Verkamp VAL_STRING("View from 15th Floor");
813d57bf4ccSDaniel Verkamp VAL_NAME("Thumbnail");
814d57bf4ccSDaniel Verkamp VAL_OBJECT_BEGIN();
815d57bf4ccSDaniel Verkamp VAL_NAME("Url");
816d57bf4ccSDaniel Verkamp VAL_STRING("http://www.example.com/image/481989943");
817d57bf4ccSDaniel Verkamp VAL_NAME("Height");
818d57bf4ccSDaniel Verkamp VAL_INT32(125);
819d57bf4ccSDaniel Verkamp VAL_NAME("Width");
820d57bf4ccSDaniel Verkamp VAL_INT32(100);
821d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
822d57bf4ccSDaniel Verkamp VAL_NAME("Animated");
823d57bf4ccSDaniel Verkamp VAL_FALSE();
824d57bf4ccSDaniel Verkamp VAL_NAME("IDs");
825d57bf4ccSDaniel Verkamp VAL_ARRAY_BEGIN();
826d57bf4ccSDaniel Verkamp VAL_INT32(116);
827d57bf4ccSDaniel Verkamp VAL_INT32(943);
828d57bf4ccSDaniel Verkamp VAL_INT32(234);
829d57bf4ccSDaniel Verkamp VAL_INT32(38793);
830d57bf4ccSDaniel Verkamp VAL_ARRAY_END();
831d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
832d57bf4ccSDaniel Verkamp VAL_OBJECT_END();
833d57bf4ccSDaniel Verkamp END(
834d57bf4ccSDaniel Verkamp "{\"Image\":"
835d57bf4ccSDaniel Verkamp "{"
836d57bf4ccSDaniel Verkamp "\"Width\":800,"
837d57bf4ccSDaniel Verkamp "\"Height\":600,"
838d57bf4ccSDaniel Verkamp "\"Title\":\"View from 15th Floor\","
839d57bf4ccSDaniel Verkamp "\"Thumbnail\":{"
840d57bf4ccSDaniel Verkamp "\"Url\":\"http://www.example.com/image/481989943\","
841d57bf4ccSDaniel Verkamp "\"Height\":125,"
842d57bf4ccSDaniel Verkamp "\"Width\":100"
843d57bf4ccSDaniel Verkamp "},"
844d57bf4ccSDaniel Verkamp "\"Animated\":false,"
845d57bf4ccSDaniel Verkamp "\"IDs\":[116,943,234,38793]"
846d57bf4ccSDaniel Verkamp "}"
847d57bf4ccSDaniel Verkamp "}");
848d57bf4ccSDaniel Verkamp }
849d57bf4ccSDaniel Verkamp
850d57bf4ccSDaniel Verkamp /* Round-trip parse and write test */
851d57bf4ccSDaniel Verkamp static void
test_write_val(void)852d57bf4ccSDaniel Verkamp test_write_val(void)
853d57bf4ccSDaniel Verkamp {
854d57bf4ccSDaniel Verkamp struct spdk_json_write_ctx *w;
855d57bf4ccSDaniel Verkamp struct spdk_json_val values[100];
856d57bf4ccSDaniel Verkamp char src[] = "{\"a\":[1,2,3],\"b\":{\"c\":\"d\"},\"e\":true,\"f\":false,\"g\":null}";
857d57bf4ccSDaniel Verkamp
858d57bf4ccSDaniel Verkamp CU_ASSERT(spdk_json_parse(src, strlen(src), values, SPDK_COUNTOF(values), NULL,
859d57bf4ccSDaniel Verkamp SPDK_JSON_PARSE_FLAG_DECODE_IN_PLACE) == 19);
860d57bf4ccSDaniel Verkamp
861d57bf4ccSDaniel Verkamp BEGIN();
862d57bf4ccSDaniel Verkamp VAL(values);
863d57bf4ccSDaniel Verkamp END("{\"a\":[1,2,3],\"b\":{\"c\":\"d\"},\"e\":true,\"f\":false,\"g\":null}");
864d57bf4ccSDaniel Verkamp }
865d57bf4ccSDaniel Verkamp
8668dd1cd21SBen Walker int
main(int argc,char ** argv)8678dd1cd21SBen Walker main(int argc, char **argv)
868d57bf4ccSDaniel Verkamp {
869d57bf4ccSDaniel Verkamp CU_pSuite suite = NULL;
870d57bf4ccSDaniel Verkamp unsigned int num_failures;
871d57bf4ccSDaniel Verkamp
87278b696bcSVitaliy Mysak CU_initialize_registry();
873d57bf4ccSDaniel Verkamp
874d57bf4ccSDaniel Verkamp suite = CU_add_suite("json", NULL, NULL);
875d57bf4ccSDaniel Verkamp
876dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_literal);
877dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_string_simple);
878dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_string_escapes);
879dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_string_utf16le);
880dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_number_int32);
881dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_number_uint32);
8822d629511SWindYu CU_ADD_TEST(suite, test_write_number_uint128);
8832d629511SWindYu CU_ADD_TEST(suite, test_write_string_number_uint128);
884dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_number_int64);
885dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_number_uint64);
88670f185eaSThanos Makatos CU_ADD_TEST(suite, test_write_number_double);
887*973075d4SKonrad Sztyber CU_ADD_TEST(suite, test_write_uuid);
888dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_array);
889dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_object);
890dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_nesting);
891dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_write_val);
892d57bf4ccSDaniel Verkamp
893d57bf4ccSDaniel Verkamp
894ea941caeSKonrad Sztyber num_failures = spdk_ut_run_tests(argc, argv, NULL);
895d57bf4ccSDaniel Verkamp
896d57bf4ccSDaniel Verkamp CU_cleanup_registry();
897d57bf4ccSDaniel Verkamp
898d57bf4ccSDaniel Verkamp return num_failures;
899d57bf4ccSDaniel Verkamp }
900