xref: /freebsd/lib/libnv/tests/nvlist_append_test.c (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1*24881c06SMariusz Zaborski /*-
2*24881c06SMariusz Zaborski  * Copyright (c) 2018 The NetBSD Foundation, Inc.
3*24881c06SMariusz Zaborski  * All rights reserved.
4*24881c06SMariusz Zaborski  *
5*24881c06SMariusz Zaborski  * Redistribution and use in source and binary forms, with or without
6*24881c06SMariusz Zaborski  * modification, are permitted provided that the following conditions
7*24881c06SMariusz Zaborski  * are met:
8*24881c06SMariusz Zaborski  * 1. Redistributions of source code must retain the above copyright
9*24881c06SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer.
10*24881c06SMariusz Zaborski  * 2. Redistributions in binary form must reproduce the above copyright
11*24881c06SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer in the
12*24881c06SMariusz Zaborski  *    documentation and/or other materials provided with the distribution.
13*24881c06SMariusz Zaborski  *
14*24881c06SMariusz Zaborski  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
15*24881c06SMariusz Zaborski  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
16*24881c06SMariusz Zaborski  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17*24881c06SMariusz Zaborski  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
18*24881c06SMariusz Zaborski  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19*24881c06SMariusz Zaborski  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20*24881c06SMariusz Zaborski  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21*24881c06SMariusz Zaborski  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22*24881c06SMariusz Zaborski  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23*24881c06SMariusz Zaborski  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24*24881c06SMariusz Zaborski  * POSSIBILITY OF SUCH DAMAGE.
25*24881c06SMariusz Zaborski  */
26*24881c06SMariusz Zaborski 
27*24881c06SMariusz Zaborski #include <sys/nv.h>
28*24881c06SMariusz Zaborski 
29*24881c06SMariusz Zaborski #include <errno.h>
30*24881c06SMariusz Zaborski #include <stdio.h>
31*24881c06SMariusz Zaborski #include <stdlib.h>
32*24881c06SMariusz Zaborski #include <string.h>
33*24881c06SMariusz Zaborski #include <unistd.h>
34*24881c06SMariusz Zaborski 
35*24881c06SMariusz Zaborski static int ntest = 1;
36*24881c06SMariusz Zaborski 
37*24881c06SMariusz Zaborski #define	CHECK(expr)	do {						\
38*24881c06SMariusz Zaborski 	if ((expr))							\
39*24881c06SMariusz Zaborski 		printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);	\
40*24881c06SMariusz Zaborski 	else								\
41*24881c06SMariusz Zaborski 		printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
42*24881c06SMariusz Zaborski 	ntest++;							\
43*24881c06SMariusz Zaborski } while (0)
44*24881c06SMariusz Zaborski 
45*24881c06SMariusz Zaborski int
main(void)46*24881c06SMariusz Zaborski main(void)
47*24881c06SMariusz Zaborski {
48*24881c06SMariusz Zaborski 	const bool *bool_result;
49*24881c06SMariusz Zaborski 	const char * const *string_result;
50*24881c06SMariusz Zaborski 	const nvlist_t * const *nvl_result;
51*24881c06SMariusz Zaborski 	nvlist_t *nvl, *nvl1, *nvl2, **items;
52*24881c06SMariusz Zaborski 	unsigned int i;
53*24881c06SMariusz Zaborski 	size_t nitems;
54*24881c06SMariusz Zaborski 
55*24881c06SMariusz Zaborski 	printf("1..32\n");
56*24881c06SMariusz Zaborski 
57*24881c06SMariusz Zaborski 	nvl = nvlist_create(0);
58*24881c06SMariusz Zaborski 
59*24881c06SMariusz Zaborski 	for (i = 0; i < 16; i++)
60*24881c06SMariusz Zaborski 		nvlist_append_bool_array(nvl, "nvl/bool", i % 2 == 0);
61*24881c06SMariusz Zaborski 
62*24881c06SMariusz Zaborski 	CHECK(nvlist_error(nvl) == 0);
63*24881c06SMariusz Zaborski 	CHECK(!nvlist_empty(nvl));
64*24881c06SMariusz Zaborski 	CHECK(nvlist_exists_bool_array(nvl, "nvl/bool"));
65*24881c06SMariusz Zaborski 
66*24881c06SMariusz Zaborski 	bool_result = nvlist_get_bool_array(nvl, "nvl/bool", &nitems);
67*24881c06SMariusz Zaborski 	CHECK(nitems == 16);
68*24881c06SMariusz Zaborski 	CHECK(bool_result != NULL);
69*24881c06SMariusz Zaborski 	for (i = 0; i < nitems; i++)
70*24881c06SMariusz Zaborski 		CHECK(bool_result[i] == (i % 2 == 0));
71*24881c06SMariusz Zaborski 
72*24881c06SMariusz Zaborski 
73*24881c06SMariusz Zaborski 	nvlist_append_string_array(nvl, "nvl/string", "a");
74*24881c06SMariusz Zaborski 	nvlist_append_string_array(nvl, "nvl/string", "abc");
75*24881c06SMariusz Zaborski 	string_result = nvlist_get_string_array(nvl, "nvl/string", &nitems);
76*24881c06SMariusz Zaborski 	CHECK(nitems == 2);
77*24881c06SMariusz Zaborski 	CHECK(strcmp(string_result[0], "a") == 0);
78*24881c06SMariusz Zaborski 	CHECK(strcmp(string_result[1], "abc") == 0);
79*24881c06SMariusz Zaborski 
80*24881c06SMariusz Zaborski 
81*24881c06SMariusz Zaborski 	nvl1 = nvlist_create(0);
82*24881c06SMariusz Zaborski 	nvlist_add_string(nvl1, "key1", "test1");
83*24881c06SMariusz Zaborski 	nvlist_append_nvlist_array(nvl, "nvl/nvl", nvl1);
84*24881c06SMariusz Zaborski 	nvlist_destroy(nvl1);
85*24881c06SMariusz Zaborski 
86*24881c06SMariusz Zaborski 	nvl2 = nvlist_create(0);
87*24881c06SMariusz Zaborski 	nvlist_add_string(nvl2, "key2", "test2");
88*24881c06SMariusz Zaborski 	nvlist_append_nvlist_array(nvl, "nvl/nvl", nvl2);
89*24881c06SMariusz Zaborski 	nvlist_destroy(nvl2);
90*24881c06SMariusz Zaborski 
91*24881c06SMariusz Zaborski 	nvl_result = nvlist_get_nvlist_array(nvl, "nvl/nvl", &nitems);
92*24881c06SMariusz Zaborski 	CHECK(nitems == 2);
93*24881c06SMariusz Zaborski 	CHECK(strcmp(nvlist_get_string(nvl_result[0], "key1"), "test1") == 0);
94*24881c06SMariusz Zaborski 	CHECK(strcmp(nvlist_get_string(nvl_result[1], "key2"), "test2") == 0);
95*24881c06SMariusz Zaborski 
96*24881c06SMariusz Zaborski 	nvl1 = nvlist_create(0);
97*24881c06SMariusz Zaborski 	nvlist_add_number(nvl1, "key1", 10);
98*24881c06SMariusz Zaborski 	nvlist_append_nvlist_array(nvl, "nvl/nvl_array", nvl1);
99*24881c06SMariusz Zaborski 	nvlist_destroy(nvl1);
100*24881c06SMariusz Zaborski 
101*24881c06SMariusz Zaborski 	nvl2 = nvlist_create(0);
102*24881c06SMariusz Zaborski 	nvlist_add_number(nvl2, "key1", 20);
103*24881c06SMariusz Zaborski 	nvlist_append_nvlist_array(nvl, "nvl/nvl_array", nvl2);
104*24881c06SMariusz Zaborski 	nvlist_destroy(nvl2);
105*24881c06SMariusz Zaborski 
106*24881c06SMariusz Zaborski 	items = nvlist_take_nvlist_array(nvl, "nvl/nvl_array", &nitems);
107*24881c06SMariusz Zaborski 	CHECK(nvlist_get_number(items[0], "key1") == 10);
108*24881c06SMariusz Zaborski 	CHECK(nvlist_get_number(items[1], "key1") == 20);
109*24881c06SMariusz Zaborski 	CHECK(nvlist_error(items[0]) == 0);
110*24881c06SMariusz Zaborski 	CHECK(nvlist_error(items[1]) == 0);
111*24881c06SMariusz Zaborski 
112*24881c06SMariusz Zaborski 	nvlist_move_nvlist_array(nvl, "nvl/nvl_new_array", items, nitems);
113*24881c06SMariusz Zaborski 	CHECK(nvlist_error(nvl) == 0);
114*24881c06SMariusz Zaborski 
115*24881c06SMariusz Zaborski 	nvlist_destroy(nvl);
116*24881c06SMariusz Zaborski 
117*24881c06SMariusz Zaborski 	return (0);
118*24881c06SMariusz Zaborski }
119