124881c06SMariusz Zaborski /*-
224881c06SMariusz Zaborski  * Copyright (c) 2018 The NetBSD Foundation, Inc.
324881c06SMariusz Zaborski  * All rights reserved.
424881c06SMariusz Zaborski  *
524881c06SMariusz Zaborski  * Redistribution and use in source and binary forms, with or without
624881c06SMariusz Zaborski  * modification, are permitted provided that the following conditions
724881c06SMariusz Zaborski  * are met:
824881c06SMariusz Zaborski  * 1. Redistributions of source code must retain the above copyright
924881c06SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer.
1024881c06SMariusz Zaborski  * 2. Redistributions in binary form must reproduce the above copyright
1124881c06SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer in the
1224881c06SMariusz Zaborski  *    documentation and/or other materials provided with the distribution.
1324881c06SMariusz Zaborski  *
1424881c06SMariusz Zaborski  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1524881c06SMariusz Zaborski  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1624881c06SMariusz Zaborski  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1724881c06SMariusz Zaborski  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
1824881c06SMariusz Zaborski  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1924881c06SMariusz Zaborski  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2024881c06SMariusz Zaborski  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2124881c06SMariusz Zaborski  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2224881c06SMariusz Zaborski  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2324881c06SMariusz Zaborski  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2424881c06SMariusz Zaborski  * POSSIBILITY OF SUCH DAMAGE.
2524881c06SMariusz Zaborski  */
2624881c06SMariusz Zaborski 
2724881c06SMariusz Zaborski #include <sys/nv.h>
2824881c06SMariusz Zaborski 
2924881c06SMariusz Zaborski #include <errno.h>
3024881c06SMariusz Zaborski #include <stdio.h>
3124881c06SMariusz Zaborski #include <stdlib.h>
3224881c06SMariusz Zaborski #include <string.h>
3324881c06SMariusz Zaborski #include <unistd.h>
3424881c06SMariusz Zaborski 
3524881c06SMariusz Zaborski static int ntest = 1;
3624881c06SMariusz Zaborski 
3724881c06SMariusz Zaborski #define	CHECK(expr)	do {						\
3824881c06SMariusz Zaborski 	if ((expr))							\
3924881c06SMariusz Zaborski 		printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);	\
4024881c06SMariusz Zaborski 	else								\
4124881c06SMariusz Zaborski 		printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
4224881c06SMariusz Zaborski 	ntest++;							\
4324881c06SMariusz Zaborski } while (0)
4424881c06SMariusz Zaborski 
4524881c06SMariusz Zaborski int
main(void)4624881c06SMariusz Zaborski main(void)
4724881c06SMariusz Zaborski {
4824881c06SMariusz Zaborski 	const bool *bool_result;
4924881c06SMariusz Zaborski 	const char * const *string_result;
5024881c06SMariusz Zaborski 	const nvlist_t * const *nvl_result;
5124881c06SMariusz Zaborski 	nvlist_t *nvl, *nvl1, *nvl2, **items;
5224881c06SMariusz Zaborski 	unsigned int i;
5324881c06SMariusz Zaborski 	size_t nitems;
5424881c06SMariusz Zaborski 
5524881c06SMariusz Zaborski 	printf("1..32\n");
5624881c06SMariusz Zaborski 
5724881c06SMariusz Zaborski 	nvl = nvlist_create(0);
5824881c06SMariusz Zaborski 
5924881c06SMariusz Zaborski 	for (i = 0; i < 16; i++)
6024881c06SMariusz Zaborski 		nvlist_append_bool_array(nvl, "nvl/bool", i % 2 == 0);
6124881c06SMariusz Zaborski 
6224881c06SMariusz Zaborski 	CHECK(nvlist_error(nvl) == 0);
6324881c06SMariusz Zaborski 	CHECK(!nvlist_empty(nvl));
6424881c06SMariusz Zaborski 	CHECK(nvlist_exists_bool_array(nvl, "nvl/bool"));
6524881c06SMariusz Zaborski 
6624881c06SMariusz Zaborski 	bool_result = nvlist_get_bool_array(nvl, "nvl/bool", &nitems);
6724881c06SMariusz Zaborski 	CHECK(nitems == 16);
6824881c06SMariusz Zaborski 	CHECK(bool_result != NULL);
6924881c06SMariusz Zaborski 	for (i = 0; i < nitems; i++)
7024881c06SMariusz Zaborski 		CHECK(bool_result[i] == (i % 2 == 0));
7124881c06SMariusz Zaborski 
7224881c06SMariusz Zaborski 
7324881c06SMariusz Zaborski 	nvlist_append_string_array(nvl, "nvl/string", "a");
7424881c06SMariusz Zaborski 	nvlist_append_string_array(nvl, "nvl/string", "abc");
7524881c06SMariusz Zaborski 	string_result = nvlist_get_string_array(nvl, "nvl/string", &nitems);
7624881c06SMariusz Zaborski 	CHECK(nitems == 2);
7724881c06SMariusz Zaborski 	CHECK(strcmp(string_result[0], "a") == 0);
7824881c06SMariusz Zaborski 	CHECK(strcmp(string_result[1], "abc") == 0);
7924881c06SMariusz Zaborski 
8024881c06SMariusz Zaborski 
8124881c06SMariusz Zaborski 	nvl1 = nvlist_create(0);
8224881c06SMariusz Zaborski 	nvlist_add_string(nvl1, "key1", "test1");
8324881c06SMariusz Zaborski 	nvlist_append_nvlist_array(nvl, "nvl/nvl", nvl1);
8424881c06SMariusz Zaborski 	nvlist_destroy(nvl1);
8524881c06SMariusz Zaborski 
8624881c06SMariusz Zaborski 	nvl2 = nvlist_create(0);
8724881c06SMariusz Zaborski 	nvlist_add_string(nvl2, "key2", "test2");
8824881c06SMariusz Zaborski 	nvlist_append_nvlist_array(nvl, "nvl/nvl", nvl2);
8924881c06SMariusz Zaborski 	nvlist_destroy(nvl2);
9024881c06SMariusz Zaborski 
9124881c06SMariusz Zaborski 	nvl_result = nvlist_get_nvlist_array(nvl, "nvl/nvl", &nitems);
9224881c06SMariusz Zaborski 	CHECK(nitems == 2);
9324881c06SMariusz Zaborski 	CHECK(strcmp(nvlist_get_string(nvl_result[0], "key1"), "test1") == 0);
9424881c06SMariusz Zaborski 	CHECK(strcmp(nvlist_get_string(nvl_result[1], "key2"), "test2") == 0);
9524881c06SMariusz Zaborski 
9624881c06SMariusz Zaborski 	nvl1 = nvlist_create(0);
9724881c06SMariusz Zaborski 	nvlist_add_number(nvl1, "key1", 10);
9824881c06SMariusz Zaborski 	nvlist_append_nvlist_array(nvl, "nvl/nvl_array", nvl1);
9924881c06SMariusz Zaborski 	nvlist_destroy(nvl1);
10024881c06SMariusz Zaborski 
10124881c06SMariusz Zaborski 	nvl2 = nvlist_create(0);
10224881c06SMariusz Zaborski 	nvlist_add_number(nvl2, "key1", 20);
10324881c06SMariusz Zaborski 	nvlist_append_nvlist_array(nvl, "nvl/nvl_array", nvl2);
10424881c06SMariusz Zaborski 	nvlist_destroy(nvl2);
10524881c06SMariusz Zaborski 
10624881c06SMariusz Zaborski 	items = nvlist_take_nvlist_array(nvl, "nvl/nvl_array", &nitems);
10724881c06SMariusz Zaborski 	CHECK(nvlist_get_number(items[0], "key1") == 10);
10824881c06SMariusz Zaborski 	CHECK(nvlist_get_number(items[1], "key1") == 20);
10924881c06SMariusz Zaborski 	CHECK(nvlist_error(items[0]) == 0);
11024881c06SMariusz Zaborski 	CHECK(nvlist_error(items[1]) == 0);
11124881c06SMariusz Zaborski 
11224881c06SMariusz Zaborski 	nvlist_move_nvlist_array(nvl, "nvl/nvl_new_array", items, nitems);
11324881c06SMariusz Zaborski 	CHECK(nvlist_error(nvl) == 0);
11424881c06SMariusz Zaborski 
11524881c06SMariusz Zaborski 	nvlist_destroy(nvl);
11624881c06SMariusz Zaborski 
11724881c06SMariusz Zaborski 	return (0);
11824881c06SMariusz Zaborski }
119