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