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
29d9f0ce31SBaptiste Daroussin static const int niter = 20;
30d9f0ce31SBaptiste Daroussin static const int ntests = 10;
31d9f0ce31SBaptiste 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);
42d9f0ce31SBaptiste Daroussin static ucl_object_t* ucl_test_large_map (void);
43d9f0ce31SBaptiste Daroussin static ucl_object_t* ucl_test_large_array (void);
44d9f0ce31SBaptiste Daroussin static ucl_object_t* ucl_test_large_string (void);
45d9f0ce31SBaptiste 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,
53d9f0ce31SBaptiste 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
pcg32_random(void)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 *
random_key(size_t * lenptr)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
main(int argc,char ** argv)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
152d9f0ce31SBaptiste Daroussin key = random_key (&klen);
153d9f0ce31SBaptiste Daroussin elt = ucl_test_large_array ();
154d9f0ce31SBaptiste Daroussin ucl_object_insert_key (obj, elt, key, klen, true);
155d9f0ce31SBaptiste Daroussin
156d9f0ce31SBaptiste Daroussin key = random_key (&klen);
157d9f0ce31SBaptiste Daroussin elt = ucl_test_large_map ();
158d9f0ce31SBaptiste Daroussin ucl_object_insert_key (obj, elt, key, klen, true);
159d9f0ce31SBaptiste Daroussin
160d9f0ce31SBaptiste Daroussin key = random_key (&klen);
161d9f0ce31SBaptiste Daroussin elt = ucl_test_large_string ();
162d9f0ce31SBaptiste Daroussin ucl_object_insert_key (obj, elt, key, klen, true);
163d9f0ce31SBaptiste 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*
ucl_test_integer(void)20439ee7a7aSBaptiste Daroussin ucl_test_integer (void)
20539ee7a7aSBaptiste Daroussin {
20639ee7a7aSBaptiste Daroussin ucl_object_t *res;
20739ee7a7aSBaptiste Daroussin int count, i;
20839ee7a7aSBaptiste Daroussin uint64_t cur;
209d9f0ce31SBaptiste 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));
217d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (-(cur % 128)));
21839ee7a7aSBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random ();
219d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (cur % UINT16_MAX));
220d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (-(cur % INT16_MAX)));
22139ee7a7aSBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random ();
222d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (cur % UINT32_MAX));
223d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (-(cur % INT32_MAX)));
22439ee7a7aSBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random ();
225d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (cur));
226d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromint (-cur));
227d9f0ce31SBaptiste Daroussin /* Double version */
22839ee7a7aSBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random ();
229d9f0ce31SBaptiste Daroussin curf = (cur % 128) / 19 * 16;
230d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromdouble (curf));
231d9f0ce31SBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random ();
232d9f0ce31SBaptiste Daroussin curf = -(cur % 128) / 19 * 16;
233d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromdouble (curf));
234d9f0ce31SBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random ();
235d9f0ce31SBaptiste Daroussin curf = (cur % 65536) / 19 * 16;
236d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromdouble (curf));
237d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromdouble (-curf));
238d9f0ce31SBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random ();
239d9f0ce31SBaptiste Daroussin curf = (cur % INT32_MAX) / 19 * 16;
240d9f0ce31SBaptiste Daroussin ucl_array_append (res, ucl_object_fromdouble (curf));
241d9f0ce31SBaptiste Daroussin cur = ((uint64_t)pcg32_random ()) << 32 | pcg32_random ();
242d9f0ce31SBaptiste 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*
ucl_test_string(void)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
291d9f0ce31SBaptiste Daroussin /* One large string */
292d9f0ce31SBaptiste Daroussin str = malloc (65537);
293d9f0ce31SBaptiste Daroussin elt = ucl_object_fromstring_common (str, 65537,
294d9f0ce31SBaptiste Daroussin UCL_STRING_RAW);
295d9f0ce31SBaptiste Daroussin elt->flags |= UCL_OBJECT_BINARY;
296d9f0ce31SBaptiste Daroussin ucl_array_append (res, elt);
297d9f0ce31SBaptiste Daroussin free (str);
298d9f0ce31SBaptiste Daroussin
29939ee7a7aSBaptiste Daroussin return res;
30039ee7a7aSBaptiste Daroussin }
30139ee7a7aSBaptiste Daroussin
30239ee7a7aSBaptiste Daroussin static ucl_object_t*
ucl_test_boolean(void)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*
ucl_test_map(void)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) {
335d9f0ce31SBaptiste Daroussin for (;;) {
336d9f0ce31SBaptiste Daroussin sel = pcg32_random () % NTESTS;
337d9f0ce31SBaptiste Daroussin if (tests[sel] != ucl_test_map &&
338d9f0ce31SBaptiste Daroussin tests[sel] != ucl_test_array) {
339d9f0ce31SBaptiste Daroussin break;
340d9f0ce31SBaptiste Daroussin }
341d9f0ce31SBaptiste 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*
ucl_test_large_map(void)365d9f0ce31SBaptiste Daroussin ucl_test_large_map (void)
366d9f0ce31SBaptiste Daroussin {
367d9f0ce31SBaptiste Daroussin ucl_object_t *res, *cur;
368d9f0ce31SBaptiste Daroussin int count, i;
369d9f0ce31SBaptiste Daroussin uint32_t cur_len;
370d9f0ce31SBaptiste Daroussin size_t klen;
371d9f0ce31SBaptiste Daroussin const char *key;
372d9f0ce31SBaptiste Daroussin
373d9f0ce31SBaptiste Daroussin res = ucl_object_typed_new (UCL_OBJECT);
374d9f0ce31SBaptiste Daroussin count = 65537;
375d9f0ce31SBaptiste Daroussin
376d9f0ce31SBaptiste Daroussin recursion ++;
377d9f0ce31SBaptiste Daroussin
378d9f0ce31SBaptiste Daroussin for (i = 0; i < count; i ++) {
379d9f0ce31SBaptiste Daroussin key = random_key (&klen);
380d9f0ce31SBaptiste Daroussin cur = ucl_test_boolean ();
381d9f0ce31SBaptiste Daroussin assert (cur != NULL);
382d9f0ce31SBaptiste Daroussin assert (klen != 0);
383d9f0ce31SBaptiste Daroussin
384d9f0ce31SBaptiste Daroussin ucl_object_insert_key (res, cur, key, klen, true);
385d9f0ce31SBaptiste Daroussin }
386d9f0ce31SBaptiste Daroussin
387d9f0ce31SBaptiste Daroussin return res;
388d9f0ce31SBaptiste Daroussin }
389d9f0ce31SBaptiste Daroussin
390d9f0ce31SBaptiste Daroussin static ucl_object_t*
ucl_test_array(void)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) {
404d9f0ce31SBaptiste Daroussin for (;;) {
405d9f0ce31SBaptiste Daroussin sel = pcg32_random () % NTESTS;
406d9f0ce31SBaptiste Daroussin if (tests[sel] != ucl_test_map &&
407d9f0ce31SBaptiste Daroussin tests[sel] != ucl_test_array) {
408d9f0ce31SBaptiste Daroussin break;
409d9f0ce31SBaptiste Daroussin }
410d9f0ce31SBaptiste 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 }
424d9f0ce31SBaptiste Daroussin
425d9f0ce31SBaptiste Daroussin static ucl_object_t*
ucl_test_large_array(void)426d9f0ce31SBaptiste Daroussin ucl_test_large_array (void)
427d9f0ce31SBaptiste Daroussin {
428d9f0ce31SBaptiste Daroussin ucl_object_t *res, *cur;
429d9f0ce31SBaptiste Daroussin int count, i;
430d9f0ce31SBaptiste Daroussin uint32_t cur_len;
431d9f0ce31SBaptiste Daroussin
432d9f0ce31SBaptiste Daroussin res = ucl_object_typed_new (UCL_ARRAY);
433d9f0ce31SBaptiste Daroussin count = 65537;
434d9f0ce31SBaptiste Daroussin
435d9f0ce31SBaptiste Daroussin recursion ++;
436d9f0ce31SBaptiste Daroussin
437d9f0ce31SBaptiste Daroussin for (i = 0; i < count; i ++) {
438d9f0ce31SBaptiste Daroussin cur = ucl_test_boolean ();
439d9f0ce31SBaptiste Daroussin assert (cur != NULL);
440d9f0ce31SBaptiste Daroussin
441d9f0ce31SBaptiste Daroussin ucl_array_append (res, cur);
442d9f0ce31SBaptiste Daroussin }
443d9f0ce31SBaptiste Daroussin
444d9f0ce31SBaptiste Daroussin return res;
445d9f0ce31SBaptiste Daroussin }
446d9f0ce31SBaptiste Daroussin
447d9f0ce31SBaptiste Daroussin static ucl_object_t*
ucl_test_large_string(void)448d9f0ce31SBaptiste Daroussin ucl_test_large_string (void)
449d9f0ce31SBaptiste Daroussin {
450d9f0ce31SBaptiste Daroussin ucl_object_t *res;
451d9f0ce31SBaptiste Daroussin char *str;
452d9f0ce31SBaptiste Daroussin uint32_t cur_len;
453d9f0ce31SBaptiste Daroussin
454d9f0ce31SBaptiste Daroussin while ((cur_len = pcg32_random ()) % 100000 == 0);
455d9f0ce31SBaptiste Daroussin str = malloc (cur_len % 100000);
456d9f0ce31SBaptiste Daroussin res = ucl_object_fromstring_common (str, cur_len % 100000,
457d9f0ce31SBaptiste Daroussin UCL_STRING_RAW);
458d9f0ce31SBaptiste Daroussin res->flags |= UCL_OBJECT_BINARY;
459*a0409676SBaptiste Daroussin free (str);
460d9f0ce31SBaptiste Daroussin
461d9f0ce31SBaptiste Daroussin return res;
462d9f0ce31SBaptiste Daroussin }
463d9f0ce31SBaptiste Daroussin
464d9f0ce31SBaptiste Daroussin static ucl_object_t*
ucl_test_null(void)465d9f0ce31SBaptiste Daroussin ucl_test_null (void)
466d9f0ce31SBaptiste Daroussin {
467d9f0ce31SBaptiste Daroussin return ucl_object_typed_new (UCL_NULL);
468d9f0ce31SBaptiste Daroussin }
469