xref: /spdk/test/unit/lib/json/json_util.c/json_util_ut.c (revision 34edd9f1bf5fda4c987f4500ddc3c9f50be32e7d)
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_util.c"
11d57bf4ccSDaniel Verkamp 
12439641f7SPawel Wodkowski /* For spdk_json_parse() */
13439641f7SPawel Wodkowski #include "json/json_parse.c"
14439641f7SPawel Wodkowski 
15d57bf4ccSDaniel Verkamp #define NUM_SETUP(x) \
16d57bf4ccSDaniel Verkamp 	snprintf(buf, sizeof(buf), "%s", x); \
17d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_NUMBER; \
18d57bf4ccSDaniel Verkamp 	v.start = buf; \
19d57bf4ccSDaniel Verkamp 	v.len = sizeof(x) - 1
20d57bf4ccSDaniel Verkamp 
216f872f5aSShuhei Matsumoto #define NUM_UINT16_PASS(s, i) \
226f872f5aSShuhei Matsumoto 	NUM_SETUP(s); \
236f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_number_to_uint16(&v, &u16) == 0); \
246f872f5aSShuhei Matsumoto 	CU_ASSERT(u16 == i)
256f872f5aSShuhei Matsumoto 
266f872f5aSShuhei Matsumoto #define NUM_UINT16_FAIL(s) \
276f872f5aSShuhei Matsumoto 	NUM_SETUP(s); \
286f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_number_to_uint16(&v, &u16) != 0)
296f872f5aSShuhei Matsumoto 
30d57bf4ccSDaniel Verkamp #define NUM_INT32_PASS(s, i) \
31d57bf4ccSDaniel Verkamp 	NUM_SETUP(s); \
32d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_number_to_int32(&v, &i32) == 0); \
33d57bf4ccSDaniel Verkamp 	CU_ASSERT(i32 == i)
34d57bf4ccSDaniel Verkamp 
35d57bf4ccSDaniel Verkamp #define NUM_INT32_FAIL(s) \
36d57bf4ccSDaniel Verkamp 	NUM_SETUP(s); \
37d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_number_to_int32(&v, &i32) != 0)
38d57bf4ccSDaniel Verkamp 
39d57bf4ccSDaniel Verkamp #define NUM_UINT64_PASS(s, i) \
40d57bf4ccSDaniel Verkamp 	NUM_SETUP(s); \
41d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_number_to_uint64(&v, &u64) == 0); \
42d57bf4ccSDaniel Verkamp 	CU_ASSERT(u64 == i)
43d57bf4ccSDaniel Verkamp 
44d57bf4ccSDaniel Verkamp #define NUM_UINT64_FAIL(s) \
45d57bf4ccSDaniel Verkamp 	NUM_SETUP(s); \
46d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_number_to_uint64(&v, &u64) != 0)
47d57bf4ccSDaniel Verkamp 
48d57bf4ccSDaniel Verkamp static void
49d57bf4ccSDaniel Verkamp test_strequal(void)
50d57bf4ccSDaniel Verkamp {
51d57bf4ccSDaniel Verkamp 	struct spdk_json_val v;
52d57bf4ccSDaniel Verkamp 
53d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_STRING;
54d57bf4ccSDaniel Verkamp 	v.start = "test";
55d57bf4ccSDaniel Verkamp 	v.len = sizeof("test") - 1;
56d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_strequal(&v, "test") == true);
57d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_strequal(&v, "TEST") == false);
58d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_strequal(&v, "hello") == false);
59d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_strequal(&v, "t") == false);
60d57bf4ccSDaniel Verkamp 
61d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_NAME;
62d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_strequal(&v, "test") == true);
63d57bf4ccSDaniel Verkamp 
64d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_NUMBER;
65d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_strequal(&v, "test") == false);
66d57bf4ccSDaniel Verkamp 
67d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_STRING;
68d57bf4ccSDaniel Verkamp 	v.start = "test\0hello";
69d57bf4ccSDaniel Verkamp 	v.len = sizeof("test\0hello") - 1;
70d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_strequal(&v, "test") == false);
71d57bf4ccSDaniel Verkamp }
72d57bf4ccSDaniel Verkamp 
73d57bf4ccSDaniel Verkamp static void
746f872f5aSShuhei Matsumoto test_num_to_uint16(void)
756f872f5aSShuhei Matsumoto {
766f872f5aSShuhei Matsumoto 	struct spdk_json_val v;
776f872f5aSShuhei Matsumoto 	char buf[100];
786f872f5aSShuhei Matsumoto 	uint16_t u16 = 0;
796f872f5aSShuhei Matsumoto 
806f872f5aSShuhei Matsumoto 	NUM_SETUP("1234");
816f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_number_to_uint16(&v, &u16) == 0);
826f872f5aSShuhei Matsumoto 	CU_ASSERT(u16 == 1234);
836f872f5aSShuhei Matsumoto 
846f872f5aSShuhei Matsumoto 	NUM_UINT16_PASS("0", 0);
856f872f5aSShuhei Matsumoto 	NUM_UINT16_PASS("1234", 1234);
866f872f5aSShuhei Matsumoto 	NUM_UINT16_PASS("1234.00000", 1234);
876f872f5aSShuhei Matsumoto 	NUM_UINT16_PASS("1.2e1", 12);
886f872f5aSShuhei Matsumoto 	NUM_UINT16_PASS("12340e-1", 1234);
896f872f5aSShuhei Matsumoto 
906f872f5aSShuhei Matsumoto 	NUM_UINT16_FAIL("1.2");
916f872f5aSShuhei Matsumoto 	NUM_UINT16_FAIL("-1234");
926f872f5aSShuhei Matsumoto 	NUM_UINT16_FAIL("1.2E0");
936f872f5aSShuhei Matsumoto 	NUM_UINT16_FAIL("1.234e1");
946f872f5aSShuhei Matsumoto 	NUM_UINT16_FAIL("12341e-1");
956f872f5aSShuhei Matsumoto }
966f872f5aSShuhei Matsumoto 
976f872f5aSShuhei Matsumoto static void
98d57bf4ccSDaniel Verkamp test_num_to_int32(void)
99d57bf4ccSDaniel Verkamp {
100d57bf4ccSDaniel Verkamp 	struct spdk_json_val v;
101d57bf4ccSDaniel Verkamp 	char buf[100];
102d57bf4ccSDaniel Verkamp 	int32_t i32 = 0;
103d57bf4ccSDaniel Verkamp 
104d57bf4ccSDaniel Verkamp 	NUM_SETUP("1234");
105d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_number_to_int32(&v, &i32) == 0);
106d57bf4ccSDaniel Verkamp 	CU_ASSERT(i32 == 1234);
107d57bf4ccSDaniel Verkamp 
108d57bf4ccSDaniel Verkamp 
109d57bf4ccSDaniel Verkamp 	NUM_INT32_PASS("0", 0);
110d57bf4ccSDaniel Verkamp 	NUM_INT32_PASS("1234", 1234);
111d57bf4ccSDaniel Verkamp 	NUM_INT32_PASS("-1234", -1234);
112d57bf4ccSDaniel Verkamp 	NUM_INT32_PASS("1234.00000", 1234);
113d57bf4ccSDaniel Verkamp 	NUM_INT32_PASS("1.2e1", 12);
114d57bf4ccSDaniel Verkamp 	NUM_INT32_PASS("12340e-1", 1234);
115d57bf4ccSDaniel Verkamp 	NUM_INT32_PASS("-0", 0);
116d57bf4ccSDaniel Verkamp 
117d57bf4ccSDaniel Verkamp 	NUM_INT32_FAIL("1.2");
118d57bf4ccSDaniel Verkamp 	NUM_INT32_FAIL("1.2E0");
119d57bf4ccSDaniel Verkamp 	NUM_INT32_FAIL("1.234e1");
120d57bf4ccSDaniel Verkamp 	NUM_INT32_FAIL("12341e-1");
121d57bf4ccSDaniel Verkamp }
122d57bf4ccSDaniel Verkamp 
123d57bf4ccSDaniel Verkamp static void
124d57bf4ccSDaniel Verkamp test_num_to_uint64(void)
125d57bf4ccSDaniel Verkamp {
126d57bf4ccSDaniel Verkamp 	struct spdk_json_val v;
127d57bf4ccSDaniel Verkamp 	char buf[100];
128d57bf4ccSDaniel Verkamp 	uint64_t u64 = 0;
129d57bf4ccSDaniel Verkamp 
130d57bf4ccSDaniel Verkamp 	NUM_SETUP("1234");
131d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_number_to_uint64(&v, &u64) == 0);
132d57bf4ccSDaniel Verkamp 	CU_ASSERT(u64 == 1234);
133d57bf4ccSDaniel Verkamp 
134d57bf4ccSDaniel Verkamp 
135d57bf4ccSDaniel Verkamp 	NUM_UINT64_PASS("0", 0);
136d57bf4ccSDaniel Verkamp 	NUM_UINT64_PASS("1234", 1234);
137d57bf4ccSDaniel Verkamp 	NUM_UINT64_PASS("1234.00000", 1234);
138d57bf4ccSDaniel Verkamp 	NUM_UINT64_PASS("1.2e1", 12);
139d57bf4ccSDaniel Verkamp 	NUM_UINT64_PASS("12340e-1", 1234);
140d57bf4ccSDaniel Verkamp 	NUM_UINT64_PASS("123456780e-1", 12345678);
141d57bf4ccSDaniel Verkamp 
142d57bf4ccSDaniel Verkamp 	NUM_UINT64_FAIL("1.2");
143d57bf4ccSDaniel Verkamp 	NUM_UINT64_FAIL("-1234");
144d57bf4ccSDaniel Verkamp 	NUM_UINT64_FAIL("1.2E0");
145d57bf4ccSDaniel Verkamp 	NUM_UINT64_FAIL("1.234e1");
146d57bf4ccSDaniel Verkamp 	NUM_UINT64_FAIL("12341e-1");
147d57bf4ccSDaniel Verkamp 	NUM_UINT64_FAIL("123456781e-1");
148d57bf4ccSDaniel Verkamp }
149d57bf4ccSDaniel Verkamp 
150d57bf4ccSDaniel Verkamp static void
151d57bf4ccSDaniel Verkamp test_decode_object(void)
152d57bf4ccSDaniel Verkamp {
153d57bf4ccSDaniel Verkamp 	struct my_object {
154d57bf4ccSDaniel Verkamp 		char *my_name;
155d57bf4ccSDaniel Verkamp 		uint32_t my_int;
156d57bf4ccSDaniel Verkamp 		bool my_bool;
157d57bf4ccSDaniel Verkamp 	};
158d57bf4ccSDaniel Verkamp 	struct spdk_json_val object[] = {
159d57bf4ccSDaniel Verkamp 		{"", 6, SPDK_JSON_VAL_OBJECT_BEGIN},
160d57bf4ccSDaniel Verkamp 		{"first", 5, SPDK_JSON_VAL_NAME},
161d57bf4ccSDaniel Verkamp 		{"HELLO", 5, SPDK_JSON_VAL_STRING},
162d57bf4ccSDaniel Verkamp 		{"second", 6, SPDK_JSON_VAL_NAME},
163d57bf4ccSDaniel Verkamp 		{"234", 3, SPDK_JSON_VAL_NUMBER},
164d57bf4ccSDaniel Verkamp 		{"third", 5, SPDK_JSON_VAL_NAME},
165d57bf4ccSDaniel Verkamp 		{"", 1, SPDK_JSON_VAL_TRUE},
166d57bf4ccSDaniel Verkamp 		{"", 0, SPDK_JSON_VAL_OBJECT_END},
167d57bf4ccSDaniel Verkamp 	};
168d57bf4ccSDaniel Verkamp 
169d57bf4ccSDaniel Verkamp 	struct spdk_json_object_decoder decoders[] = {
170d57bf4ccSDaniel Verkamp 		{"first", offsetof(struct my_object, my_name), spdk_json_decode_string, false},
171d57bf4ccSDaniel Verkamp 		{"second", offsetof(struct my_object, my_int), spdk_json_decode_uint32, false},
172d57bf4ccSDaniel Verkamp 		{"third", offsetof(struct my_object, my_bool), spdk_json_decode_bool, false},
173d57bf4ccSDaniel Verkamp 		{"fourth", offsetof(struct my_object, my_bool), spdk_json_decode_bool, true},
174d57bf4ccSDaniel Verkamp 	};
1756d4147c2SDaniel Verkamp 	struct my_object output = {
1766d4147c2SDaniel Verkamp 		.my_name = NULL,
1776d4147c2SDaniel Verkamp 		.my_int = 0,
1786d4147c2SDaniel Verkamp 		.my_bool = false,
1796d4147c2SDaniel Verkamp 	};
180d57bf4ccSDaniel Verkamp 	uint32_t answer = 234;
181d57bf4ccSDaniel Verkamp 	char *answer_str = "HELLO";
182d57bf4ccSDaniel Verkamp 	bool answer_bool = true;
183d57bf4ccSDaniel Verkamp 
184d57bf4ccSDaniel Verkamp 	/* Passing Test: object containing simple types */
185d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_object(object, decoders, 4, &output) == 0);
1862c28fa54SDaniel Verkamp 	SPDK_CU_ASSERT_FATAL(output.my_name != NULL);
187d57bf4ccSDaniel Verkamp 	CU_ASSERT(memcmp(output.my_name, answer_str, 6) == 0);
188d57bf4ccSDaniel Verkamp 	CU_ASSERT(output.my_int == answer);
189d57bf4ccSDaniel Verkamp 	CU_ASSERT(output.my_bool == answer_bool);
190d57bf4ccSDaniel Verkamp 
191d57bf4ccSDaniel Verkamp 	/* Failing Test: member with no matching decoder */
192d57bf4ccSDaniel Verkamp 	/* i.e. I remove the matching decoder from the boolean argument */
193d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_object(object, decoders, 2, &output) != 0);
194d57bf4ccSDaniel Verkamp 
195d57bf4ccSDaniel Verkamp 	/* Failing Test: non-optional decoder with no corresponding member */
196d57bf4ccSDaniel Verkamp 
197d57bf4ccSDaniel Verkamp 	decoders[3].optional = false;
198d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_object(object, decoders, 4, &output) != 0);
199d57bf4ccSDaniel Verkamp 
200d57bf4ccSDaniel Verkamp 	/* return to base state */
201d57bf4ccSDaniel Verkamp 	decoders[3].optional = true;
202d57bf4ccSDaniel Verkamp 
203d57bf4ccSDaniel Verkamp 	/* Failing Test: duplicated names for json values */
204d57bf4ccSDaniel Verkamp 	object[3].start = "first";
205d57bf4ccSDaniel Verkamp 	object[3].len = 5;
206d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_object(object, decoders, 3, &output) != 0);
207d57bf4ccSDaniel Verkamp 
208d57bf4ccSDaniel Verkamp 	/* return to base state */
209d57bf4ccSDaniel Verkamp 	object[3].start = "second";
210d57bf4ccSDaniel Verkamp 	object[3].len = 6;
211d57bf4ccSDaniel Verkamp 
212d57bf4ccSDaniel Verkamp 	/* Failing Test: invalid value for decoder */
213d57bf4ccSDaniel Verkamp 	object[2].start = "HELO";
214d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_object(object, decoders, 3, &output) != 0);
215d57bf4ccSDaniel Verkamp 
216d57bf4ccSDaniel Verkamp 	/* return to base state */
217d57bf4ccSDaniel Verkamp 	object[2].start = "HELLO";
218d57bf4ccSDaniel Verkamp 
219d57bf4ccSDaniel Verkamp 	/* Failing Test: not an object */
220d57bf4ccSDaniel Verkamp 	object[0].type = SPDK_JSON_VAL_ARRAY_BEGIN;
221d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_object(object, decoders, 3, &output) != 0);
222d57bf4ccSDaniel Verkamp 
223d57bf4ccSDaniel Verkamp 	free(output.my_name);
224d57bf4ccSDaniel Verkamp }
225d57bf4ccSDaniel Verkamp 
226d57bf4ccSDaniel Verkamp static void
227c77c6559SDarek Stojaczyk test_free_object(void)
228c77c6559SDarek Stojaczyk {
229c77c6559SDarek Stojaczyk 	struct my_object {
230c77c6559SDarek Stojaczyk 		char *my_name;
231c77c6559SDarek Stojaczyk 		uint32_t my_int;
232c77c6559SDarek Stojaczyk 		char *my_other_name;
233c77c6559SDarek Stojaczyk 		char *empty_string;
234c77c6559SDarek Stojaczyk 	};
235c77c6559SDarek Stojaczyk 	struct spdk_json_object_decoder decoders[] = {
236c77c6559SDarek Stojaczyk 		{"first", offsetof(struct my_object, my_name), spdk_json_decode_string, false},
237c77c6559SDarek Stojaczyk 		{"second", offsetof(struct my_object, my_int), spdk_json_decode_uint32, false},
238c77c6559SDarek Stojaczyk 		{"third", offsetof(struct my_object, my_other_name), spdk_json_decode_string, true},
239c77c6559SDarek Stojaczyk 		{"fourth", offsetof(struct my_object, empty_string), spdk_json_decode_string, false},
240c77c6559SDarek Stojaczyk 	};
241c77c6559SDarek Stojaczyk 	struct my_object output = {
242c77c6559SDarek Stojaczyk 		.my_name = strdup("hello"),
243c77c6559SDarek Stojaczyk 		.my_int = 3,
244c77c6559SDarek Stojaczyk 		.my_other_name = strdup("world"),
245c77c6559SDarek Stojaczyk 		.empty_string = NULL
246c77c6559SDarek Stojaczyk 	};
247c77c6559SDarek Stojaczyk 
248c77c6559SDarek Stojaczyk 	SPDK_CU_ASSERT_FATAL(output.my_name != NULL);
249c77c6559SDarek Stojaczyk 	SPDK_CU_ASSERT_FATAL(output.my_other_name != NULL);
250c77c6559SDarek Stojaczyk 
251c77c6559SDarek Stojaczyk 	spdk_json_free_object(decoders, 4, &output);
252c77c6559SDarek Stojaczyk 	CU_ASSERT(output.my_name == NULL);
253c77c6559SDarek Stojaczyk 	CU_ASSERT(output.my_other_name == NULL);
254c77c6559SDarek Stojaczyk 	CU_ASSERT(output.empty_string == NULL);
255c77c6559SDarek Stojaczyk }
256c77c6559SDarek Stojaczyk 
257c77c6559SDarek Stojaczyk static void
258d57bf4ccSDaniel Verkamp test_decode_array(void)
259d57bf4ccSDaniel Verkamp {
260d57bf4ccSDaniel Verkamp 	struct spdk_json_val values[4];
261d57bf4ccSDaniel Verkamp 	uint32_t my_int[2] = {0, 0};
262d57bf4ccSDaniel Verkamp 	char *my_string[2] = {NULL, NULL};
263d57bf4ccSDaniel Verkamp 	size_t out_size;
264d57bf4ccSDaniel Verkamp 
265d57bf4ccSDaniel Verkamp 	/* passing integer test */
266d57bf4ccSDaniel Verkamp 	values[0].type = SPDK_JSON_VAL_ARRAY_BEGIN;
267d57bf4ccSDaniel Verkamp 	values[0].len = 2;
268d57bf4ccSDaniel Verkamp 	values[1].type = SPDK_JSON_VAL_NUMBER;
269d57bf4ccSDaniel Verkamp 	values[1].len = 4;
270d57bf4ccSDaniel Verkamp 	values[1].start = "1234";
271d57bf4ccSDaniel Verkamp 	values[2].type = SPDK_JSON_VAL_NUMBER;
272d57bf4ccSDaniel Verkamp 	values[2].len = 4;
273d57bf4ccSDaniel Verkamp 	values[2].start = "5678";
274d57bf4ccSDaniel Verkamp 	values[3].type = SPDK_JSON_VAL_ARRAY_END;
275d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_array(values, spdk_json_decode_uint32, my_int, 2, &out_size,
276d57bf4ccSDaniel Verkamp 					 sizeof(uint32_t)) == 0);
277d57bf4ccSDaniel Verkamp 	CU_ASSERT(my_int[0] == 1234);
278d57bf4ccSDaniel Verkamp 	CU_ASSERT(my_int[1] == 5678);
279d57bf4ccSDaniel Verkamp 	CU_ASSERT(out_size == 2);
280d57bf4ccSDaniel Verkamp 
281d57bf4ccSDaniel Verkamp 	/* array length exceeds max */
282d57bf4ccSDaniel Verkamp 	values[0].len = 3;
283d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_array(values, spdk_json_decode_uint32, my_int, 2, &out_size,
284d57bf4ccSDaniel Verkamp 					 sizeof(uint32_t)) != 0);
285d57bf4ccSDaniel Verkamp 
286d57bf4ccSDaniel Verkamp 	/* mixed types */
287d57bf4ccSDaniel Verkamp 	values[0].len = 2;
288d57bf4ccSDaniel Verkamp 	values[2].type = SPDK_JSON_VAL_STRING;
289d57bf4ccSDaniel Verkamp 	values[2].len = 5;
290d57bf4ccSDaniel Verkamp 	values[2].start = "HELLO";
291d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_array(values, spdk_json_decode_uint32, my_int, 2, &out_size,
292d57bf4ccSDaniel Verkamp 					 sizeof(uint32_t)) != 0);
293d57bf4ccSDaniel Verkamp 
294d57bf4ccSDaniel Verkamp 	/* no array start */
295d57bf4ccSDaniel Verkamp 	values[0].type = SPDK_JSON_VAL_NUMBER;
296d57bf4ccSDaniel Verkamp 	values[2].type = SPDK_JSON_VAL_NUMBER;
297d57bf4ccSDaniel Verkamp 	values[2].len = 4;
298d57bf4ccSDaniel Verkamp 	values[2].start = "5678";
299d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_array(values, spdk_json_decode_uint32, my_int, 2, &out_size,
300d57bf4ccSDaniel Verkamp 					 sizeof(uint32_t)) != 0);
301d57bf4ccSDaniel Verkamp 
302d57bf4ccSDaniel Verkamp 	/* mismatched array type and parser */
303d57bf4ccSDaniel Verkamp 	values[0].type = SPDK_JSON_VAL_ARRAY_BEGIN;
304d57bf4ccSDaniel Verkamp 	values[1].type = SPDK_JSON_VAL_STRING;
305d57bf4ccSDaniel Verkamp 	values[1].len = 5;
306d57bf4ccSDaniel Verkamp 	values[1].start = "HELLO";
307d57bf4ccSDaniel Verkamp 	values[2].type = SPDK_JSON_VAL_STRING;
308d57bf4ccSDaniel Verkamp 	values[2].len = 5;
309d57bf4ccSDaniel Verkamp 	values[2].start = "WORLD";
310d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_array(values, spdk_json_decode_uint32, my_int, 2, &out_size,
311d57bf4ccSDaniel Verkamp 					 sizeof(uint32_t)) != 0);
312d57bf4ccSDaniel Verkamp 
313d57bf4ccSDaniel Verkamp 	/* passing String example */
314d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_array(values, spdk_json_decode_string, my_string, 2, &out_size,
315d57bf4ccSDaniel Verkamp 					 sizeof(char *)) == 0);
316d57bf4ccSDaniel Verkamp 	SPDK_CU_ASSERT_FATAL(my_string[0] != NULL);
317d57bf4ccSDaniel Verkamp 	SPDK_CU_ASSERT_FATAL(my_string[1] != NULL);
318d57bf4ccSDaniel Verkamp 	CU_ASSERT(memcmp(my_string[0], "HELLO", 6) == 0);
319d57bf4ccSDaniel Verkamp 	CU_ASSERT(memcmp(my_string[1], "WORLD", 6) == 0);
320d57bf4ccSDaniel Verkamp 	CU_ASSERT(out_size == 2);
321d57bf4ccSDaniel Verkamp 
322d57bf4ccSDaniel Verkamp 	free(my_string[0]);
323d57bf4ccSDaniel Verkamp 	free(my_string[1]);
324d57bf4ccSDaniel Verkamp }
325d57bf4ccSDaniel Verkamp 
326d57bf4ccSDaniel Verkamp static void
327d57bf4ccSDaniel Verkamp test_decode_bool(void)
328d57bf4ccSDaniel Verkamp {
329d57bf4ccSDaniel Verkamp 	struct spdk_json_val v;
330d57bf4ccSDaniel Verkamp 	bool b;
331d57bf4ccSDaniel Verkamp 
332d57bf4ccSDaniel Verkamp 	/* valid bool (true) */
333d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_TRUE;
334d57bf4ccSDaniel Verkamp 	b = false;
335d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_bool(&v, &b) == 0);
336d57bf4ccSDaniel Verkamp 	CU_ASSERT(b == true);
337d57bf4ccSDaniel Verkamp 
338d57bf4ccSDaniel Verkamp 	/* valid bool (false) */
339d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_FALSE;
340d57bf4ccSDaniel Verkamp 	b = true;
341d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_bool(&v, &b) == 0);
342d57bf4ccSDaniel Verkamp 	CU_ASSERT(b == false);
343d57bf4ccSDaniel Verkamp 
344d57bf4ccSDaniel Verkamp 	/* incorrect type */
345d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_NULL;
346d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_bool(&v, &b) != 0);
347d57bf4ccSDaniel Verkamp }
348d57bf4ccSDaniel Verkamp 
349d57bf4ccSDaniel Verkamp static void
350d57bf4ccSDaniel Verkamp test_decode_int32(void)
351d57bf4ccSDaniel Verkamp {
352d57bf4ccSDaniel Verkamp 	struct spdk_json_val v;
353d57bf4ccSDaniel Verkamp 	int32_t i;
354d57bf4ccSDaniel Verkamp 
355d57bf4ccSDaniel Verkamp 	/* correct type and valid value */
356d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_NUMBER;
357d57bf4ccSDaniel Verkamp 	v.start = "33";
358d57bf4ccSDaniel Verkamp 	v.len = 2;
359d57bf4ccSDaniel Verkamp 	i = 0;
360d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) == 0);
36199b25f1cSTomasz Zawadzki 	CU_ASSERT(i == 33);
362d57bf4ccSDaniel Verkamp 
363d57bf4ccSDaniel Verkamp 	/* correct type and invalid value (float) */
364d57bf4ccSDaniel Verkamp 	v.start = "32.45";
365d57bf4ccSDaniel Verkamp 	v.len = 5;
366d57bf4ccSDaniel Verkamp 	i = 0;
367d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) != 0);
368d57bf4ccSDaniel Verkamp 
369d57bf4ccSDaniel Verkamp 	/* incorrect type */
370d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_STRING;
371d57bf4ccSDaniel Verkamp 	v.start = "String";
372d57bf4ccSDaniel Verkamp 	v.len = 6;
373d57bf4ccSDaniel Verkamp 	i = 0;
374d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) != 0);
375d57bf4ccSDaniel Verkamp 
376d57bf4ccSDaniel Verkamp 	/* incorrect type */
377d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_TRUE;
378d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) != 0);
379d57bf4ccSDaniel Verkamp 
380d57bf4ccSDaniel Verkamp 	/* edge case (integer max) */
381d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_NUMBER;
382d57bf4ccSDaniel Verkamp 	v.start = "2147483647";
383d57bf4ccSDaniel Verkamp 	v.len = 10;
384d57bf4ccSDaniel Verkamp 	i = 0;
385d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) == 0);
386d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == 2147483647);
387d57bf4ccSDaniel Verkamp 
388d57bf4ccSDaniel Verkamp 	/* invalid value (overflow) */
389d57bf4ccSDaniel Verkamp 	v.start = "2147483648";
390d57bf4ccSDaniel Verkamp 	i = 0;
391d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) != 0);
392d57bf4ccSDaniel Verkamp 
393d57bf4ccSDaniel Verkamp 	/* edge case (integer min) */
394d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_NUMBER;
395d57bf4ccSDaniel Verkamp 	v.start = "-2147483648";
396d57bf4ccSDaniel Verkamp 	v.len = 11;
397d57bf4ccSDaniel Verkamp 	i = 0;
398d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) == 0);
399d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == -2147483648);
400d57bf4ccSDaniel Verkamp 
401d57bf4ccSDaniel Verkamp 	/* invalid value (overflow) */
402d57bf4ccSDaniel Verkamp 	v.start = "-2147483649";
403d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) != 0);
404d57bf4ccSDaniel Verkamp 
405d57bf4ccSDaniel Verkamp 	/* valid exponent */
406d57bf4ccSDaniel Verkamp 	v.start = "4e3";
407d57bf4ccSDaniel Verkamp 	v.len = 3;
408d57bf4ccSDaniel Verkamp 	i = 0;
409d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) == 0);
410d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == 4000);
411d57bf4ccSDaniel Verkamp 
412d57bf4ccSDaniel Verkamp 	/* invalid negative exponent */
413d57bf4ccSDaniel Verkamp 	v.start = "-400e-4";
414d57bf4ccSDaniel Verkamp 	v.len = 7;
415d57bf4ccSDaniel Verkamp 	i = 0;
416d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) != 0);
417d57bf4ccSDaniel Verkamp 
418d57bf4ccSDaniel Verkamp 	/* invalid negative exponent */
419d57bf4ccSDaniel Verkamp 	v.start = "400e-4";
420d57bf4ccSDaniel Verkamp 	v.len = 6;
421d57bf4ccSDaniel Verkamp 	i = 0;
422d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) != 0);
423d57bf4ccSDaniel Verkamp 
424d57bf4ccSDaniel Verkamp 	/* valid negative exponent */
425d57bf4ccSDaniel Verkamp 	v.start = "-400e-2";
426d57bf4ccSDaniel Verkamp 	v.len = 7;
427d57bf4ccSDaniel Verkamp 	i = 0;
428d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) == 0);
42999b25f1cSTomasz Zawadzki 	CU_ASSERT(i == -4);
430d57bf4ccSDaniel Verkamp 
431d57bf4ccSDaniel Verkamp 	/* invalid exponent (overflow) */
432d57bf4ccSDaniel Verkamp 	v.start = "-2e32";
433d57bf4ccSDaniel Verkamp 	v.len = 5;
434d57bf4ccSDaniel Verkamp 	i = 0;
435d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) != 0);
436d57bf4ccSDaniel Verkamp 
437d57bf4ccSDaniel Verkamp 	/* valid exponent with decimal */
438d57bf4ccSDaniel Verkamp 	v.start = "2.13e2";
439d57bf4ccSDaniel Verkamp 	v.len = 6;
440d57bf4ccSDaniel Verkamp 	i = 0;
441d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) == 0);
44299b25f1cSTomasz Zawadzki 	CU_ASSERT(i == 213);
443d57bf4ccSDaniel Verkamp 
444d57bf4ccSDaniel Verkamp 	/* invalid exponent with decimal */
445d57bf4ccSDaniel Verkamp 	v.start = "2.134e2";
446d57bf4ccSDaniel Verkamp 	v.len = 7;
447d57bf4ccSDaniel Verkamp 	i = 0;
448d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_int32(&v, &i) != 0);
449d57bf4ccSDaniel Verkamp }
450d57bf4ccSDaniel Verkamp 
451d57bf4ccSDaniel Verkamp static void
4526f872f5aSShuhei Matsumoto test_decode_uint16(void)
4536f872f5aSShuhei Matsumoto {
4546f872f5aSShuhei Matsumoto 	struct spdk_json_val v;
4556f872f5aSShuhei Matsumoto 	uint32_t i;
4566f872f5aSShuhei Matsumoto 
4576f872f5aSShuhei Matsumoto 	/* incorrect type */
4586f872f5aSShuhei Matsumoto 	v.type = SPDK_JSON_VAL_STRING;
459*34edd9f1SKamil Godzwon 	v.start = "String";
4606f872f5aSShuhei Matsumoto 	v.len = 5;
4616f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) != 0);
4626f872f5aSShuhei Matsumoto 
4636f872f5aSShuhei Matsumoto 	/* invalid value (float) */
4646f872f5aSShuhei Matsumoto 	v.type = SPDK_JSON_VAL_NUMBER;
4656f872f5aSShuhei Matsumoto 	v.start = "123.4";
4666f872f5aSShuhei Matsumoto 	v.len = 5;
4676f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) != 0);
4686f872f5aSShuhei Matsumoto 
4696f872f5aSShuhei Matsumoto 	/* edge case (0) */
4706f872f5aSShuhei Matsumoto 	v.start = "0";
4716f872f5aSShuhei Matsumoto 	v.len = 1;
4726f872f5aSShuhei Matsumoto 	i = 456;
4736f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) == 0);
4746f872f5aSShuhei Matsumoto 	CU_ASSERT(i == 0);
4756f872f5aSShuhei Matsumoto 
4766f872f5aSShuhei Matsumoto 	/* invalid value (negative) */
4776f872f5aSShuhei Matsumoto 	v.start = "-1";
4786f872f5aSShuhei Matsumoto 	v.len = 2;
4796f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) != 0);
4806f872f5aSShuhei Matsumoto 
4816f872f5aSShuhei Matsumoto 	/* edge case (maximum) */
4826f872f5aSShuhei Matsumoto 	v.start = "65535";
4836f872f5aSShuhei Matsumoto 	v.len = 5;
4846f872f5aSShuhei Matsumoto 	i = 0;
4856f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) == 0);
4866f872f5aSShuhei Matsumoto 	CU_ASSERT(i == 65535);
4876f872f5aSShuhei Matsumoto 
4886f872f5aSShuhei Matsumoto 	/* invalid value (overflow) */
4896f872f5aSShuhei Matsumoto 	v.start = "65536";
4906f872f5aSShuhei Matsumoto 	v.len = 5;
4916f872f5aSShuhei Matsumoto 	i = 0;
4926f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) != 0);
4936f872f5aSShuhei Matsumoto 
4946f872f5aSShuhei Matsumoto 	/* valid exponent */
4956f872f5aSShuhei Matsumoto 	v.start = "66E2";
4966f872f5aSShuhei Matsumoto 	v.len = 4;
4976f872f5aSShuhei Matsumoto 	i = 0;
4986f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) == 0);
4996f872f5aSShuhei Matsumoto 	CU_ASSERT(i == 6600);
5006f872f5aSShuhei Matsumoto 
5016f872f5aSShuhei Matsumoto 	/* invalid exponent (overflow) */
5026f872f5aSShuhei Matsumoto 	v.start = "66E3";
5036f872f5aSShuhei Matsumoto 	v.len = 4;
5046f872f5aSShuhei Matsumoto 	i = 0;
5056f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) != 0);
5066f872f5aSShuhei Matsumoto 
5076f872f5aSShuhei Matsumoto 	/* invalid exponent (decimal) */
5086f872f5aSShuhei Matsumoto 	v.start = "65.535E2";
5096f872f5aSShuhei Matsumoto 	v.len = 7;
5106f872f5aSShuhei Matsumoto 	i = 0;
5116f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) != 0);
5126f872f5aSShuhei Matsumoto 
5136f872f5aSShuhei Matsumoto 	/* valid exponent with decimal */
5146f872f5aSShuhei Matsumoto 	v.start = "65.53E2";
5156f872f5aSShuhei Matsumoto 	v.len = 7;
5166f872f5aSShuhei Matsumoto 	i = 0;
5176f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) == 0);
5186f872f5aSShuhei Matsumoto 	CU_ASSERT(i == 6553);
5196f872f5aSShuhei Matsumoto 
5206f872f5aSShuhei Matsumoto 	/* invalid negative exponent */
5216f872f5aSShuhei Matsumoto 	v.start = "40e-2";
5226f872f5aSShuhei Matsumoto 	v.len = 5;
5236f872f5aSShuhei Matsumoto 	i = 0;
5246f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) != 0);
5256f872f5aSShuhei Matsumoto 
5266f872f5aSShuhei Matsumoto 	/* invalid negative exponent */
5276f872f5aSShuhei Matsumoto 	v.start = "-40e-1";
5286f872f5aSShuhei Matsumoto 	v.len = 6;
5296f872f5aSShuhei Matsumoto 	i = 0;
5306f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) != 0);
5316f872f5aSShuhei Matsumoto 
5326f872f5aSShuhei Matsumoto 	/* valid negative exponent */
5336f872f5aSShuhei Matsumoto 	v.start = "40e-1";
5346f872f5aSShuhei Matsumoto 	v.len = 5;
5356f872f5aSShuhei Matsumoto 	i = 0;
5366f872f5aSShuhei Matsumoto 	CU_ASSERT(spdk_json_decode_uint16(&v, &i) == 0);
5376f872f5aSShuhei Matsumoto 	CU_ASSERT(i == 4);
5386f872f5aSShuhei Matsumoto }
5396f872f5aSShuhei Matsumoto 
5406f872f5aSShuhei Matsumoto static void
541d57bf4ccSDaniel Verkamp test_decode_uint32(void)
542d57bf4ccSDaniel Verkamp {
543d57bf4ccSDaniel Verkamp 	struct spdk_json_val v;
544d57bf4ccSDaniel Verkamp 	uint32_t i;
545d57bf4ccSDaniel Verkamp 
546d57bf4ccSDaniel Verkamp 	/* incorrect type */
547d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_STRING;
548d57bf4ccSDaniel Verkamp 	v.start = "String";
549d57bf4ccSDaniel Verkamp 	v.len = 6;
550d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) != 0);
551d57bf4ccSDaniel Verkamp 
552d57bf4ccSDaniel Verkamp 	/* invalid value (float) */
553d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_NUMBER;
554d57bf4ccSDaniel Verkamp 	v.start = "123.45";
555d57bf4ccSDaniel Verkamp 	v.len = 6;
556d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) != 0);
557d57bf4ccSDaniel Verkamp 
558d57bf4ccSDaniel Verkamp 	/* edge case (0) */
559d57bf4ccSDaniel Verkamp 	v.start = "0";
560d57bf4ccSDaniel Verkamp 	v.len = 1;
561d57bf4ccSDaniel Verkamp 	i = 456;
562d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) == 0);
563d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == 0);
564d57bf4ccSDaniel Verkamp 
565d57bf4ccSDaniel Verkamp 	/* invalid value (negative) */
566d57bf4ccSDaniel Verkamp 	v.start = "-1";
567d57bf4ccSDaniel Verkamp 	v.len = 2;
568d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) != 0);
569d57bf4ccSDaniel Verkamp 
570d57bf4ccSDaniel Verkamp 	/* edge case (maximum) */
571d57bf4ccSDaniel Verkamp 	v.start = "4294967295";
572d57bf4ccSDaniel Verkamp 	v.len = 10;
573d57bf4ccSDaniel Verkamp 	i = 0;
574d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) == 0);
575d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == 4294967295);
576d57bf4ccSDaniel Verkamp 
577d57bf4ccSDaniel Verkamp 	/* invalid value (overflow) */
578d57bf4ccSDaniel Verkamp 	v.start = "4294967296";
579d57bf4ccSDaniel Verkamp 	v.len = 10;
580d57bf4ccSDaniel Verkamp 	i = 0;
581d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) != 0);
582d57bf4ccSDaniel Verkamp 
583d57bf4ccSDaniel Verkamp 	/* valid exponent */
584d57bf4ccSDaniel Verkamp 	v.start = "42E2";
585d57bf4ccSDaniel Verkamp 	v.len = 4;
586d57bf4ccSDaniel Verkamp 	i = 0;
587d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) == 0);
588d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == 4200);
589d57bf4ccSDaniel Verkamp 
590d57bf4ccSDaniel Verkamp 	/* invalid exponent (overflow) */
591d57bf4ccSDaniel Verkamp 	v.start = "42e32";
592d57bf4ccSDaniel Verkamp 	v.len = 5;
593d57bf4ccSDaniel Verkamp 	i = 0;
594d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) != 0);
595d57bf4ccSDaniel Verkamp 
596d57bf4ccSDaniel Verkamp 	/* invalid exponent (decimal) */
597d57bf4ccSDaniel Verkamp 	v.start = "42.323E2";
598d57bf4ccSDaniel Verkamp 	v.len = 8;
599d57bf4ccSDaniel Verkamp 	i = 0;
600d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) != 0);
601d57bf4ccSDaniel Verkamp 
602d57bf4ccSDaniel Verkamp 	/* valid exponent with decimal */
603d57bf4ccSDaniel Verkamp 	v.start = "42.32E2";
604d57bf4ccSDaniel Verkamp 	v.len = 7;
605d57bf4ccSDaniel Verkamp 	i = 0;
606d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) == 0);
607d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == 4232);
608d57bf4ccSDaniel Verkamp 
609d57bf4ccSDaniel Verkamp 	/* invalid negative exponent */
610d57bf4ccSDaniel Verkamp 	v.start = "400e-4";
611d57bf4ccSDaniel Verkamp 	v.len = 6;
612d57bf4ccSDaniel Verkamp 	i = 0;
613d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) != 0);
614d57bf4ccSDaniel Verkamp 
615d57bf4ccSDaniel Verkamp 	/* invalid negative exponent */
616d57bf4ccSDaniel Verkamp 	v.start = "-400e-2";
617d57bf4ccSDaniel Verkamp 	v.len = 7;
618d57bf4ccSDaniel Verkamp 	i = 0;
619d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) != 0);
620d57bf4ccSDaniel Verkamp 
621d57bf4ccSDaniel Verkamp 	/* valid negative exponent */
622d57bf4ccSDaniel Verkamp 	v.start = "400e-2";
623d57bf4ccSDaniel Verkamp 	v.len = 6;
624d57bf4ccSDaniel Verkamp 	i = 0;
625d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) == 0);
626d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == 4);
627d57bf4ccSDaniel Verkamp 
628d57bf4ccSDaniel Verkamp 	/* valid negative exponent */
629d57bf4ccSDaniel Verkamp 	v.start = "10e-1";
630d57bf4ccSDaniel Verkamp 	v.len = 5;
631d57bf4ccSDaniel Verkamp 	i = 0;
632d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint32(&v, &i) == 0);
63399b25f1cSTomasz Zawadzki 	CU_ASSERT(i == 1);
634d57bf4ccSDaniel Verkamp }
635d57bf4ccSDaniel Verkamp 
636d57bf4ccSDaniel Verkamp static void
637d57bf4ccSDaniel Verkamp test_decode_uint64(void)
638d57bf4ccSDaniel Verkamp {
639d57bf4ccSDaniel Verkamp 	struct spdk_json_val v;
640d57bf4ccSDaniel Verkamp 	uint64_t i;
641d57bf4ccSDaniel Verkamp 
642d57bf4ccSDaniel Verkamp 	/* incorrect type */
643d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_STRING;
644d57bf4ccSDaniel Verkamp 	v.start = "String";
645d57bf4ccSDaniel Verkamp 	v.len = 6;
646d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) != 0);
647d57bf4ccSDaniel Verkamp 
648d57bf4ccSDaniel Verkamp 	/* invalid value (float) */
649d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_NUMBER;
650d57bf4ccSDaniel Verkamp 	v.start = "123.45";
651d57bf4ccSDaniel Verkamp 	v.len = 6;
652d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) != 0);
653d57bf4ccSDaniel Verkamp 
654d57bf4ccSDaniel Verkamp 	/* edge case (0) */
655d57bf4ccSDaniel Verkamp 	v.start = "0";
656d57bf4ccSDaniel Verkamp 	v.len = 1;
657d57bf4ccSDaniel Verkamp 	i = 456;
658d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) == 0);
659d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == 0);
660d57bf4ccSDaniel Verkamp 
661d57bf4ccSDaniel Verkamp 	/* invalid value (negative) */
662d57bf4ccSDaniel Verkamp 	v.start = "-1";
663d57bf4ccSDaniel Verkamp 	v.len = 2;
664d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) != 0);
665d57bf4ccSDaniel Verkamp 
666d57bf4ccSDaniel Verkamp 	/* edge case (maximum) */
667d57bf4ccSDaniel Verkamp 	v.start = "18446744073709551615";
668d57bf4ccSDaniel Verkamp 	v.len = 20;
669d57bf4ccSDaniel Verkamp 	i = 0;
670d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) == 0);
671d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == 18446744073709551615U);
672d57bf4ccSDaniel Verkamp 
673d57bf4ccSDaniel Verkamp 	/* invalid value (overflow) */
674d57bf4ccSDaniel Verkamp 	v.start = "18446744073709551616";
675d57bf4ccSDaniel Verkamp 	v.len = 20;
676d57bf4ccSDaniel Verkamp 	i = 0;
677d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) != 0);
678d57bf4ccSDaniel Verkamp 
679d57bf4ccSDaniel Verkamp 	/* valid exponent */
680d57bf4ccSDaniel Verkamp 	v.start = "42E2";
681d57bf4ccSDaniel Verkamp 	v.len = 4;
682d57bf4ccSDaniel Verkamp 	i = 0;
683d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) == 0);
684d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == 4200);
685d57bf4ccSDaniel Verkamp 
686d57bf4ccSDaniel Verkamp 	/* invalid exponent (overflow) */
687d57bf4ccSDaniel Verkamp 	v.start = "42e64";
688d57bf4ccSDaniel Verkamp 	v.len = 5;
689d57bf4ccSDaniel Verkamp 	i = 0;
690d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) != 0);
691d57bf4ccSDaniel Verkamp 
692d57bf4ccSDaniel Verkamp 	/* invalid exponent (decimal) */
693d57bf4ccSDaniel Verkamp 	v.start = "42.323E2";
694d57bf4ccSDaniel Verkamp 	v.len = 8;
695d57bf4ccSDaniel Verkamp 	i = 0;
696d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) != 0);
697d57bf4ccSDaniel Verkamp 
698d57bf4ccSDaniel Verkamp 	/* valid exponent with decimal */
699d57bf4ccSDaniel Verkamp 	v.start = "42.32E2";
700d57bf4ccSDaniel Verkamp 	v.len = 7;
701d57bf4ccSDaniel Verkamp 	i = 0;
702d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) == 0);
703d57bf4ccSDaniel Verkamp 	CU_ASSERT(i == 4232);
704d57bf4ccSDaniel Verkamp 
705d57bf4ccSDaniel Verkamp 	/* invalid negative exponent */
706d57bf4ccSDaniel Verkamp 	v.start = "400e-4";
707d57bf4ccSDaniel Verkamp 	v.len = 6;
708d57bf4ccSDaniel Verkamp 	i = 0;
709d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) != 0);
710d57bf4ccSDaniel Verkamp 
711d57bf4ccSDaniel Verkamp 	/* invalid negative exponent */
712d57bf4ccSDaniel Verkamp 	v.start = "-400e-2";
713d57bf4ccSDaniel Verkamp 	v.len = 7;
714d57bf4ccSDaniel Verkamp 	i = 0;
715d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) != 0);
716d57bf4ccSDaniel Verkamp 
717d57bf4ccSDaniel Verkamp 	/* valid negative exponent */
718d57bf4ccSDaniel Verkamp 	v.start = "400e-2";
719d57bf4ccSDaniel Verkamp 	v.len = 6;
720d57bf4ccSDaniel Verkamp 	i = 0;
721d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_uint64(&v, &i) == 0);
72299b25f1cSTomasz Zawadzki 	CU_ASSERT(i == 4);
723d57bf4ccSDaniel Verkamp }
724d57bf4ccSDaniel Verkamp 
725d57bf4ccSDaniel Verkamp static void
726d57bf4ccSDaniel Verkamp test_decode_string(void)
727d57bf4ccSDaniel Verkamp {
728d57bf4ccSDaniel Verkamp 	struct spdk_json_val v;
729d57bf4ccSDaniel Verkamp 	char *value = NULL;
730d57bf4ccSDaniel Verkamp 
731d57bf4ccSDaniel Verkamp 	/* Passing Test: Standard */
732d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_STRING;
733d57bf4ccSDaniel Verkamp 	v.start = "HELLO";
734d57bf4ccSDaniel Verkamp 	v.len = 5;
735d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_string(&v, &value) == 0);
736d57bf4ccSDaniel Verkamp 	SPDK_CU_ASSERT_FATAL(value != NULL);
737d57bf4ccSDaniel Verkamp 	CU_ASSERT(memcmp(value, v.start, 6) == 0);
738d57bf4ccSDaniel Verkamp 
739d57bf4ccSDaniel Verkamp 	/* Edge Test: Empty String */
740d57bf4ccSDaniel Verkamp 	v.start = "";
741d57bf4ccSDaniel Verkamp 	v.len = 0;
742d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_string(&v, &value) == 0);
743d57bf4ccSDaniel Verkamp 	SPDK_CU_ASSERT_FATAL(value != NULL);
744d57bf4ccSDaniel Verkamp 	CU_ASSERT(memcmp(value, v.start, 1) == 0);
745d57bf4ccSDaniel Verkamp 
746d57bf4ccSDaniel Verkamp 	/*
747d57bf4ccSDaniel Verkamp 	 * Failing Test: Null Terminator In String
748d57bf4ccSDaniel Verkamp 	 * It is valid for a json string to contain \u0000 and the parser will accept it.
749d57bf4ccSDaniel Verkamp 	 * However, a null terminated C string cannot contain '\0' and should be rejected
750d57bf4ccSDaniel Verkamp 	 * if that character is found before the end of the string.
751d57bf4ccSDaniel Verkamp 	 */
752d57bf4ccSDaniel Verkamp 	v.start = "HELO";
753d57bf4ccSDaniel Verkamp 	v.len = 5;
754d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_string(&v, &value) != 0);
755d57bf4ccSDaniel Verkamp 
756d57bf4ccSDaniel Verkamp 	/* Failing Test: Wrong Type */
757d57bf4ccSDaniel Verkamp 	v.start = "45673";
758d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_NUMBER;
759d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_string(&v, &value) != 0);
760d57bf4ccSDaniel Verkamp 
761d57bf4ccSDaniel Verkamp 	/* Passing Test: Special Characters */
762d57bf4ccSDaniel Verkamp 	v.type = SPDK_JSON_VAL_STRING;
763d57bf4ccSDaniel Verkamp 	v.start = "HE\bLL\tO\\WORLD";
764d57bf4ccSDaniel Verkamp 	v.len = 13;
765d57bf4ccSDaniel Verkamp 	CU_ASSERT(spdk_json_decode_string(&v, &value) == 0);
766d57bf4ccSDaniel Verkamp 	SPDK_CU_ASSERT_FATAL(value != NULL);
767d57bf4ccSDaniel Verkamp 	CU_ASSERT(memcmp(value, v.start, 14) == 0);
768d57bf4ccSDaniel Verkamp 
769d57bf4ccSDaniel Verkamp 	free(value);
770d57bf4ccSDaniel Verkamp }
771d57bf4ccSDaniel Verkamp 
772973075d4SKonrad Sztyber static void
773973075d4SKonrad Sztyber test_decode_uuid(void)
774973075d4SKonrad Sztyber {
775973075d4SKonrad Sztyber 	struct spdk_json_val v;
776973075d4SKonrad Sztyber 	struct spdk_uuid expected, uuid = {};
777973075d4SKonrad Sztyber 	const char *uuidstr = "e524acae-8c26-43e4-882a-461b8690583b";
778973075d4SKonrad Sztyber 	const char *invalid = "e524acae-8c26";
779973075d4SKonrad Sztyber 	int rc;
780973075d4SKonrad Sztyber 
781973075d4SKonrad Sztyber 	rc = spdk_uuid_parse(&expected, uuidstr);
782973075d4SKonrad Sztyber 	CU_ASSERT_EQUAL(rc, 0);
783973075d4SKonrad Sztyber 
784973075d4SKonrad Sztyber 	/* Check a valid UUID */
785973075d4SKonrad Sztyber 	v.type = SPDK_JSON_VAL_STRING;
786973075d4SKonrad Sztyber 	v.start = (void *)uuidstr;
787973075d4SKonrad Sztyber 	v.len = strlen(uuidstr);
788973075d4SKonrad Sztyber 	rc = spdk_json_decode_uuid(&v, &uuid);
789973075d4SKonrad Sztyber 	CU_ASSERT_EQUAL(rc, 0);
790973075d4SKonrad Sztyber 	CU_ASSERT_EQUAL(spdk_uuid_compare(&uuid, &expected), 0);
791973075d4SKonrad Sztyber 
792973075d4SKonrad Sztyber 	/* Check empty string as UUID */
793973075d4SKonrad Sztyber 	v.type = SPDK_JSON_VAL_STRING;
794973075d4SKonrad Sztyber 	v.start = "";
795973075d4SKonrad Sztyber 	v.len = 0;
796973075d4SKonrad Sztyber 	rc = spdk_json_decode_uuid(&v, &uuid);
797973075d4SKonrad Sztyber 	CU_ASSERT_EQUAL(rc, -1);
798973075d4SKonrad Sztyber 
799973075d4SKonrad Sztyber 	/* Check non-empty string that's not a UUID */
800973075d4SKonrad Sztyber 	v.type = SPDK_JSON_VAL_STRING;
801973075d4SKonrad Sztyber 	v.start = (void *)invalid;
802973075d4SKonrad Sztyber 	v.len = strlen(invalid);
803973075d4SKonrad Sztyber 	rc = spdk_json_decode_uuid(&v, &uuid);
804973075d4SKonrad Sztyber 	CU_ASSERT_EQUAL(rc, -1);
805973075d4SKonrad Sztyber 
806973075d4SKonrad Sztyber 	/* Check decoding UUID on a non-string value */
807973075d4SKonrad Sztyber 	v.type = SPDK_JSON_VAL_TRUE;
808973075d4SKonrad Sztyber 	v.start = NULL;
809973075d4SKonrad Sztyber 	v.len = 0;
810973075d4SKonrad Sztyber 	rc = spdk_json_decode_uuid(&v, &uuid);
811973075d4SKonrad Sztyber 	CU_ASSERT_EQUAL(rc, -1);
812973075d4SKonrad Sztyber }
813973075d4SKonrad Sztyber 
814439641f7SPawel Wodkowski char ut_json_text[] =
815439641f7SPawel Wodkowski 	"{"
816439641f7SPawel Wodkowski 	"	\"string\": \"Some string data\","
817439641f7SPawel Wodkowski 	"	\"object\": { "
818c9c7c281SJosh Soref 	"		\"another_string\": \"Yet another string data\","
819439641f7SPawel Wodkowski 	"		\"array name with space\": [1, [], {} ]"
820439641f7SPawel Wodkowski 	"	},"
821439641f7SPawel Wodkowski 	"	\"array\": [ \"Text\", 2, {} ]"
822439641f7SPawel Wodkowski 	"}"
823439641f7SPawel Wodkowski 	;
824439641f7SPawel Wodkowski 
825439641f7SPawel Wodkowski static void
826439641f7SPawel Wodkowski test_find(void)
827439641f7SPawel Wodkowski {
828439641f7SPawel Wodkowski 	struct spdk_json_val *values, *key, *val, *key2, *val2;
829439641f7SPawel Wodkowski 	ssize_t values_cnt;
830439641f7SPawel Wodkowski 	ssize_t rc;
831439641f7SPawel Wodkowski 
832439641f7SPawel Wodkowski 	values_cnt = spdk_json_parse(ut_json_text, strlen(ut_json_text), NULL, 0, NULL, 0);
833439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(values_cnt > 0);
834439641f7SPawel Wodkowski 
835439641f7SPawel Wodkowski 	values = calloc(values_cnt, sizeof(struct spdk_json_val));
836439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(values != NULL);
837439641f7SPawel Wodkowski 
838439641f7SPawel Wodkowski 	rc = spdk_json_parse(ut_json_text, strlen(ut_json_text), values, values_cnt, NULL, 0);
839439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(values_cnt == rc);
840439641f7SPawel Wodkowski 
841439641f7SPawel Wodkowski 	key = val = NULL;
842439641f7SPawel Wodkowski 	rc = spdk_json_find(values, "string", &key, &val, SPDK_JSON_VAL_STRING);
843439641f7SPawel Wodkowski 	CU_ASSERT(rc == 0);
844439641f7SPawel Wodkowski 
845439641f7SPawel Wodkowski 	CU_ASSERT(key != NULL && spdk_json_strequal(key, "string") == true);
84699b25f1cSTomasz Zawadzki 	CU_ASSERT(val != NULL && spdk_json_strequal(val, "Some string data") == true);
847439641f7SPawel Wodkowski 
848439641f7SPawel Wodkowski 	key = val = NULL;
849439641f7SPawel Wodkowski 	rc = spdk_json_find(values, "object", &key, &val, SPDK_JSON_VAL_OBJECT_BEGIN);
850439641f7SPawel Wodkowski 	CU_ASSERT(rc == 0);
851439641f7SPawel Wodkowski 
852439641f7SPawel Wodkowski 	CU_ASSERT(key != NULL && spdk_json_strequal(key, "object") == true);
853439641f7SPawel Wodkowski 
854439641f7SPawel Wodkowski 	/* Find key in "object" by passing SPDK_JSON_VAL_ANY to match any type */
855439641f7SPawel Wodkowski 	key2 = val2 = NULL;
856439641f7SPawel Wodkowski 	rc = spdk_json_find(val, "array name with space", &key2, &val2, SPDK_JSON_VAL_ANY);
857439641f7SPawel Wodkowski 	CU_ASSERT(rc == 0);
858439641f7SPawel Wodkowski 	CU_ASSERT(key2 != NULL && spdk_json_strequal(key2, "array name with space") == true);
859439641f7SPawel Wodkowski 	CU_ASSERT(val2 != NULL && val2->type == SPDK_JSON_VAL_ARRAY_BEGIN);
860439641f7SPawel Wodkowski 
861439641f7SPawel Wodkowski 	/* Find the "array" key in "object" by passing SPDK_JSON_VAL_ARRAY_BEGIN to match only array */
862439641f7SPawel Wodkowski 	key2 = val2 = NULL;
863439641f7SPawel Wodkowski 	rc = spdk_json_find(val, "array name with space", &key2, &val2, SPDK_JSON_VAL_ARRAY_BEGIN);
864439641f7SPawel Wodkowski 	CU_ASSERT(rc == 0);
865439641f7SPawel Wodkowski 	CU_ASSERT(key2 != NULL && spdk_json_strequal(key2, "array name with space") == true);
866439641f7SPawel Wodkowski 	CU_ASSERT(val2 != NULL && val2->type == SPDK_JSON_VAL_ARRAY_BEGIN);
867439641f7SPawel Wodkowski 
868439641f7SPawel Wodkowski 	/* Negative test - key doesn't exist */
869439641f7SPawel Wodkowski 	key2 = val2 = NULL;
870439641f7SPawel Wodkowski 	rc = spdk_json_find(val, "this_key_does_not_exist", &key2, &val2, SPDK_JSON_VAL_ANY);
871439641f7SPawel Wodkowski 	CU_ASSERT(rc == -ENOENT);
872439641f7SPawel Wodkowski 
873439641f7SPawel Wodkowski 	/* Negative test - key type doesn't match */
874439641f7SPawel Wodkowski 	key2 = val2 = NULL;
875439641f7SPawel Wodkowski 	rc = spdk_json_find(val, "another_string", &key2, &val2, SPDK_JSON_VAL_ARRAY_BEGIN);
876439641f7SPawel Wodkowski 	CU_ASSERT(rc == -EDOM);
877439641f7SPawel Wodkowski 
878439641f7SPawel Wodkowski 	free(values);
879439641f7SPawel Wodkowski }
880439641f7SPawel Wodkowski 
881439641f7SPawel Wodkowski static void
882004ab98dSJim Harris test_find_array(void)
883004ab98dSJim Harris {
884004ab98dSJim Harris 	char array_json_text[] = "[ \"Text\", 2, {} ]";
885004ab98dSJim Harris 	struct spdk_json_val *values, *key;
886004ab98dSJim Harris 	ssize_t values_cnt;
887004ab98dSJim Harris 	ssize_t rc;
888004ab98dSJim Harris 
889004ab98dSJim Harris 	values_cnt = spdk_json_parse(array_json_text, strlen(array_json_text), NULL, 0, NULL, 0);
890004ab98dSJim Harris 	SPDK_CU_ASSERT_FATAL(values_cnt > 0);
891004ab98dSJim Harris 
892004ab98dSJim Harris 	values = calloc(values_cnt, sizeof(struct spdk_json_val));
893004ab98dSJim Harris 	SPDK_CU_ASSERT_FATAL(values != NULL);
894004ab98dSJim Harris 
895004ab98dSJim Harris 	rc = spdk_json_parse(array_json_text, strlen(array_json_text), values, values_cnt, NULL, 0);
896004ab98dSJim Harris 	SPDK_CU_ASSERT_FATAL(values_cnt == rc);
897004ab98dSJim Harris 
898004ab98dSJim Harris 	/* spdk_json_find cannot be used on arrays.  The element "Text" does exist in the array,
899004ab98dSJim Harris 	 * but spdk_json_find can only be used for finding keys in an object.  So this
900004ab98dSJim Harris 	 * test should fail.
901004ab98dSJim Harris 	 */
902004ab98dSJim Harris 	key = NULL;
903004ab98dSJim Harris 	rc = spdk_json_find(values, "Text", &key, NULL, SPDK_JSON_VAL_STRING);
904004ab98dSJim Harris 	CU_ASSERT(rc == -EPROTOTYPE);
905004ab98dSJim Harris 
906004ab98dSJim Harris 	free(values);
907004ab98dSJim Harris }
908004ab98dSJim Harris 
909004ab98dSJim Harris static void
910439641f7SPawel Wodkowski test_iterating(void)
911439641f7SPawel Wodkowski {
912439641f7SPawel Wodkowski 	struct spdk_json_val *values;
913439641f7SPawel Wodkowski 	struct spdk_json_val *string_key;
914439641f7SPawel Wodkowski 	struct spdk_json_val *object_key, *object_val;
915439641f7SPawel Wodkowski 	struct spdk_json_val *array_key, *array_val;
916439641f7SPawel Wodkowski 	struct spdk_json_val *another_string_key;
917439641f7SPawel Wodkowski 	struct spdk_json_val *array_name_with_space_key, *array_name_with_space_val;
918439641f7SPawel Wodkowski 	struct spdk_json_val *it;
919439641f7SPawel Wodkowski 	ssize_t values_cnt;
920439641f7SPawel Wodkowski 	ssize_t rc;
921439641f7SPawel Wodkowski 
922439641f7SPawel Wodkowski 	values_cnt = spdk_json_parse(ut_json_text, strlen(ut_json_text), NULL, 0, NULL, 0);
923439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(values_cnt > 0);
924439641f7SPawel Wodkowski 
925439641f7SPawel Wodkowski 	values = calloc(values_cnt, sizeof(struct spdk_json_val));
926439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(values != NULL);
927439641f7SPawel Wodkowski 
928439641f7SPawel Wodkowski 	rc = spdk_json_parse(ut_json_text, strlen(ut_json_text), values, values_cnt, NULL, 0);
929439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(values_cnt == rc);
930439641f7SPawel Wodkowski 
931439641f7SPawel Wodkowski 	/* Iterate over object keys. JSON spec doesn't guarantee order of keys in object but
932439641f7SPawel Wodkowski 	 * SPDK implementation implicitly does.
933439641f7SPawel Wodkowski 	 */
934439641f7SPawel Wodkowski 	string_key = spdk_json_object_first(values);
935439641f7SPawel Wodkowski 	CU_ASSERT(spdk_json_strequal(string_key, "string") == true);
936439641f7SPawel Wodkowski 
937439641f7SPawel Wodkowski 	object_key = spdk_json_next(string_key);
9380be5557cSSeth Howell 	object_val = json_value(object_key);
939439641f7SPawel Wodkowski 	CU_ASSERT(spdk_json_strequal(object_key, "object") == true);
940439641f7SPawel Wodkowski 
941439641f7SPawel Wodkowski 	array_key = spdk_json_next(object_key);
9420be5557cSSeth Howell 	array_val = json_value(array_key);
943439641f7SPawel Wodkowski 	CU_ASSERT(spdk_json_strequal(array_key, "array") == true);
944439641f7SPawel Wodkowski 
945439641f7SPawel Wodkowski 	/* NULL '}' */
946439641f7SPawel Wodkowski 	CU_ASSERT(spdk_json_next(array_key) == NULL);
947439641f7SPawel Wodkowski 
948439641f7SPawel Wodkowski 	/* Iterate over subobjects */
949439641f7SPawel Wodkowski 	another_string_key = spdk_json_object_first(object_val);
950439641f7SPawel Wodkowski 	CU_ASSERT(spdk_json_strequal(another_string_key, "another_string") == true);
951439641f7SPawel Wodkowski 
952439641f7SPawel Wodkowski 	array_name_with_space_key = spdk_json_next(another_string_key);
9530be5557cSSeth Howell 	array_name_with_space_val = json_value(array_name_with_space_key);
954439641f7SPawel Wodkowski 	CU_ASSERT(spdk_json_strequal(array_name_with_space_key, "array name with space") == true);
955439641f7SPawel Wodkowski 
956439641f7SPawel Wodkowski 	CU_ASSERT(spdk_json_next(array_name_with_space_key) == NULL);
957439641f7SPawel Wodkowski 
958439641f7SPawel Wodkowski 	/* Iterate over array in subobject */
959439641f7SPawel Wodkowski 	it = spdk_json_array_first(array_name_with_space_val);
960439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(it != NULL);
961439641f7SPawel Wodkowski 	CU_ASSERT(it->type == SPDK_JSON_VAL_NUMBER);
962439641f7SPawel Wodkowski 
963439641f7SPawel Wodkowski 	it = spdk_json_next(it);
964439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(it != NULL);
965439641f7SPawel Wodkowski 	CU_ASSERT(it->type == SPDK_JSON_VAL_ARRAY_BEGIN);
966439641f7SPawel Wodkowski 
967439641f7SPawel Wodkowski 	it = spdk_json_next(it);
968439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(it != NULL);
969439641f7SPawel Wodkowski 	CU_ASSERT(it->type == SPDK_JSON_VAL_OBJECT_BEGIN);
970439641f7SPawel Wodkowski 
971439641f7SPawel Wodkowski 	it = spdk_json_next(it);
972439641f7SPawel Wodkowski 	CU_ASSERT(it == NULL);
973439641f7SPawel Wodkowski 
974439641f7SPawel Wodkowski 	/* Iterate over array in root object */
975439641f7SPawel Wodkowski 	it = spdk_json_array_first(array_val);
976439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(it != NULL);
977439641f7SPawel Wodkowski 	CU_ASSERT(it->type == SPDK_JSON_VAL_STRING);
978439641f7SPawel Wodkowski 
979439641f7SPawel Wodkowski 	it = spdk_json_next(it);
980439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(it != NULL);
981439641f7SPawel Wodkowski 	CU_ASSERT(it->type == SPDK_JSON_VAL_NUMBER);
982439641f7SPawel Wodkowski 
983439641f7SPawel Wodkowski 	it = spdk_json_next(it);
984439641f7SPawel Wodkowski 	SPDK_CU_ASSERT_FATAL(it != NULL);
985439641f7SPawel Wodkowski 	CU_ASSERT(it->type == SPDK_JSON_VAL_OBJECT_BEGIN);
986439641f7SPawel Wodkowski 
987439641f7SPawel Wodkowski 	/* Array end */
988439641f7SPawel Wodkowski 	it = spdk_json_next(it);
989439641f7SPawel Wodkowski 	CU_ASSERT(it == NULL);
990439641f7SPawel Wodkowski 
991439641f7SPawel Wodkowski 	free(values);
992439641f7SPawel Wodkowski }
993439641f7SPawel Wodkowski 
9948dd1cd21SBen Walker int
9958dd1cd21SBen Walker main(int argc, char **argv)
996d57bf4ccSDaniel Verkamp {
997d57bf4ccSDaniel Verkamp 	CU_pSuite	suite = NULL;
998d57bf4ccSDaniel Verkamp 	unsigned int	num_failures;
999d57bf4ccSDaniel Verkamp 
100078b696bcSVitaliy Mysak 	CU_initialize_registry();
1001d57bf4ccSDaniel Verkamp 
1002d57bf4ccSDaniel Verkamp 	suite = CU_add_suite("json", NULL, NULL);
1003d57bf4ccSDaniel Verkamp 
1004dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_strequal);
1005dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_num_to_uint16);
1006dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_num_to_int32);
1007dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_num_to_uint64);
1008dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_decode_object);
1009dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_decode_array);
1010dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_decode_bool);
1011dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_decode_uint16);
1012dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_decode_int32);
1013dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_decode_uint32);
1014dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_decode_uint64);
1015dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_decode_string);
1016973075d4SKonrad Sztyber 	CU_ADD_TEST(suite, test_decode_uuid);
1017dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_find);
1018004ab98dSJim Harris 	CU_ADD_TEST(suite, test_find_array);
1019dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_iterating);
1020c77c6559SDarek Stojaczyk 	CU_ADD_TEST(suite, test_free_object);
1021d57bf4ccSDaniel Verkamp 
1022d57bf4ccSDaniel Verkamp 
1023ea941caeSKonrad Sztyber 	num_failures = spdk_ut_run_tests(argc, argv, NULL);
1024d57bf4ccSDaniel Verkamp 
1025d57bf4ccSDaniel Verkamp 	CU_cleanup_registry();
1026d57bf4ccSDaniel Verkamp 
1027d57bf4ccSDaniel Verkamp 	return num_failures;
1028d57bf4ccSDaniel Verkamp }
1029