139ee7a7aSBaptiste Daroussin /* 239ee7a7aSBaptiste Daroussin * Copyright (c) 2015, Vsevolod Stakhov 339ee7a7aSBaptiste Daroussin * All rights reserved. 439ee7a7aSBaptiste Daroussin * 539ee7a7aSBaptiste Daroussin * Redistribution and use in source and binary forms, with or without 639ee7a7aSBaptiste Daroussin * modification, are permitted provided that the following conditions are met: 739ee7a7aSBaptiste Daroussin * * Redistributions of source code must retain the above copyright 839ee7a7aSBaptiste Daroussin * notice, this list of conditions and the following disclaimer. 939ee7a7aSBaptiste Daroussin * * Redistributions in binary form must reproduce the above copyright 1039ee7a7aSBaptiste Daroussin * notice, this list of conditions and the following disclaimer in the 1139ee7a7aSBaptiste Daroussin * documentation and/or other materials provided with the distribution. 1239ee7a7aSBaptiste Daroussin * 1339ee7a7aSBaptiste Daroussin * THIS SOFTWARE IS PROVIDED BY AUTHOR ''AS IS'' AND ANY 1439ee7a7aSBaptiste Daroussin * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 1539ee7a7aSBaptiste Daroussin * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 1639ee7a7aSBaptiste Daroussin * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY 1739ee7a7aSBaptiste Daroussin * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 1839ee7a7aSBaptiste Daroussin * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 1939ee7a7aSBaptiste Daroussin * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 2039ee7a7aSBaptiste Daroussin * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2139ee7a7aSBaptiste Daroussin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 2239ee7a7aSBaptiste Daroussin * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2339ee7a7aSBaptiste Daroussin */ 2439ee7a7aSBaptiste Daroussin 2539ee7a7aSBaptiste Daroussin #include "ucl.h" 2639ee7a7aSBaptiste Daroussin #include "ucl_internal.h" 2739ee7a7aSBaptiste Daroussin #include <ctype.h> 2839ee7a7aSBaptiste Daroussin 29*d9f0ce31SBaptiste Daroussin static const int niter = 20; 30*d9f0ce31SBaptiste Daroussin static const int ntests = 10; 31*d9f0ce31SBaptiste Daroussin static const int nelt = 20; 3239ee7a7aSBaptiste Daroussin 3339ee7a7aSBaptiste Daroussin static int recursion = 0; 3439ee7a7aSBaptiste Daroussin 3539ee7a7aSBaptiste Daroussin typedef ucl_object_t* (*ucl_msgpack_test)(void); 3639ee7a7aSBaptiste Daroussin 3739ee7a7aSBaptiste Daroussin static ucl_object_t* ucl_test_integer (void); 3839ee7a7aSBaptiste Daroussin static ucl_object_t* ucl_test_string (void); 3939ee7a7aSBaptiste Daroussin static ucl_object_t* ucl_test_boolean (void); 4039ee7a7aSBaptiste Daroussin static ucl_object_t* ucl_test_map (void); 4139ee7a7aSBaptiste Daroussin static ucl_object_t* ucl_test_array (void); 42*d9f0ce31SBaptiste Daroussin static ucl_object_t* ucl_test_large_map (void); 43*d9f0ce31SBaptiste Daroussin static ucl_object_t* ucl_test_large_array (void); 44*d9f0ce31SBaptiste Daroussin static ucl_object_t* ucl_test_large_string (void); 45*d9f0ce31SBaptiste Daroussin static ucl_object_t* ucl_test_null (void); 4639ee7a7aSBaptiste Daroussin 4739ee7a7aSBaptiste Daroussin ucl_msgpack_test tests[] = { 4839ee7a7aSBaptiste Daroussin ucl_test_integer, 4939ee7a7aSBaptiste Daroussin ucl_test_string, 5039ee7a7aSBaptiste Daroussin ucl_test_boolean, 5139ee7a7aSBaptiste Daroussin ucl_test_map, 5239ee7a7aSBaptiste Daroussin ucl_test_array, 53*d9f0ce31SBaptiste Daroussin ucl_test_null 5439ee7a7aSBaptiste Daroussin }; 5539ee7a7aSBaptiste Daroussin 5639ee7a7aSBaptiste Daroussin #define NTESTS (sizeof(tests) / sizeof(tests[0])) 5739ee7a7aSBaptiste Daroussin 5839ee7a7aSBaptiste Daroussin typedef struct 5939ee7a7aSBaptiste Daroussin { 6039ee7a7aSBaptiste Daroussin uint64_t state; 6139ee7a7aSBaptiste Daroussin uint64_t inc; 6239ee7a7aSBaptiste Daroussin } pcg32_random_t; 6339ee7a7aSBaptiste Daroussin 6439ee7a7aSBaptiste Daroussin pcg32_random_t rng; 6539ee7a7aSBaptiste Daroussin 6639ee7a7aSBaptiste Daroussin /* 6739ee7a7aSBaptiste Daroussin * From http://www.pcg-random.org/ 6839ee7a7aSBaptiste Daroussin */ 6939ee7a7aSBaptiste Daroussin static uint32_t 7039ee7a7aSBaptiste Daroussin pcg32_random (void) 7139ee7a7aSBaptiste Daroussin { 7239ee7a7aSBaptiste Daroussin uint64_t oldstate = rng.state; 7339ee7a7aSBaptiste Daroussin 7439ee7a7aSBaptiste Daroussin rng.state = oldstate * 6364136223846793005ULL + (rng.inc | 1); 7539ee7a7aSBaptiste Daroussin uint32_t xorshifted = ((oldstate >> 18u) ^ oldstate) >> 27u; 7639ee7a7aSBaptiste Daroussin uint32_t rot = oldstate >> 59u; 7739ee7a7aSBaptiste Daroussin return (xorshifted >> rot) | (xorshifted << ((-rot) & 31)); 7839ee7a7aSBaptiste Daroussin } 7939ee7a7aSBaptiste Daroussin 8039ee7a7aSBaptiste Daroussin static const char * 8139ee7a7aSBaptiste Daroussin random_key (size_t *lenptr) 8239ee7a7aSBaptiste Daroussin { 8339ee7a7aSBaptiste Daroussin static char keybuf[512]; 8439ee7a7aSBaptiste Daroussin int keylen, i; 8539ee7a7aSBaptiste Daroussin char c; 8639ee7a7aSBaptiste Daroussin 8739ee7a7aSBaptiste Daroussin keylen = pcg32_random () % (sizeof (keybuf) - 1) + 1; 8839ee7a7aSBaptiste Daroussin 8939ee7a7aSBaptiste Daroussin for (i = 0; i < keylen; i ++) { 9039ee7a7aSBaptiste Daroussin do { 9139ee7a7aSBaptiste Daroussin c = pcg32_random () & 0xFF; 9239ee7a7aSBaptiste Daroussin } while (!isgraph (c)); 9339ee7a7aSBaptiste Daroussin 9439ee7a7aSBaptiste Daroussin keybuf[i] = c; 9539ee7a7aSBaptiste Daroussin } 9639ee7a7aSBaptiste Daroussin 9739ee7a7aSBaptiste Daroussin *lenptr = keylen; 9839ee7a7aSBaptiste Daroussin return keybuf; 9939ee7a7aSBaptiste Daroussin } 10039ee7a7aSBaptiste Daroussin 10139ee7a7aSBaptiste Daroussin int 10239ee7a7aSBaptiste Daroussin main (int argc, char **argv) 10339ee7a7aSBaptiste Daroussin { 10439ee7a7aSBaptiste Daroussin int fd, i, j; 10539ee7a7aSBaptiste Daroussin uint32_t sel; 10639ee7a7aSBaptiste Daroussin ucl_object_t *obj, *elt; 10739ee7a7aSBaptiste Daroussin struct ucl_parser *parser; 10839ee7a7aSBaptiste Daroussin size_t klen, elen, elen2; 10939ee7a7aSBaptiste Daroussin const char *key; 11039ee7a7aSBaptiste Daroussin unsigned char *emitted, *emitted2; 11139ee7a7aSBaptiste Daroussin FILE *out; 11239ee7a7aSBaptiste Daroussin const char *fname_out = NULL; 11339ee7a7aSBaptiste Daroussin 11439ee7a7aSBaptiste Daroussin switch (argc) { 11539ee7a7aSBaptiste Daroussin case 2: 11639ee7a7aSBaptiste Daroussin fname_out = argv[1]; 11739ee7a7aSBaptiste Daroussin break; 11839ee7a7aSBaptiste Daroussin } 11939ee7a7aSBaptiste Daroussin 12039ee7a7aSBaptiste Daroussin /* Seed prng */ 12139ee7a7aSBaptiste Daroussin fd = open ("/dev/urandom", O_RDONLY); 12239ee7a7aSBaptiste Daroussin assert (fd != -1); 12339ee7a7aSBaptiste Daroussin assert (read (fd, &rng, sizeof (rng)) == sizeof (rng)); 12439ee7a7aSBaptiste Daroussin close (fd); 12539ee7a7aSBaptiste Daroussin 12639ee7a7aSBaptiste Daroussin for (i = 0; i < niter; i ++) { 12739ee7a7aSBaptiste Daroussin if (fname_out != NULL) { 12839ee7a7aSBaptiste Daroussin out = fopen (fname_out, "w"); 12939ee7a7aSBaptiste Daroussin if (out == NULL) { 13039ee7a7aSBaptiste Daroussin exit (-errno); 13139ee7a7aSBaptiste Daroussin } 13239ee7a7aSBaptiste Daroussin } 13339ee7a7aSBaptiste Daroussin else { 13439ee7a7aSBaptiste Daroussin out = NULL; 13539ee7a7aSBaptiste Daroussin } 13639ee7a7aSBaptiste Daroussin 13739ee7a7aSBaptiste Daroussin /* Generate phase */ 13839ee7a7aSBaptiste Daroussin obj = ucl_object_typed_new (UCL_OBJECT); 13939ee7a7aSBaptiste Daroussin 14039ee7a7aSBaptiste Daroussin for (j = 0; j < ntests; j ++) { 14139ee7a7aSBaptiste Daroussin sel = pcg32_random () % NTESTS; 14239ee7a7aSBaptiste Daroussin 14339ee7a7aSBaptiste Daroussin key = random_key (&klen); 14439ee7a7aSBaptiste Daroussin recursion = 0; 14539ee7a7aSBaptiste Daroussin elt = tests[sel](); 14639ee7a7aSBaptiste Daroussin assert (elt != NULL); 14739ee7a7aSBaptiste Daroussin assert (klen != 0); 14839ee7a7aSBaptiste Daroussin 14939ee7a7aSBaptiste Daroussin ucl_object_insert_key (obj, elt, key, klen, true); 15039ee7a7aSBaptiste Daroussin } 15139ee7a7aSBaptiste Daroussin 152*d9f0ce31SBaptiste Daroussin key = random_key (&klen); 153*d9f0ce31SBaptiste Daroussin elt = ucl_test_large_array (); 154*d9f0ce31SBaptiste Daroussin ucl_object_insert_key (obj, elt, key, klen, true); 155*d9f0ce31SBaptiste Daroussin 156*d9f0ce31SBaptiste Daroussin key = random_key (&klen); 157*d9f0ce31SBaptiste Daroussin elt = ucl_test_large_map (); 158*d9f0ce31SBaptiste Daroussin ucl_object_insert_key (obj, elt, key, klen, true); 159*d9f0ce31SBaptiste Daroussin 160*d9f0ce31SBaptiste Daroussin key = random_key (&klen); 161*d9f0ce31SBaptiste Daroussin elt = ucl_test_large_string (); 162*d9f0ce31SBaptiste Daroussin ucl_object_insert_key (obj, elt, key, klen, true); 163*d9f0ce31SBaptiste Daroussin 16439ee7a7aSBaptiste Daroussin emitted = ucl_object_emit_len (obj, UCL_EMIT_MSGPACK, &elen); 16539ee7a7aSBaptiste Daroussin 16639ee7a7aSBaptiste Daroussin assert (emitted != NULL); 16739ee7a7aSBaptiste Daroussin 16839ee7a7aSBaptiste Daroussin if (out) { 16939ee7a7aSBaptiste Daroussin fprintf (out, "%*.s\n", (int)elen, emitted); 17039ee7a7aSBaptiste Daroussin 17139ee7a7aSBaptiste Daroussin fclose (out); 17239ee7a7aSBaptiste Daroussin } 17339ee7a7aSBaptiste Daroussin ucl_object_unref (obj); 17439ee7a7aSBaptiste Daroussin 17539ee7a7aSBaptiste Daroussin parser = ucl_parser_new (0); 17639ee7a7aSBaptiste Daroussin 17739ee7a7aSBaptiste Daroussin if (!ucl_parser_add_chunk_full (parser, emitted, elen, 0, 17839ee7a7aSBaptiste Daroussin UCL_DUPLICATE_APPEND, UCL_PARSE_MSGPACK)) { 17939ee7a7aSBaptiste Daroussin fprintf (stderr, "error parsing input: %s", 18039ee7a7aSBaptiste Daroussin ucl_parser_get_error (parser)); 18139ee7a7aSBaptiste Daroussin assert (0); 18239ee7a7aSBaptiste Daroussin } 18339ee7a7aSBaptiste Daroussin 18439ee7a7aSBaptiste Daroussin obj = ucl_parser_get_object (parser); 18539ee7a7aSBaptiste Daroussin assert (obj != NULL); 18639ee7a7aSBaptiste Daroussin 18739ee7a7aSBaptiste Daroussin emitted2 = ucl_object_emit_len (obj, UCL_EMIT_MSGPACK, &elen2); 18839ee7a7aSBaptiste Daroussin 18939ee7a7aSBaptiste Daroussin assert (emitted2 != NULL); 19039ee7a7aSBaptiste Daroussin assert (elen2 == elen); 19139ee7a7aSBaptiste Daroussin assert (memcmp (emitted, emitted2, elen) == 0); 19239ee7a7aSBaptiste Daroussin 19339ee7a7aSBaptiste Daroussin ucl_parser_free (parser); 19439ee7a7aSBaptiste Daroussin ucl_object_unref (obj); 19539ee7a7aSBaptiste Daroussin free (emitted); 19639ee7a7aSBaptiste Daroussin free (emitted2); 19739ee7a7aSBaptiste Daroussin } 19839ee7a7aSBaptiste Daroussin 19939ee7a7aSBaptiste Daroussin return 0; 20039ee7a7aSBaptiste Daroussin } 20139ee7a7aSBaptiste Daroussin 20239ee7a7aSBaptiste Daroussin 20339ee7a7aSBaptiste Daroussin static ucl_object_t* 20439ee7a7aSBaptiste Daroussin ucl_test_integer (void) 20539ee7a7aSBaptiste Daroussin { 20639ee7a7aSBaptiste Daroussin ucl_object_t *res; 20739ee7a7aSBaptiste Daroussin int count, i; 20839ee7a7aSBaptiste Daroussin uint64_t cur; 209*d9f0ce31SBaptiste Daroussin double curf; 21039ee7a7aSBaptiste Daroussin 21139ee7a7aSBaptiste Daroussin res = ucl_object_typed_new (UCL_ARRAY); 21239ee7a7aSBaptiste Daroussin count = pcg32_random () % nelt; 21339ee7a7aSBaptiste Daroussin 21439ee7a7aSBaptiste Daroussin for (i = 0; i < count; i ++) { 21539ee7a7aSBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random (); 21639ee7a7aSBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (cur % 128)); 217*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (-(cur % 128))); 21839ee7a7aSBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random (); 219*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (cur % UINT16_MAX)); 220*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (-(cur % INT16_MAX))); 22139ee7a7aSBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random (); 222*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (cur % UINT32_MAX)); 223*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (-(cur % INT32_MAX))); 22439ee7a7aSBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random (); 225*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (cur)); 226*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (-cur)); 227*d9f0ce31SBaptiste Daroussin /* Double version */ 22839ee7a7aSBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random (); 229*d9f0ce31SBaptiste Daroussin curf = (cur % 128) / 19 * 16; 230*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromdouble (curf)); 231*d9f0ce31SBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random (); 232*d9f0ce31SBaptiste Daroussin curf = -(cur % 128) / 19 * 16; 233*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromdouble (curf)); 234*d9f0ce31SBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random (); 235*d9f0ce31SBaptiste Daroussin curf = (cur % 65536) / 19 * 16; 236*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromdouble (curf)); 237*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromdouble (-curf)); 238*d9f0ce31SBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random (); 239*d9f0ce31SBaptiste Daroussin curf = (cur % INT32_MAX) / 19 * 16; 240*d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromdouble (curf)); 241*d9f0ce31SBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random (); 242*d9f0ce31SBaptiste Daroussin memcpy (&curf, &cur, sizeof (curf)); 24339ee7a7aSBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (cur)); 24439ee7a7aSBaptiste Daroussin } 24539ee7a7aSBaptiste Daroussin 24639ee7a7aSBaptiste Daroussin return res; 24739ee7a7aSBaptiste Daroussin } 24839ee7a7aSBaptiste Daroussin 24939ee7a7aSBaptiste Daroussin static ucl_object_t* 25039ee7a7aSBaptiste Daroussin ucl_test_string (void) 25139ee7a7aSBaptiste Daroussin { 25239ee7a7aSBaptiste Daroussin ucl_object_t *res, *elt; 25339ee7a7aSBaptiste Daroussin int count, i; 25439ee7a7aSBaptiste Daroussin uint32_t cur_len; 25539ee7a7aSBaptiste Daroussin char *str; 25639ee7a7aSBaptiste Daroussin 25739ee7a7aSBaptiste Daroussin res = ucl_object_typed_new (UCL_ARRAY); 25839ee7a7aSBaptiste Daroussin count = pcg32_random () % nelt; 25939ee7a7aSBaptiste Daroussin 26039ee7a7aSBaptiste Daroussin for (i = 0; i < count; i ++) { 26139ee7a7aSBaptiste Daroussin while ((cur_len = pcg32_random ()) % 128 == 0); 26239ee7a7aSBaptiste Daroussin 26339ee7a7aSBaptiste Daroussin str = malloc (cur_len % 128); 26439ee7a7aSBaptiste Daroussin ucl_array_append (res, ucl_object_fromstring_common (str, cur_len % 128, 26539ee7a7aSBaptiste Daroussin UCL_STRING_RAW)); 26639ee7a7aSBaptiste Daroussin free (str); 26739ee7a7aSBaptiste Daroussin 26839ee7a7aSBaptiste Daroussin while ((cur_len = pcg32_random ()) % 512 == 0); 26939ee7a7aSBaptiste Daroussin str = malloc (cur_len % 512); 27039ee7a7aSBaptiste Daroussin ucl_array_append (res, ucl_object_fromstring_common (str, cur_len % 512, 27139ee7a7aSBaptiste Daroussin UCL_STRING_RAW)); 27239ee7a7aSBaptiste Daroussin free (str); 27339ee7a7aSBaptiste Daroussin 27439ee7a7aSBaptiste Daroussin while ((cur_len = pcg32_random ()) % 128 == 0); 27539ee7a7aSBaptiste Daroussin str = malloc (cur_len % 128); 27639ee7a7aSBaptiste Daroussin elt = ucl_object_fromstring_common (str, cur_len % 128, 27739ee7a7aSBaptiste Daroussin UCL_STRING_RAW); 27839ee7a7aSBaptiste Daroussin elt->flags |= UCL_OBJECT_BINARY; 27939ee7a7aSBaptiste Daroussin ucl_array_append (res, elt); 28039ee7a7aSBaptiste Daroussin free (str); 28139ee7a7aSBaptiste Daroussin 28239ee7a7aSBaptiste Daroussin while ((cur_len = pcg32_random ()) % 512 == 0); 28339ee7a7aSBaptiste Daroussin str = malloc (cur_len % 512); 28439ee7a7aSBaptiste Daroussin elt = ucl_object_fromstring_common (str, cur_len % 512, 28539ee7a7aSBaptiste Daroussin UCL_STRING_RAW); 28639ee7a7aSBaptiste Daroussin elt->flags |= UCL_OBJECT_BINARY; 28739ee7a7aSBaptiste Daroussin ucl_array_append (res, elt); 28839ee7a7aSBaptiste Daroussin free (str); 28939ee7a7aSBaptiste Daroussin } 29039ee7a7aSBaptiste Daroussin 291*d9f0ce31SBaptiste Daroussin /* One large string */ 292*d9f0ce31SBaptiste Daroussin str = malloc (65537); 293*d9f0ce31SBaptiste Daroussin elt = ucl_object_fromstring_common (str, 65537, 294*d9f0ce31SBaptiste Daroussin UCL_STRING_RAW); 295*d9f0ce31SBaptiste Daroussin elt->flags |= UCL_OBJECT_BINARY; 296*d9f0ce31SBaptiste Daroussin ucl_array_append (res, elt); 297*d9f0ce31SBaptiste Daroussin free (str); 298*d9f0ce31SBaptiste Daroussin 29939ee7a7aSBaptiste Daroussin return res; 30039ee7a7aSBaptiste Daroussin } 30139ee7a7aSBaptiste Daroussin 30239ee7a7aSBaptiste Daroussin static ucl_object_t* 30339ee7a7aSBaptiste Daroussin ucl_test_boolean (void) 30439ee7a7aSBaptiste Daroussin { 30539ee7a7aSBaptiste Daroussin ucl_object_t *res; 30639ee7a7aSBaptiste Daroussin int count, i; 30739ee7a7aSBaptiste Daroussin 30839ee7a7aSBaptiste Daroussin res = ucl_object_typed_new (UCL_ARRAY); 30939ee7a7aSBaptiste Daroussin count = pcg32_random () % nelt; 31039ee7a7aSBaptiste Daroussin 31139ee7a7aSBaptiste Daroussin for (i = 0; i < count; i ++) { 31239ee7a7aSBaptiste Daroussin ucl_array_append (res, ucl_object_frombool (pcg32_random () % 2)); 31339ee7a7aSBaptiste Daroussin } 31439ee7a7aSBaptiste Daroussin 31539ee7a7aSBaptiste Daroussin return res; 31639ee7a7aSBaptiste Daroussin } 31739ee7a7aSBaptiste Daroussin 31839ee7a7aSBaptiste Daroussin static ucl_object_t* 31939ee7a7aSBaptiste Daroussin ucl_test_map (void) 32039ee7a7aSBaptiste Daroussin { 32139ee7a7aSBaptiste Daroussin ucl_object_t *res, *cur; 32239ee7a7aSBaptiste Daroussin int count, i; 32339ee7a7aSBaptiste Daroussin uint32_t cur_len, sel; 32439ee7a7aSBaptiste Daroussin size_t klen; 32539ee7a7aSBaptiste Daroussin const char *key; 32639ee7a7aSBaptiste Daroussin 32739ee7a7aSBaptiste Daroussin res = ucl_object_typed_new (UCL_OBJECT); 32839ee7a7aSBaptiste Daroussin count = pcg32_random () % nelt; 32939ee7a7aSBaptiste Daroussin 33039ee7a7aSBaptiste Daroussin recursion ++; 33139ee7a7aSBaptiste Daroussin 33239ee7a7aSBaptiste Daroussin for (i = 0; i < count; i ++) { 33339ee7a7aSBaptiste Daroussin 33439ee7a7aSBaptiste Daroussin if (recursion > 10) { 335*d9f0ce31SBaptiste Daroussin for (;;) { 336*d9f0ce31SBaptiste Daroussin sel = pcg32_random () % NTESTS; 337*d9f0ce31SBaptiste Daroussin if (tests[sel] != ucl_test_map && 338*d9f0ce31SBaptiste Daroussin tests[sel] != ucl_test_array) { 339*d9f0ce31SBaptiste Daroussin break; 340*d9f0ce31SBaptiste Daroussin } 341*d9f0ce31SBaptiste Daroussin } 34239ee7a7aSBaptiste Daroussin } 34339ee7a7aSBaptiste Daroussin else { 34439ee7a7aSBaptiste Daroussin sel = pcg32_random () % NTESTS; 34539ee7a7aSBaptiste Daroussin } 34639ee7a7aSBaptiste Daroussin 34739ee7a7aSBaptiste Daroussin key = random_key (&klen); 34839ee7a7aSBaptiste Daroussin cur = tests[sel](); 34939ee7a7aSBaptiste Daroussin assert (cur != NULL); 35039ee7a7aSBaptiste Daroussin assert (klen != 0); 35139ee7a7aSBaptiste Daroussin 35239ee7a7aSBaptiste Daroussin ucl_object_insert_key (res, cur, key, klen, true); 35339ee7a7aSBaptiste Daroussin 35439ee7a7aSBaptiste Daroussin /* Multi value key */ 35539ee7a7aSBaptiste Daroussin cur = tests[sel](); 35639ee7a7aSBaptiste Daroussin assert (cur != NULL); 35739ee7a7aSBaptiste Daroussin 35839ee7a7aSBaptiste Daroussin ucl_object_insert_key (res, cur, key, klen, true); 35939ee7a7aSBaptiste Daroussin } 36039ee7a7aSBaptiste Daroussin 36139ee7a7aSBaptiste Daroussin return res; 36239ee7a7aSBaptiste Daroussin } 36339ee7a7aSBaptiste Daroussin 36439ee7a7aSBaptiste Daroussin static ucl_object_t* 365*d9f0ce31SBaptiste Daroussin ucl_test_large_map (void) 366*d9f0ce31SBaptiste Daroussin { 367*d9f0ce31SBaptiste Daroussin ucl_object_t *res, *cur; 368*d9f0ce31SBaptiste Daroussin int count, i; 369*d9f0ce31SBaptiste Daroussin uint32_t cur_len; 370*d9f0ce31SBaptiste Daroussin size_t klen; 371*d9f0ce31SBaptiste Daroussin const char *key; 372*d9f0ce31SBaptiste Daroussin 373*d9f0ce31SBaptiste Daroussin res = ucl_object_typed_new (UCL_OBJECT); 374*d9f0ce31SBaptiste Daroussin count = 65537; 375*d9f0ce31SBaptiste Daroussin 376*d9f0ce31SBaptiste Daroussin recursion ++; 377*d9f0ce31SBaptiste Daroussin 378*d9f0ce31SBaptiste Daroussin for (i = 0; i < count; i ++) { 379*d9f0ce31SBaptiste Daroussin key = random_key (&klen); 380*d9f0ce31SBaptiste Daroussin cur = ucl_test_boolean (); 381*d9f0ce31SBaptiste Daroussin assert (cur != NULL); 382*d9f0ce31SBaptiste Daroussin assert (klen != 0); 383*d9f0ce31SBaptiste Daroussin 384*d9f0ce31SBaptiste Daroussin ucl_object_insert_key (res, cur, key, klen, true); 385*d9f0ce31SBaptiste Daroussin } 386*d9f0ce31SBaptiste Daroussin 387*d9f0ce31SBaptiste Daroussin return res; 388*d9f0ce31SBaptiste Daroussin } 389*d9f0ce31SBaptiste Daroussin 390*d9f0ce31SBaptiste Daroussin static ucl_object_t* 39139ee7a7aSBaptiste Daroussin ucl_test_array (void) 39239ee7a7aSBaptiste Daroussin { 39339ee7a7aSBaptiste Daroussin ucl_object_t *res, *cur; 39439ee7a7aSBaptiste Daroussin int count, i; 39539ee7a7aSBaptiste Daroussin uint32_t cur_len, sel; 39639ee7a7aSBaptiste Daroussin 39739ee7a7aSBaptiste Daroussin res = ucl_object_typed_new (UCL_ARRAY); 39839ee7a7aSBaptiste Daroussin count = pcg32_random () % nelt; 39939ee7a7aSBaptiste Daroussin 40039ee7a7aSBaptiste Daroussin recursion ++; 40139ee7a7aSBaptiste Daroussin 40239ee7a7aSBaptiste Daroussin for (i = 0; i < count; i ++) { 40339ee7a7aSBaptiste Daroussin if (recursion > 10) { 404*d9f0ce31SBaptiste Daroussin for (;;) { 405*d9f0ce31SBaptiste Daroussin sel = pcg32_random () % NTESTS; 406*d9f0ce31SBaptiste Daroussin if (tests[sel] != ucl_test_map && 407*d9f0ce31SBaptiste Daroussin tests[sel] != ucl_test_array) { 408*d9f0ce31SBaptiste Daroussin break; 409*d9f0ce31SBaptiste Daroussin } 410*d9f0ce31SBaptiste Daroussin } 41139ee7a7aSBaptiste Daroussin } 41239ee7a7aSBaptiste Daroussin else { 41339ee7a7aSBaptiste Daroussin sel = pcg32_random () % NTESTS; 41439ee7a7aSBaptiste Daroussin } 41539ee7a7aSBaptiste Daroussin 41639ee7a7aSBaptiste Daroussin cur = tests[sel](); 41739ee7a7aSBaptiste Daroussin assert (cur != NULL); 41839ee7a7aSBaptiste Daroussin 41939ee7a7aSBaptiste Daroussin ucl_array_append (res, cur); 42039ee7a7aSBaptiste Daroussin } 42139ee7a7aSBaptiste Daroussin 42239ee7a7aSBaptiste Daroussin return res; 42339ee7a7aSBaptiste Daroussin } 424*d9f0ce31SBaptiste Daroussin 425*d9f0ce31SBaptiste Daroussin static ucl_object_t* 426*d9f0ce31SBaptiste Daroussin ucl_test_large_array (void) 427*d9f0ce31SBaptiste Daroussin { 428*d9f0ce31SBaptiste Daroussin ucl_object_t *res, *cur; 429*d9f0ce31SBaptiste Daroussin int count, i; 430*d9f0ce31SBaptiste Daroussin uint32_t cur_len; 431*d9f0ce31SBaptiste Daroussin 432*d9f0ce31SBaptiste Daroussin res = ucl_object_typed_new (UCL_ARRAY); 433*d9f0ce31SBaptiste Daroussin count = 65537; 434*d9f0ce31SBaptiste Daroussin 435*d9f0ce31SBaptiste Daroussin recursion ++; 436*d9f0ce31SBaptiste Daroussin 437*d9f0ce31SBaptiste Daroussin for (i = 0; i < count; i ++) { 438*d9f0ce31SBaptiste Daroussin cur = ucl_test_boolean (); 439*d9f0ce31SBaptiste Daroussin assert (cur != NULL); 440*d9f0ce31SBaptiste Daroussin 441*d9f0ce31SBaptiste Daroussin ucl_array_append (res, cur); 442*d9f0ce31SBaptiste Daroussin } 443*d9f0ce31SBaptiste Daroussin 444*d9f0ce31SBaptiste Daroussin return res; 445*d9f0ce31SBaptiste Daroussin } 446*d9f0ce31SBaptiste Daroussin 447*d9f0ce31SBaptiste Daroussin static ucl_object_t* 448*d9f0ce31SBaptiste Daroussin ucl_test_large_string (void) 449*d9f0ce31SBaptiste Daroussin { 450*d9f0ce31SBaptiste Daroussin ucl_object_t *res; 451*d9f0ce31SBaptiste Daroussin char *str; 452*d9f0ce31SBaptiste Daroussin uint32_t cur_len; 453*d9f0ce31SBaptiste Daroussin 454*d9f0ce31SBaptiste Daroussin while ((cur_len = pcg32_random ()) % 100000 == 0); 455*d9f0ce31SBaptiste Daroussin str = malloc (cur_len % 100000); 456*d9f0ce31SBaptiste Daroussin res = ucl_object_fromstring_common (str, cur_len % 100000, 457*d9f0ce31SBaptiste Daroussin UCL_STRING_RAW); 458*d9f0ce31SBaptiste Daroussin res->flags |= UCL_OBJECT_BINARY; 459*d9f0ce31SBaptiste Daroussin 460*d9f0ce31SBaptiste Daroussin return res; 461*d9f0ce31SBaptiste Daroussin } 462*d9f0ce31SBaptiste Daroussin 463*d9f0ce31SBaptiste Daroussin static ucl_object_t* 464*d9f0ce31SBaptiste Daroussin ucl_test_null (void) 465*d9f0ce31SBaptiste Daroussin { 466*d9f0ce31SBaptiste Daroussin return ucl_object_typed_new (UCL_NULL); 467*d9f0ce31SBaptiste Daroussin } 468