xref: /freebsd/contrib/libucl/tests/test_msgpack.c (revision a0409676)
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