xref: /freebsd-src/lib/libnv/tests/nv_array_tests.cc (revision 2981431e044fae3bc87e6fa891b8230b484dc84b)
1347a39b4SMariusz Zaborski /*-
2*2981431eSMariusz Zaborski  * Copyright (c) 2015-2024 Mariusz Zaborski <oshogbo@FreeBSD.org>
3347a39b4SMariusz Zaborski  *
4347a39b4SMariusz Zaborski  * Redistribution and use in source and binary forms, with or without
5347a39b4SMariusz Zaborski  * modification, are permitted provided that the following conditions
6347a39b4SMariusz Zaborski  * are met:
7347a39b4SMariusz Zaborski  * 1. Redistributions of source code must retain the above copyright
8347a39b4SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer.
9347a39b4SMariusz Zaborski  * 2. Redistributions in binary form must reproduce the above copyright
10347a39b4SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer in the
11347a39b4SMariusz Zaborski  *    documentation and/or other materials provided with the distribution.
12347a39b4SMariusz Zaborski  *
13347a39b4SMariusz Zaborski  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14347a39b4SMariusz Zaborski  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15347a39b4SMariusz Zaborski  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16347a39b4SMariusz Zaborski  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17347a39b4SMariusz Zaborski  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18347a39b4SMariusz Zaborski  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19347a39b4SMariusz Zaborski  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20347a39b4SMariusz Zaborski  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21347a39b4SMariusz Zaborski  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22347a39b4SMariusz Zaborski  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23347a39b4SMariusz Zaborski  * SUCH DAMAGE.
24347a39b4SMariusz Zaborski  */
25347a39b4SMariusz Zaborski 
26e02f530eSEnji Cooper #include <sys/param.h>
27347a39b4SMariusz Zaborski #include <sys/types.h>
28e02f530eSEnji Cooper #include <sys/nv.h>
29*2981431eSMariusz Zaborski #include <sys/mman.h>
30347a39b4SMariusz Zaborski #include <sys/socket.h>
31347a39b4SMariusz Zaborski 
32347a39b4SMariusz Zaborski #include <atf-c++.hpp>
33347a39b4SMariusz Zaborski 
34347a39b4SMariusz Zaborski #include <cstdio>
35347a39b4SMariusz Zaborski #include <errno.h>
36347a39b4SMariusz Zaborski #include <fcntl.h>
37347a39b4SMariusz Zaborski #include <limits>
38347a39b4SMariusz Zaborski #include <set>
39347a39b4SMariusz Zaborski #include <sstream>
40347a39b4SMariusz Zaborski #include <string>
41347a39b4SMariusz Zaborski 
42347a39b4SMariusz Zaborski #define fd_is_valid(fd) (fcntl((fd), F_GETFL) != -1 || errno != EBADF)
43347a39b4SMariusz Zaborski 
44347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_bool_array__basic);
45347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_bool_array__basic)
46347a39b4SMariusz Zaborski {
47347a39b4SMariusz Zaborski 	bool testbool[16];
48347a39b4SMariusz Zaborski 	const bool *const_result;
49347a39b4SMariusz Zaborski 	bool *result;
50347a39b4SMariusz Zaborski 	nvlist_t *nvl;
518d86e318SEnji Cooper 	size_t num_items;
52347a39b4SMariusz Zaborski 	unsigned int i;
53347a39b4SMariusz Zaborski 	const char *key;
54347a39b4SMariusz Zaborski 
55347a39b4SMariusz Zaborski 	key = "nvl/bool";
56347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
57347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
58347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
59347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
60347a39b4SMariusz Zaborski 
61347a39b4SMariusz Zaborski 	for (i = 0; i < 16; i++)
62347a39b4SMariusz Zaborski 		testbool[i] = (i % 2 == 0);
63347a39b4SMariusz Zaborski 
64347a39b4SMariusz Zaborski 	nvlist_add_bool_array(nvl, key, testbool, 16);
65347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
66347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
67347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
68347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_bool_array(nvl, "nvl/bool"));
69347a39b4SMariusz Zaborski 
708d86e318SEnji Cooper 	const_result = nvlist_get_bool_array(nvl, key, &num_items);
718d86e318SEnji Cooper 	ATF_REQUIRE_EQ(num_items, 16);
72347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
738d86e318SEnji Cooper 	for (i = 0; i < num_items; i++)
74347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(const_result[i], testbool[i]);
75347a39b4SMariusz Zaborski 
768d86e318SEnji Cooper 	result = nvlist_take_bool_array(nvl, key, &num_items);
778d86e318SEnji Cooper 	ATF_REQUIRE_EQ(num_items, 16);
78347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
798d86e318SEnji Cooper 	for (i = 0; i < num_items; i++)
80347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(result[i], testbool[i]);
81347a39b4SMariusz Zaborski 
82347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_bool_array(nvl, key));
83347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
84347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
85347a39b4SMariusz Zaborski 
86347a39b4SMariusz Zaborski 	free(result);
87347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
88347a39b4SMariusz Zaborski }
89347a39b4SMariusz Zaborski 
90347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_string_array__basic);
91347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_string_array__basic)
92347a39b4SMariusz Zaborski {
93347a39b4SMariusz Zaborski 	const char * const *const_result;
94347a39b4SMariusz Zaborski 	char **result;
95347a39b4SMariusz Zaborski 	nvlist_t *nvl;
968d86e318SEnji Cooper 	size_t num_items;
97347a39b4SMariusz Zaborski 	unsigned int i;
98347a39b4SMariusz Zaborski 	const char *key;
998d86e318SEnji Cooper 	const char *string_arr[8] = { "a", "b", "kot", "foo",
100347a39b4SMariusz Zaborski 	    "tests", "nice test", "", "abcdef" };
101347a39b4SMariusz Zaborski 
102347a39b4SMariusz Zaborski 	key = "nvl/string";
103347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
104347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
105347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
106347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
107347a39b4SMariusz Zaborski 
108e02f530eSEnji Cooper 	nvlist_add_string_array(nvl, key, string_arr, nitems(string_arr));
109347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
110347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
111347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
112347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_string_array(nvl, "nvl/string"));
113347a39b4SMariusz Zaborski 
1148d86e318SEnji Cooper 	const_result = nvlist_get_string_array(nvl, key, &num_items);
115347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
116347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
117e02f530eSEnji Cooper 	ATF_REQUIRE(num_items == nitems(string_arr));
1188d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
1198d86e318SEnji Cooper 		if (string_arr[i] != NULL) {
1208d86e318SEnji Cooper 			ATF_REQUIRE(strcmp(const_result[i],
1218d86e318SEnji Cooper 			    string_arr[i]) == 0);
122347a39b4SMariusz Zaborski 		} else {
1238d86e318SEnji Cooper 			ATF_REQUIRE(const_result[i] == string_arr[i]);
124347a39b4SMariusz Zaborski 		}
125347a39b4SMariusz Zaborski 	}
126347a39b4SMariusz Zaborski 
1278d86e318SEnji Cooper 	result = nvlist_take_string_array(nvl, key, &num_items);
128347a39b4SMariusz Zaborski 	ATF_REQUIRE(result != NULL);
129e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(num_items, nitems(string_arr));
1308d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
1318d86e318SEnji Cooper 		if (string_arr[i] != NULL) {
1328d86e318SEnji Cooper 			ATF_REQUIRE_EQ(strcmp(result[i], string_arr[i]), 0);
133347a39b4SMariusz Zaborski 		} else {
1348d86e318SEnji Cooper 			ATF_REQUIRE_EQ(result[i], string_arr[i]);
135347a39b4SMariusz Zaborski 		}
136347a39b4SMariusz Zaborski 	}
137347a39b4SMariusz Zaborski 
138347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
139347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
140347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
141347a39b4SMariusz Zaborski 
142e02f530eSEnji Cooper 	for (i = 0; i < num_items; i++)
143347a39b4SMariusz Zaborski 		free(result[i]);
144347a39b4SMariusz Zaborski 	free(result);
145347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
146347a39b4SMariusz Zaborski }
147347a39b4SMariusz Zaborski 
148347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_descriptor_array__basic);
149347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_descriptor_array__basic)
150347a39b4SMariusz Zaborski {
151347a39b4SMariusz Zaborski 	int fd[32], *result;
152347a39b4SMariusz Zaborski 	const int *const_result;
153347a39b4SMariusz Zaborski 	nvlist_t *nvl;
1548d86e318SEnji Cooper 	size_t num_items;
155347a39b4SMariusz Zaborski 	unsigned int i;
156347a39b4SMariusz Zaborski 	const char *key;
157347a39b4SMariusz Zaborski 
158e02f530eSEnji Cooper 	for (i = 0; i < nitems(fd); i++) {
159347a39b4SMariusz Zaborski 		fd[i] = dup(STDERR_FILENO);
160347a39b4SMariusz Zaborski 		ATF_REQUIRE(fd_is_valid(fd[i]));
161347a39b4SMariusz Zaborski 	}
162347a39b4SMariusz Zaborski 
163347a39b4SMariusz Zaborski 	key = "nvl/descriptor";
164347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
165347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
166347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
167347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_descriptor_array(nvl, key));
168347a39b4SMariusz Zaborski 
169e02f530eSEnji Cooper 	nvlist_add_descriptor_array(nvl, key, fd, nitems(fd));
170347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
171347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
172347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
173347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, "nvl/descriptor"));
174347a39b4SMariusz Zaborski 
1758d86e318SEnji Cooper 	const_result = nvlist_get_descriptor_array(nvl, key, &num_items);
176347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
177347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
178e02f530eSEnji Cooper 	ATF_REQUIRE(num_items == nitems(fd));
1798d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
180347a39b4SMariusz Zaborski 		ATF_REQUIRE(fd_is_valid(const_result[i]));
181347a39b4SMariusz Zaborski 		if (i > 0)
182347a39b4SMariusz Zaborski 			ATF_REQUIRE(const_result[i] != const_result[i - 1]);
183347a39b4SMariusz Zaborski 	}
184347a39b4SMariusz Zaborski 
1858d86e318SEnji Cooper 	result = nvlist_take_descriptor_array(nvl, key, &num_items);
186347a39b4SMariusz Zaborski 	ATF_REQUIRE(result != NULL);
187e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(num_items, nitems(fd));
1888d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
189347a39b4SMariusz Zaborski 		ATF_REQUIRE(fd_is_valid(result[i]));
190347a39b4SMariusz Zaborski 		if (i > 0)
191347a39b4SMariusz Zaborski 			ATF_REQUIRE(const_result[i] != const_result[i - 1]);
192347a39b4SMariusz Zaborski 	}
193347a39b4SMariusz Zaborski 
194347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
195347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
196347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
197347a39b4SMariusz Zaborski 
1988d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
199347a39b4SMariusz Zaborski 		close(result[i]);
200347a39b4SMariusz Zaborski 		close(fd[i]);
201347a39b4SMariusz Zaborski 	}
202347a39b4SMariusz Zaborski 	free(result);
203347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
204347a39b4SMariusz Zaborski }
205347a39b4SMariusz Zaborski 
206347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_number_array__basic);
207347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_number_array__basic)
208347a39b4SMariusz Zaborski {
209347a39b4SMariusz Zaborski 	const uint64_t *const_result;
210347a39b4SMariusz Zaborski 	uint64_t *result;
211347a39b4SMariusz Zaborski 	nvlist_t *nvl;
2128d86e318SEnji Cooper 	size_t num_items;
213347a39b4SMariusz Zaborski 	unsigned int i;
214347a39b4SMariusz Zaborski 	const char *key;
215347a39b4SMariusz Zaborski 	const uint64_t number[8] = { 0, UINT_MAX, 7, 123, 90,
216347a39b4SMariusz Zaborski 	    100000, 8, 1 };
217347a39b4SMariusz Zaborski 
218347a39b4SMariusz Zaborski 	key = "nvl/number";
219347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
220347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
221347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
222347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
223347a39b4SMariusz Zaborski 
224e02f530eSEnji Cooper 	nvlist_add_number_array(nvl, key, number, nitems(number));
225347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
226347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
227347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_number_array(nvl, key));
228347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_number_array(nvl, "nvl/number"));
229347a39b4SMariusz Zaborski 
2308d86e318SEnji Cooper 	const_result = nvlist_get_number_array(nvl, key, &num_items);
231347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
232347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
233e02f530eSEnji Cooper 	ATF_REQUIRE(num_items == nitems(number));
2348d86e318SEnji Cooper 	for (i = 0; i < num_items; i++)
235347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(const_result[i], number[i]);
236347a39b4SMariusz Zaborski 
2378d86e318SEnji Cooper 	result = nvlist_take_number_array(nvl, key, &num_items);
238347a39b4SMariusz Zaborski 	ATF_REQUIRE(result != NULL);
239e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(num_items, nitems(number));
2408d86e318SEnji Cooper 	for (i = 0; i < num_items; i++)
241347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(result[i], number[i]);
242347a39b4SMariusz Zaborski 
243347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
244347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
245347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
246347a39b4SMariusz Zaborski 
247347a39b4SMariusz Zaborski 	free(result);
248347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
249347a39b4SMariusz Zaborski }
250347a39b4SMariusz Zaborski 
251347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_nvlist_array__basic);
252347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_nvlist_array__basic)
253347a39b4SMariusz Zaborski {
254347a39b4SMariusz Zaborski 	nvlist_t *testnvl[8];
255347a39b4SMariusz Zaborski 	const nvlist_t * const *const_result;
256347a39b4SMariusz Zaborski 	nvlist_t **result;
257347a39b4SMariusz Zaborski 	nvlist_t *nvl;
2588d86e318SEnji Cooper 	size_t num_items;
259347a39b4SMariusz Zaborski 	unsigned int i;
260347a39b4SMariusz Zaborski 	const char *somestr[8] = { "a", "b", "c", "d", "e", "f", "g", "h" };
261347a39b4SMariusz Zaborski 	const char *key;
262347a39b4SMariusz Zaborski 
263347a39b4SMariusz Zaborski 	for (i = 0; i < 8; i++) {
264347a39b4SMariusz Zaborski 		testnvl[i] = nvlist_create(0);
265347a39b4SMariusz Zaborski 		ATF_REQUIRE(testnvl[i] != NULL);
266347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
267347a39b4SMariusz Zaborski 		nvlist_add_string(testnvl[i], "nvl/string", somestr[i]);
268347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
269347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_exists_string(testnvl[i], "nvl/string"));
270347a39b4SMariusz Zaborski 	}
271347a39b4SMariusz Zaborski 
272347a39b4SMariusz Zaborski 	key = "nvl/nvlist";
273347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
274347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
275347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
276347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
277347a39b4SMariusz Zaborski 
278347a39b4SMariusz Zaborski 	nvlist_add_nvlist_array(nvl, key, (const nvlist_t * const *)testnvl, 8);
279347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
280347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
281347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, key));
282347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, "nvl/nvlist"));
283347a39b4SMariusz Zaborski 
2848d86e318SEnji Cooper 	const_result = nvlist_get_nvlist_array(nvl, key, &num_items);
285347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
286347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
287e02f530eSEnji Cooper 	ATF_REQUIRE(num_items == nitems(testnvl));
288347a39b4SMariusz Zaborski 
2898d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
290347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(nvlist_error(const_result[i]), 0);
2918d86e318SEnji Cooper 		if (i < num_items - 1) {
292347a39b4SMariusz Zaborski 			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
293347a39b4SMariusz Zaborski 			    const_result[i + 1]);
294347a39b4SMariusz Zaborski 		} else {
295347a39b4SMariusz Zaborski 			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
296347a39b4SMariusz Zaborski 			    NULL);
297347a39b4SMariusz Zaborski 		}
298347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_get_parent(const_result[i], NULL) == nvl);
299347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_in_array(const_result[i]));
300347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_exists_string(const_result[i],
301347a39b4SMariusz Zaborski 		    "nvl/string"));
302347a39b4SMariusz Zaborski 		ATF_REQUIRE(strcmp(nvlist_get_string(const_result[i],
303347a39b4SMariusz Zaborski 		    "nvl/string"), somestr[i]) == 0);
304347a39b4SMariusz Zaborski 	}
305347a39b4SMariusz Zaborski 
3068d86e318SEnji Cooper 	result = nvlist_take_nvlist_array(nvl, key, &num_items);
307347a39b4SMariusz Zaborski 	ATF_REQUIRE(result != NULL);
3088d86e318SEnji Cooper 	ATF_REQUIRE_EQ(num_items, 8);
3098d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
310347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(nvlist_error(result[i]), 0);
311347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_get_array_next(result[i]) == NULL);
3128f2285b2SMariusz Zaborski 		ATF_REQUIRE(nvlist_get_parent(result[i], NULL) == NULL);
313347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_get_array_next(const_result[i]) == NULL);
314347a39b4SMariusz Zaborski 		ATF_REQUIRE(!nvlist_in_array(const_result[i]));
315347a39b4SMariusz Zaborski 	}
316347a39b4SMariusz Zaborski 
317347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
318347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
319347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
320347a39b4SMariusz Zaborski 
321347a39b4SMariusz Zaborski 	for (i = 0; i < 8; i++) {
322347a39b4SMariusz Zaborski 		nvlist_destroy(result[i]);
323347a39b4SMariusz Zaborski 		nvlist_destroy(testnvl[i]);
324347a39b4SMariusz Zaborski 	}
325347a39b4SMariusz Zaborski 
326347a39b4SMariusz Zaborski 	free(result);
327347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
328347a39b4SMariusz Zaborski }
329347a39b4SMariusz Zaborski 
330347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone_array);
331347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_clone_array)
332347a39b4SMariusz Zaborski {
333347a39b4SMariusz Zaborski 	nvlist_t *testnvl[8];
334347a39b4SMariusz Zaborski 	nvlist_t *src, *dst;
335347a39b4SMariusz Zaborski 	const nvlist_t *nvl;
336347a39b4SMariusz Zaborski 	bool testbool[16];
337347a39b4SMariusz Zaborski 	int testfd[16];
3388d86e318SEnji Cooper 	size_t i, num_items;
3398d86e318SEnji Cooper 	const char *string_arr[8] = { "a", "b", "kot", "foo",
340347a39b4SMariusz Zaborski 	    "tests", "nice test", "", "abcdef" };
341347a39b4SMariusz Zaborski 	const char *somestr[8] = { "a", "b", "c", "d", "e", "f", "g", "h" };
342347a39b4SMariusz Zaborski 	const uint64_t number[8] = { 0, UINT_MAX, 7, 123, 90,
343347a39b4SMariusz Zaborski 	    100000, 8, 1 };
344347a39b4SMariusz Zaborski 
345e02f530eSEnji Cooper 	for (i = 0; i < nitems(testfd); i++) {
346347a39b4SMariusz Zaborski 		testbool[i] = (i % 2 == 0);
347347a39b4SMariusz Zaborski 		testfd[i] = dup(STDERR_FILENO);
348347a39b4SMariusz Zaborski 		ATF_REQUIRE(fd_is_valid(testfd[i]));
349347a39b4SMariusz Zaborski 	}
350e02f530eSEnji Cooper 	for (i = 0; i < nitems(testnvl); i++) {
351347a39b4SMariusz Zaborski 		testnvl[i] = nvlist_create(0);
352347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_error(testnvl[i]) == 0);
353347a39b4SMariusz Zaborski 		nvlist_add_string(testnvl[i], "nvl/nvl/teststr", somestr[i]);
354347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_error(testnvl[i]) == 0);
355347a39b4SMariusz Zaborski 	}
356347a39b4SMariusz Zaborski 
357347a39b4SMariusz Zaborski 	src = nvlist_create(0);
358347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(src) == 0);
359347a39b4SMariusz Zaborski 
360347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_bool_array(src, "nvl/bool"));
361e02f530eSEnji Cooper 	nvlist_add_bool_array(src, "nvl/bool", testbool, nitems(testbool));
362347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(src), 0);
363347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_bool_array(src, "nvl/bool"));
364347a39b4SMariusz Zaborski 
365347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(src, "nvl/string"));
366e02f530eSEnji Cooper 	nvlist_add_string_array(src, "nvl/string", string_arr,
367e02f530eSEnji Cooper 	    nitems(string_arr));
368347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(src), 0);
369347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_string_array(src, "nvl/string"));
370347a39b4SMariusz Zaborski 
371347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_descriptor_array(src, "nvl/fd"));
372e02f530eSEnji Cooper 	nvlist_add_descriptor_array(src, "nvl/fd", testfd, nitems(testfd));
373347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(src), 0);
374347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_descriptor_array(src, "nvl/fd"));
375347a39b4SMariusz Zaborski 
376347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_number_array(src, "nvl/number"));
377e02f530eSEnji Cooper 	nvlist_add_number_array(src, "nvl/number", number,
378e02f530eSEnji Cooper 	    nitems(number));
379347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(src), 0);
380347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_number_array(src, "nvl/number"));
381347a39b4SMariusz Zaborski 
382347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_nvlist_array(src, "nvl/array"));
383347a39b4SMariusz Zaborski 	nvlist_add_nvlist_array(src, "nvl/array",
384e02f530eSEnji Cooper 	    (const nvlist_t * const *)testnvl, nitems(testnvl));
385347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(src), 0);
386347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_nvlist_array(src, "nvl/array"));
387347a39b4SMariusz Zaborski 
388347a39b4SMariusz Zaborski 	dst = nvlist_clone(src);
389347a39b4SMariusz Zaborski 	ATF_REQUIRE(dst != NULL);
390347a39b4SMariusz Zaborski 
391347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_bool_array(dst, "nvl/bool"));
3928d86e318SEnji Cooper 	(void) nvlist_get_bool_array(dst, "nvl/bool", &num_items);
393e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(num_items, nitems(testbool));
3948d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
395347a39b4SMariusz Zaborski 		ATF_REQUIRE(
3968d86e318SEnji Cooper 		    nvlist_get_bool_array(dst, "nvl/bool", &num_items)[i] ==
3978d86e318SEnji Cooper 		    nvlist_get_bool_array(src, "nvl/bool", &num_items)[i]);
398347a39b4SMariusz Zaborski 	}
399347a39b4SMariusz Zaborski 
400347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_string_array(dst, "nvl/string"));
4018d86e318SEnji Cooper 	(void) nvlist_get_string_array(dst, "nvl/string", &num_items);
402e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(num_items, nitems(string_arr));
4038d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
404347a39b4SMariusz Zaborski 		if (nvlist_get_string_array(dst, "nvl/string",
4058d86e318SEnji Cooper 		    &num_items)[i] == NULL) {
406347a39b4SMariusz Zaborski 			ATF_REQUIRE(nvlist_get_string_array(dst, "nvl/string",
4078d86e318SEnji Cooper 			    &num_items)[i] == nvlist_get_string_array(src,
4088d86e318SEnji Cooper 			    "nvl/string", &num_items)[i]);
409347a39b4SMariusz Zaborski 		} else {
410347a39b4SMariusz Zaborski 			ATF_REQUIRE(strcmp(nvlist_get_string_array(dst,
4118d86e318SEnji Cooper 			    "nvl/string", &num_items)[i], nvlist_get_string_array(
4128d86e318SEnji Cooper 			    src, "nvl/string", &num_items)[i]) == 0);
413347a39b4SMariusz Zaborski 		}
414347a39b4SMariusz Zaborski 	}
415347a39b4SMariusz Zaborski 
416347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_descriptor_array(dst, "nvl/fd"));
4178d86e318SEnji Cooper 	(void) nvlist_get_descriptor_array(dst, "nvl/fd", &num_items);
418e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(num_items, nitems(testfd));
4198d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
420347a39b4SMariusz Zaborski 		ATF_REQUIRE(fd_is_valid(
4218d86e318SEnji Cooper 		    nvlist_get_descriptor_array(dst, "nvl/fd", &num_items)[i]));
422347a39b4SMariusz Zaborski 	}
423347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_number_array(dst, "nvl/number"));
4248d86e318SEnji Cooper 	(void) nvlist_get_number_array(dst, "nvl/number", &num_items);
425e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(num_items, nitems(number));
426347a39b4SMariusz Zaborski 
4278d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
428347a39b4SMariusz Zaborski 		ATF_REQUIRE(
4298d86e318SEnji Cooper 		    nvlist_get_number_array(dst, "nvl/number", &num_items)[i] ==
4308d86e318SEnji Cooper 		    nvlist_get_number_array(src, "nvl/number", &num_items)[i]);
431347a39b4SMariusz Zaborski 	}
432347a39b4SMariusz Zaborski 
433347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_nvlist_array(dst, "nvl/array"));
4348d86e318SEnji Cooper 	(void) nvlist_get_nvlist_array(dst, "nvl/array", &num_items);
435e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(num_items, nitems(testnvl));
4368d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
4378d86e318SEnji Cooper 		nvl = nvlist_get_nvlist_array(dst, "nvl/array", &num_items)[i];
438347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_exists_string(nvl, "nvl/nvl/teststr"));
439347a39b4SMariusz Zaborski 		ATF_REQUIRE(strcmp(nvlist_get_string(nvl, "nvl/nvl/teststr"),
440347a39b4SMariusz Zaborski 		    somestr[i]) == 0);
441347a39b4SMariusz Zaborski 	}
442347a39b4SMariusz Zaborski 
443e02f530eSEnji Cooper 	for (i = 0; i < nitems(testfd); i++) {
444347a39b4SMariusz Zaborski 		close(testfd[i]);
445347a39b4SMariusz Zaborski 	}
446e02f530eSEnji Cooper 	for (i = 0; i < nitems(testnvl); i++) {
447e02f530eSEnji Cooper 		nvlist_destroy(testnvl[i]);
448347a39b4SMariusz Zaborski 	}
449347a39b4SMariusz Zaborski 	nvlist_destroy(src);
450347a39b4SMariusz Zaborski 	nvlist_destroy(dst);
451347a39b4SMariusz Zaborski }
452347a39b4SMariusz Zaborski 
453347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_bool_array__move);
454347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_bool_array__move)
455347a39b4SMariusz Zaborski {
456347a39b4SMariusz Zaborski 	bool *testbool;
457347a39b4SMariusz Zaborski 	const bool *const_result;
458347a39b4SMariusz Zaborski 	nvlist_t *nvl;
4598d86e318SEnji Cooper 	size_t num_items, count;
460347a39b4SMariusz Zaborski 	unsigned int i;
461347a39b4SMariusz Zaborski 	const char *key;
462347a39b4SMariusz Zaborski 
463347a39b4SMariusz Zaborski 	key = "nvl/bool";
464347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
465347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
466347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
467347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
468347a39b4SMariusz Zaborski 
469347a39b4SMariusz Zaborski 	count = 16;
470347a39b4SMariusz Zaborski 	testbool = (bool*)malloc(sizeof(*testbool) * count);
471347a39b4SMariusz Zaborski 	ATF_REQUIRE(testbool != NULL);
472347a39b4SMariusz Zaborski 	for (i = 0; i < count; i++)
473347a39b4SMariusz Zaborski 		testbool[i] = (i % 2 == 0);
474347a39b4SMariusz Zaborski 
475347a39b4SMariusz Zaborski 	nvlist_move_bool_array(nvl, key, testbool, count);
476347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
477347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
478347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
479347a39b4SMariusz Zaborski 
4808d86e318SEnji Cooper 	const_result = nvlist_get_bool_array(nvl, key, &num_items);
4818d86e318SEnji Cooper 	ATF_REQUIRE_EQ(num_items, count);
482347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
483347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result == testbool);
4848d86e318SEnji Cooper 	for (i = 0; i < num_items; i++)
485347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(const_result[i], (i % 2 == 0));
486347a39b4SMariusz Zaborski 
487347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
488347a39b4SMariusz Zaborski }
489347a39b4SMariusz Zaborski 
490347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_string_array__move);
491347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_string_array__move)
492347a39b4SMariusz Zaborski {
493347a39b4SMariusz Zaborski 	char **teststr;
494347a39b4SMariusz Zaborski 	const char * const *const_result;
495347a39b4SMariusz Zaborski 	nvlist_t *nvl;
4968d86e318SEnji Cooper 	size_t num_items, count;
497347a39b4SMariusz Zaborski 	unsigned int i;
498347a39b4SMariusz Zaborski 	const char *key;
499347a39b4SMariusz Zaborski 
500347a39b4SMariusz Zaborski 	key = "nvl/string";
501347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
502347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
503347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
504347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
505347a39b4SMariusz Zaborski 
506347a39b4SMariusz Zaborski 	count = 26;
507347a39b4SMariusz Zaborski 	teststr = (char**)malloc(sizeof(*teststr) * count);
508347a39b4SMariusz Zaborski 	ATF_REQUIRE(teststr != NULL);
509347a39b4SMariusz Zaborski 	for (i = 0; i < count; i++) {
510347a39b4SMariusz Zaborski 		teststr[i] = (char*)malloc(sizeof(**teststr) * 2);
511347a39b4SMariusz Zaborski 		ATF_REQUIRE(teststr[i] != NULL);
512347a39b4SMariusz Zaborski 		teststr[i][0] = 'a' + i;
513347a39b4SMariusz Zaborski 		teststr[i][1] = '\0';
514347a39b4SMariusz Zaborski 	}
515347a39b4SMariusz Zaborski 
516347a39b4SMariusz Zaborski 	nvlist_move_string_array(nvl, key, teststr, count);
517347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
518347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
519347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
520347a39b4SMariusz Zaborski 
5218d86e318SEnji Cooper 	const_result = nvlist_get_string_array(nvl, key, &num_items);
5228d86e318SEnji Cooper 	ATF_REQUIRE_EQ(num_items, count);
523347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
524347a39b4SMariusz Zaborski 	ATF_REQUIRE((intptr_t)const_result == (intptr_t)teststr);
5258d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
526347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(const_result[i][0], (char)('a' + i));
527347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(const_result[i][1], '\0');
528347a39b4SMariusz Zaborski 	}
529347a39b4SMariusz Zaborski 
530347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
531347a39b4SMariusz Zaborski }
532347a39b4SMariusz Zaborski 
533347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_nvlist_array__move);
534347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_nvlist_array__move)
535347a39b4SMariusz Zaborski {
536347a39b4SMariusz Zaborski 	nvlist **testnv;
537347a39b4SMariusz Zaborski 	const nvlist * const *const_result;
538347a39b4SMariusz Zaborski 	nvlist_t *nvl;
5398d86e318SEnji Cooper 	size_t num_items, count;
540347a39b4SMariusz Zaborski 	unsigned int i;
541347a39b4SMariusz Zaborski 	const char *key;
542347a39b4SMariusz Zaborski 
543347a39b4SMariusz Zaborski 	key = "nvl/nvlist";
544347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
545347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
546347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
547347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_nvlist_array(nvl, key));
548347a39b4SMariusz Zaborski 
549347a39b4SMariusz Zaborski 	count = 26;
550347a39b4SMariusz Zaborski 	testnv = (nvlist**)malloc(sizeof(*testnv) * count);
551347a39b4SMariusz Zaborski 	ATF_REQUIRE(testnv != NULL);
552347a39b4SMariusz Zaborski 	for (i = 0; i < count; i++) {
553347a39b4SMariusz Zaborski 		testnv[i] = nvlist_create(0);
554347a39b4SMariusz Zaborski 		ATF_REQUIRE(testnv[i] != NULL);
555347a39b4SMariusz Zaborski 	}
556347a39b4SMariusz Zaborski 
557347a39b4SMariusz Zaborski 	nvlist_move_nvlist_array(nvl, key, testnv, count);
558347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
559347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
560347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, key));
561347a39b4SMariusz Zaborski 
5628d86e318SEnji Cooper 	const_result = nvlist_get_nvlist_array(nvl, key, &num_items);
5638d86e318SEnji Cooper 	ATF_REQUIRE_EQ(num_items, count);
564347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
565347a39b4SMariusz Zaborski 	ATF_REQUIRE((intptr_t)const_result == (intptr_t)testnv);
5668d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
567347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(nvlist_error(const_result[i]), 0);
568347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_empty(const_result[i]));
5698d86e318SEnji Cooper 		if (i < num_items - 1) {
570347a39b4SMariusz Zaborski 			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
571347a39b4SMariusz Zaborski 			    const_result[i + 1]);
572347a39b4SMariusz Zaborski 		} else {
573347a39b4SMariusz Zaborski 			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
574347a39b4SMariusz Zaborski 			    NULL);
575347a39b4SMariusz Zaborski 		}
576347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_get_parent(const_result[i], NULL) == nvl);
577347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_in_array(const_result[i]));
578347a39b4SMariusz Zaborski 	}
579347a39b4SMariusz Zaborski 
580347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
581347a39b4SMariusz Zaborski }
582347a39b4SMariusz Zaborski 
583347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_number_array__move);
584347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_number_array__move)
585347a39b4SMariusz Zaborski {
586347a39b4SMariusz Zaborski 	uint64_t *testnumber;
587347a39b4SMariusz Zaborski 	const uint64_t *const_result;
588347a39b4SMariusz Zaborski 	nvlist_t *nvl;
5898d86e318SEnji Cooper 	size_t num_items, count;
590347a39b4SMariusz Zaborski 	unsigned int i;
591347a39b4SMariusz Zaborski 	const char *key;
592347a39b4SMariusz Zaborski 
593347a39b4SMariusz Zaborski 	key = "nvl/number";
594347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
595347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
596347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
597347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
598347a39b4SMariusz Zaborski 
599347a39b4SMariusz Zaborski 	count = 1000;
600347a39b4SMariusz Zaborski 	testnumber = (uint64_t*)malloc(sizeof(*testnumber) * count);
601347a39b4SMariusz Zaborski 	ATF_REQUIRE(testnumber != NULL);
602347a39b4SMariusz Zaborski 	for (i = 0; i < count; i++)
603347a39b4SMariusz Zaborski 		testnumber[i] = i;
604347a39b4SMariusz Zaborski 
605347a39b4SMariusz Zaborski 	nvlist_move_number_array(nvl, key, testnumber, count);
606347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
607347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
608347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_number_array(nvl, key));
609347a39b4SMariusz Zaborski 
6108d86e318SEnji Cooper 	const_result = nvlist_get_number_array(nvl, key, &num_items);
6118d86e318SEnji Cooper 	ATF_REQUIRE_EQ(num_items, count);
612347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
613347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result == testnumber);
6148d86e318SEnji Cooper 	for (i = 0; i < num_items; i++)
615347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(const_result[i], i);
616347a39b4SMariusz Zaborski 
617347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
618347a39b4SMariusz Zaborski }
619347a39b4SMariusz Zaborski 
620347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_descriptor_array__move);
621347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_descriptor_array__move)
622347a39b4SMariusz Zaborski {
623347a39b4SMariusz Zaborski 	int *testfd;
624347a39b4SMariusz Zaborski 	const int *const_result;
625347a39b4SMariusz Zaborski 	nvlist_t *nvl;
6268d86e318SEnji Cooper 	size_t num_items, count;
627347a39b4SMariusz Zaborski 	unsigned int i;
628347a39b4SMariusz Zaborski 	const char *key;
629347a39b4SMariusz Zaborski 
630347a39b4SMariusz Zaborski 	key = "nvl/fd";
631347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
632347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
633347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
634347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
635347a39b4SMariusz Zaborski 
636347a39b4SMariusz Zaborski 	count = 50;
637347a39b4SMariusz Zaborski 	testfd = (int*)malloc(sizeof(*testfd) * count);
638347a39b4SMariusz Zaborski 	ATF_REQUIRE(testfd != NULL);
639347a39b4SMariusz Zaborski 	for (i = 0; i < count; i++) {
640347a39b4SMariusz Zaborski 		testfd[i] = dup(STDERR_FILENO);
641347a39b4SMariusz Zaborski 		ATF_REQUIRE(fd_is_valid(testfd[i]));
642347a39b4SMariusz Zaborski 	}
643347a39b4SMariusz Zaborski 
644347a39b4SMariusz Zaborski 	nvlist_move_descriptor_array(nvl, key, testfd, count);
645347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
646347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
647347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
648347a39b4SMariusz Zaborski 
6498d86e318SEnji Cooper 	const_result = nvlist_get_descriptor_array(nvl, key, &num_items);
6508d86e318SEnji Cooper 	ATF_REQUIRE_EQ(num_items, count);
651347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
652347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result == testfd);
6538d86e318SEnji Cooper 	for (i = 0; i < num_items; i++)
654347a39b4SMariusz Zaborski 		ATF_REQUIRE(fd_is_valid(const_result[i]));
655347a39b4SMariusz Zaborski 
656347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
657347a39b4SMariusz Zaborski }
658347a39b4SMariusz Zaborski 
659347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_arrays__error_null);
660347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_arrays__error_null)
661347a39b4SMariusz Zaborski {
662347a39b4SMariusz Zaborski 	nvlist_t *nvl;
663347a39b4SMariusz Zaborski 
664347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
665347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
666347a39b4SMariusz Zaborski 	nvlist_add_number_array(nvl, "nvl/number", NULL, 0);
667347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
668347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
669347a39b4SMariusz Zaborski 
670347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
671347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
672347a39b4SMariusz Zaborski 	nvlist_move_number_array(nvl, "nvl/number", NULL, 0);
673347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
674347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
675347a39b4SMariusz Zaborski 
676347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
677347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
678347a39b4SMariusz Zaborski 	nvlist_add_descriptor_array(nvl, "nvl/fd", NULL, 0);
679347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
680347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
681347a39b4SMariusz Zaborski 
682347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
683347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
684347a39b4SMariusz Zaborski 	nvlist_move_descriptor_array(nvl, "nvl/fd", NULL, 0);
685347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
686347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
687347a39b4SMariusz Zaborski 
688347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
689347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
690347a39b4SMariusz Zaborski 	nvlist_add_string_array(nvl, "nvl/string", NULL, 0);
691347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
692347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
693347a39b4SMariusz Zaborski 
694347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
695347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
696347a39b4SMariusz Zaborski 	nvlist_move_string_array(nvl, "nvl/string", NULL, 0);
697347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
698347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
699347a39b4SMariusz Zaborski 
700347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
701347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
702347a39b4SMariusz Zaborski 	nvlist_add_nvlist_array(nvl, "nvl/nvlist", NULL, 0);
703347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
704347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
705347a39b4SMariusz Zaborski 
706347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
707347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
708347a39b4SMariusz Zaborski 	nvlist_move_nvlist_array(nvl, "nvl/nvlist", NULL, 0);
709347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
710347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
711347a39b4SMariusz Zaborski 
712347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
713347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
714347a39b4SMariusz Zaborski 	nvlist_add_bool_array(nvl, "nvl/bool", NULL, 0);
715347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
716347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
717347a39b4SMariusz Zaborski 
718347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
719347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
720347a39b4SMariusz Zaborski 	nvlist_move_bool_array(nvl, "nvl/bool", NULL, 0);
721347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
722347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
723347a39b4SMariusz Zaborski }
724347a39b4SMariusz Zaborski 
725347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_arrays__bad_value);
726347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_arrays__bad_value)
727347a39b4SMariusz Zaborski {
728347a39b4SMariusz Zaborski 	nvlist_t *nvl, *nvladd[1], **nvlmove;
729347a39b4SMariusz Zaborski 	int fdadd[1], *fdmove;
730347a39b4SMariusz Zaborski 
731347a39b4SMariusz Zaborski 	nvladd[0] = NULL;
732347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
733347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
734347a39b4SMariusz Zaborski 	nvlist_add_nvlist_array(nvl, "nvl/nvlist", nvladd, 1);
735347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
736347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
737347a39b4SMariusz Zaborski 
738347a39b4SMariusz Zaborski 	nvlmove = (nvlist_t**)malloc(sizeof(*nvlmove));
739347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlmove != NULL);
740347a39b4SMariusz Zaborski 	nvlmove[0] = NULL;
741347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
742347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
743347a39b4SMariusz Zaborski 	nvlist_move_nvlist_array(nvl, "nvl/nvlist", nvlmove, 1);
744347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
745347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
746347a39b4SMariusz Zaborski 
747347a39b4SMariusz Zaborski 	fdadd[0] = -2;
748347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
749347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
750347a39b4SMariusz Zaborski 	nvlist_add_descriptor_array(nvl, "nvl/fd", fdadd, 1);
751347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
752347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
753347a39b4SMariusz Zaborski 
754347a39b4SMariusz Zaborski 	fdmove = (int*)malloc(sizeof(*fdmove));
755347a39b4SMariusz Zaborski 	ATF_REQUIRE(fdmove != NULL);
756347a39b4SMariusz Zaborski 	fdmove[0] = -2;
757347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
758347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
759347a39b4SMariusz Zaborski 	nvlist_move_descriptor_array(nvl, "nvl/fd", fdmove, 1);
760347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) != 0);
761347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
762347a39b4SMariusz Zaborski }
763347a39b4SMariusz Zaborski 
764347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_nvlist_array__travel);
765347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_nvlist_array__travel)
766347a39b4SMariusz Zaborski {
767347a39b4SMariusz Zaborski 	nvlist_t *nvl, *test[5], *nasted;
768347a39b4SMariusz Zaborski 	const nvlist_t *travel;
769347a39b4SMariusz Zaborski 	const char *name;
770e02f530eSEnji Cooper 	void *cookie;
771e02f530eSEnji Cooper 	int type;
772e02f530eSEnji Cooper 	unsigned int i, index;
773347a39b4SMariusz Zaborski 
774e02f530eSEnji Cooper 	for (i = 0; i < nitems(test); i++) {
775347a39b4SMariusz Zaborski 		test[i] = nvlist_create(0);
776347a39b4SMariusz Zaborski 		ATF_REQUIRE(test[i] != NULL);
777347a39b4SMariusz Zaborski 		nvlist_add_number(test[i], "nvl/number", i);
778347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_error(test[i]) == 0);
779347a39b4SMariusz Zaborski 	}
780347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
781347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
782e02f530eSEnji Cooper 	nvlist_add_nvlist_array(nvl, "nvl/nvlist_array", test, nitems(test));
783347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) == 0);
784347a39b4SMariusz Zaborski 	nasted = nvlist_create(0);
785347a39b4SMariusz Zaborski 	ATF_REQUIRE(nasted != NULL);
786e02f530eSEnji Cooper 	nvlist_add_nvlist_array(nasted, "nvl/nvl/nvlist_array", test,
787e02f530eSEnji Cooper 	    nitems(test));
788347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nasted) == 0);
789347a39b4SMariusz Zaborski 	nvlist_move_nvlist(nvl, "nvl/nvl", nasted);
790347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) == 0);
791347a39b4SMariusz Zaborski 	nvlist_add_string(nvl, "nvl/string", "END");
792347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) == 0);
793347a39b4SMariusz Zaborski 
794347a39b4SMariusz Zaborski 	cookie = NULL;
795347a39b4SMariusz Zaborski 	index = 0;
796347a39b4SMariusz Zaborski 	travel = nvl;
797347a39b4SMariusz Zaborski 	do {
798347a39b4SMariusz Zaborski 		while ((name = nvlist_next(travel, &type, &cookie)) != NULL) {
799347a39b4SMariusz Zaborski 			if (index == 0) {
800347a39b4SMariusz Zaborski 				ATF_REQUIRE(type == NV_TYPE_NVLIST_ARRAY);
801e02f530eSEnji Cooper 			} else if (index >= 1 && index <= nitems(test)) {
802347a39b4SMariusz Zaborski 				ATF_REQUIRE(type == NV_TYPE_NUMBER);
803e02f530eSEnji Cooper 			} else if (index == nitems(test) + 1) {
804347a39b4SMariusz Zaborski 				ATF_REQUIRE(type == NV_TYPE_NVLIST);
805e02f530eSEnji Cooper 			} else if (index == nitems(test) + 2) {
806347a39b4SMariusz Zaborski 				ATF_REQUIRE(type == NV_TYPE_NVLIST_ARRAY);
807e02f530eSEnji Cooper 			} else if (index >= nitems(test) + 3 &&
808e02f530eSEnji Cooper 				   index <= 2 * nitems(test) + 2) {
809347a39b4SMariusz Zaborski 				ATF_REQUIRE(type == NV_TYPE_NUMBER);
810e02f530eSEnji Cooper 			} else if (index == 2 * nitems(test) + 3) {
811347a39b4SMariusz Zaborski 				ATF_REQUIRE(type == NV_TYPE_STRING);
812347a39b4SMariusz Zaborski 			}
813347a39b4SMariusz Zaborski 
814347a39b4SMariusz Zaborski 			if (type == NV_TYPE_NVLIST) {
815347a39b4SMariusz Zaborski 				travel = nvlist_get_nvlist(travel, name);
816347a39b4SMariusz Zaborski 				cookie = NULL;
817347a39b4SMariusz Zaborski 			} else if (type == NV_TYPE_NVLIST_ARRAY) {
818347a39b4SMariusz Zaborski 				travel = nvlist_get_nvlist_array(travel, name,
819347a39b4SMariusz Zaborski 				    NULL)[0];
820347a39b4SMariusz Zaborski 				cookie = NULL;
821347a39b4SMariusz Zaborski 			}
822347a39b4SMariusz Zaborski 			index ++;
823347a39b4SMariusz Zaborski 		}
824347a39b4SMariusz Zaborski 	} while ((travel = nvlist_get_pararr(travel, &cookie)) != NULL);
825347a39b4SMariusz Zaborski 
826e02f530eSEnji Cooper 	for (i = 0; i < nitems(test); i++)
827347a39b4SMariusz Zaborski 		nvlist_destroy(test[i]);
828347a39b4SMariusz Zaborski 
829347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
830347a39b4SMariusz Zaborski }
831347a39b4SMariusz Zaborski 
832347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_nvlist_array__travel_alternative);
833347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_nvlist_array__travel_alternative)
834347a39b4SMariusz Zaborski {
835347a39b4SMariusz Zaborski 	nvlist_t *nvl, *test[5], *nasted;
836347a39b4SMariusz Zaborski 	const nvlist_t *travel, *tmp;
837347a39b4SMariusz Zaborski 	void *cookie;
838347a39b4SMariusz Zaborski 	int index, i, type;
839347a39b4SMariusz Zaborski 	const char *name;
840347a39b4SMariusz Zaborski 
841347a39b4SMariusz Zaborski 	for (i = 0; i < 5; i++) {
842347a39b4SMariusz Zaborski 		test[i] = nvlist_create(0);
843347a39b4SMariusz Zaborski 		ATF_REQUIRE(test[i] != NULL);
844347a39b4SMariusz Zaborski 		nvlist_add_number(test[i], "nvl/number", i);
845347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_error(test[i]) == 0);
846347a39b4SMariusz Zaborski 	}
847347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
848347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
849347a39b4SMariusz Zaborski 	nvlist_add_nvlist_array(nvl, "nvl/nvlist_array", test, 5);
850347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) == 0);
851347a39b4SMariusz Zaborski 	nasted = nvlist_create(0);
852347a39b4SMariusz Zaborski 	ATF_REQUIRE(nasted != NULL);
853347a39b4SMariusz Zaborski 	nvlist_add_nvlist_array(nasted, "nvl/nvl/nvlist_array", test, 5);
854347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nasted) == 0);
855347a39b4SMariusz Zaborski 	nvlist_move_nvlist(nvl, "nvl/nvl", nasted);
856347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) == 0);
857347a39b4SMariusz Zaborski 	nvlist_add_string(nvl, "nvl/string", "END");
858347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_error(nvl) == 0);
859347a39b4SMariusz Zaborski 
860347a39b4SMariusz Zaborski 	cookie = NULL;
861347a39b4SMariusz Zaborski 	index = 0;
862347a39b4SMariusz Zaborski 	tmp = travel = nvl;
863347a39b4SMariusz Zaborski 	do {
864347a39b4SMariusz Zaborski 		do {
865347a39b4SMariusz Zaborski 			travel = tmp;
866347a39b4SMariusz Zaborski 			while ((name = nvlist_next(travel, &type, &cookie)) !=
867347a39b4SMariusz Zaborski 			    NULL) {
868347a39b4SMariusz Zaborski 				if (index == 0) {
869347a39b4SMariusz Zaborski 					ATF_REQUIRE(type ==
870347a39b4SMariusz Zaborski 					    NV_TYPE_NVLIST_ARRAY);
871347a39b4SMariusz Zaborski 				} else if (index >= 1 && index <= 5) {
872347a39b4SMariusz Zaborski 					ATF_REQUIRE(type == NV_TYPE_NUMBER);
873347a39b4SMariusz Zaborski 				} else if (index == 6) {
874347a39b4SMariusz Zaborski 					ATF_REQUIRE(type == NV_TYPE_NVLIST);
875347a39b4SMariusz Zaborski 				} else if (index == 7) {
876347a39b4SMariusz Zaborski 					ATF_REQUIRE(type ==
877347a39b4SMariusz Zaborski 					    NV_TYPE_NVLIST_ARRAY);
878347a39b4SMariusz Zaborski 				} else if (index >= 8 && index <= 12) {
879347a39b4SMariusz Zaborski 					ATF_REQUIRE(type == NV_TYPE_NUMBER);
880347a39b4SMariusz Zaborski 				} else if (index == 13) {
881347a39b4SMariusz Zaborski 					ATF_REQUIRE(type == NV_TYPE_STRING);
882347a39b4SMariusz Zaborski 				}
883347a39b4SMariusz Zaborski 
884347a39b4SMariusz Zaborski 				if (type == NV_TYPE_NVLIST) {
885347a39b4SMariusz Zaborski 					travel = nvlist_get_nvlist(travel,
886347a39b4SMariusz Zaborski 					    name);
887347a39b4SMariusz Zaborski 					cookie = NULL;
888347a39b4SMariusz Zaborski 				} else if (type == NV_TYPE_NVLIST_ARRAY) {
889347a39b4SMariusz Zaborski 					travel = nvlist_get_nvlist_array(travel,
890347a39b4SMariusz Zaborski 					    name, NULL)[0];
891347a39b4SMariusz Zaborski 					cookie = NULL;
892347a39b4SMariusz Zaborski 				}
893347a39b4SMariusz Zaborski 				index ++;
894347a39b4SMariusz Zaborski 			}
895347a39b4SMariusz Zaborski 			cookie = NULL;
896347a39b4SMariusz Zaborski 		} while ((tmp = nvlist_get_array_next(travel)) != NULL);
897347a39b4SMariusz Zaborski 	} while ((tmp = nvlist_get_parent(travel, &cookie)) != NULL);
898347a39b4SMariusz Zaborski 
899347a39b4SMariusz Zaborski 	for (i = 0; i < 5; i++)
900347a39b4SMariusz Zaborski 		nvlist_destroy(test[i]);
901347a39b4SMariusz Zaborski 
902347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
903347a39b4SMariusz Zaborski }
904347a39b4SMariusz Zaborski 
905347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_bool_array__pack);
906347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_bool_array__pack)
907347a39b4SMariusz Zaborski {
908347a39b4SMariusz Zaborski 	nvlist_t *nvl, *unpacked;
909347a39b4SMariusz Zaborski 	const char *key;
910347a39b4SMariusz Zaborski 	size_t packed_size, count;
911347a39b4SMariusz Zaborski 	void *packed;
912347a39b4SMariusz Zaborski 	unsigned int i;
913347a39b4SMariusz Zaborski 	const bool *const_result;
914347a39b4SMariusz Zaborski 	bool testbool[16];
915347a39b4SMariusz Zaborski 
916e02f530eSEnji Cooper 	for (i = 0; i < nitems(testbool); i++)
917347a39b4SMariusz Zaborski 		testbool[i] = (i % 2 == 0);
918347a39b4SMariusz Zaborski 
919347a39b4SMariusz Zaborski 	key = "nvl/bool";
920347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
921347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
922347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
923347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
924347a39b4SMariusz Zaborski 
925e02f530eSEnji Cooper 	nvlist_add_bool_array(nvl, key, testbool, nitems(testbool));
926347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
927347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
928347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
929347a39b4SMariusz Zaborski 
930347a39b4SMariusz Zaborski 	packed = nvlist_pack(nvl, &packed_size);
931347a39b4SMariusz Zaborski 	ATF_REQUIRE(packed != NULL);
932347a39b4SMariusz Zaborski 
933347a39b4SMariusz Zaborski 	unpacked = nvlist_unpack(packed, packed_size, 0);
934347a39b4SMariusz Zaborski 	ATF_REQUIRE(unpacked != NULL);
935347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(unpacked), 0);
936347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_bool_array(unpacked, key));
937347a39b4SMariusz Zaborski 
938347a39b4SMariusz Zaborski 	const_result = nvlist_get_bool_array(unpacked, key, &count);
939e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(count, nitems(testbool));
940347a39b4SMariusz Zaborski 	for (i = 0; i < count; i++) {
941347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(testbool[i], const_result[i]);
942347a39b4SMariusz Zaborski 	}
943347a39b4SMariusz Zaborski 
944347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
945347a39b4SMariusz Zaborski 	nvlist_destroy(unpacked);
946347a39b4SMariusz Zaborski 	free(packed);
947347a39b4SMariusz Zaborski }
948347a39b4SMariusz Zaborski 
949347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_number_array__pack);
950347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_number_array__pack)
951347a39b4SMariusz Zaborski {
952347a39b4SMariusz Zaborski 	nvlist_t *nvl, *unpacked;
953347a39b4SMariusz Zaborski 	const char *key;
954347a39b4SMariusz Zaborski 	size_t packed_size, count;
955347a39b4SMariusz Zaborski 	void *packed;
956347a39b4SMariusz Zaborski 	unsigned int i;
957347a39b4SMariusz Zaborski 	const uint64_t *const_result;
958347a39b4SMariusz Zaborski 	const uint64_t number[8] = { 0, UINT_MAX, 7, 123, 90,
959347a39b4SMariusz Zaborski 	    100000, 8, 1 };
960347a39b4SMariusz Zaborski 
961347a39b4SMariusz Zaborski 	key = "nvl/number";
962347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
963347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
964347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
965347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
966347a39b4SMariusz Zaborski 
967347a39b4SMariusz Zaborski 	nvlist_add_number_array(nvl, key, number, 8);
968347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
969347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
970347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_number_array(nvl, key));
971347a39b4SMariusz Zaborski 
972347a39b4SMariusz Zaborski 	packed = nvlist_pack(nvl, &packed_size);
973347a39b4SMariusz Zaborski 	ATF_REQUIRE(packed != NULL);
974347a39b4SMariusz Zaborski 
975347a39b4SMariusz Zaborski 	unpacked = nvlist_unpack(packed, packed_size, 0);
976347a39b4SMariusz Zaborski 	ATF_REQUIRE(unpacked != NULL);
977347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(unpacked), 0);
978347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_number_array(unpacked, key));
979347a39b4SMariusz Zaborski 
980347a39b4SMariusz Zaborski 	const_result = nvlist_get_number_array(unpacked, key, &count);
981e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(count, nitems(number));
982347a39b4SMariusz Zaborski 	for (i = 0; i < count; i++) {
983347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(number[i], const_result[i]);
984347a39b4SMariusz Zaborski 	}
985347a39b4SMariusz Zaborski 
986347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
987347a39b4SMariusz Zaborski 	nvlist_destroy(unpacked);
988347a39b4SMariusz Zaborski 	free(packed);
989347a39b4SMariusz Zaborski }
990347a39b4SMariusz Zaborski 
991347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_descriptor_array__pack);
992347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_descriptor_array__pack)
993347a39b4SMariusz Zaborski {
994347a39b4SMariusz Zaborski 	nvlist_t *nvl;
995347a39b4SMariusz Zaborski 	const char *key;
9968d86e318SEnji Cooper 	size_t num_items;
997347a39b4SMariusz Zaborski 	unsigned int i;
998347a39b4SMariusz Zaborski 	const int *const_result;
999347a39b4SMariusz Zaborski 	int desc[32], fd, socks[2];
1000347a39b4SMariusz Zaborski 	pid_t pid;
1001347a39b4SMariusz Zaborski 
1002347a39b4SMariusz Zaborski 	key = "nvl/descriptor";
1003347a39b4SMariusz Zaborski 
1004347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(socketpair(PF_UNIX, SOCK_STREAM, 0, socks), 0);
1005347a39b4SMariusz Zaborski 
1006347a39b4SMariusz Zaborski 	pid = atf::utils::fork();
1007347a39b4SMariusz Zaborski 	ATF_REQUIRE(pid >= 0);
1008347a39b4SMariusz Zaborski 	if (pid == 0) {
1009347a39b4SMariusz Zaborski 		/* Child. */
1010347a39b4SMariusz Zaborski 		fd = socks[0];
1011347a39b4SMariusz Zaborski 		close(socks[1]);
1012e02f530eSEnji Cooper 		for (i = 0; i < nitems(desc); i++) {
1013347a39b4SMariusz Zaborski 			desc[i] = dup(STDERR_FILENO);
1014347a39b4SMariusz Zaborski 			ATF_REQUIRE(fd_is_valid(desc[i]));
1015347a39b4SMariusz Zaborski 		}
1016347a39b4SMariusz Zaborski 
1017347a39b4SMariusz Zaborski 		nvl = nvlist_create(0);
1018347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvl != NULL);
1019347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_empty(nvl));
1020347a39b4SMariusz Zaborski 		ATF_REQUIRE(!nvlist_exists_descriptor_array(nvl, key));
1021347a39b4SMariusz Zaborski 
1022e02f530eSEnji Cooper 		nvlist_add_descriptor_array(nvl, key, desc, nitems(desc));
1023347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1024347a39b4SMariusz Zaborski 		ATF_REQUIRE(!nvlist_empty(nvl));
1025347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
1026347a39b4SMariusz Zaborski 
1027347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_send(fd, nvl) >= 0);
1028347a39b4SMariusz Zaborski 
1029e02f530eSEnji Cooper 		for (i = 0; i < nitems(desc); i++)
1030347a39b4SMariusz Zaborski 			close(desc[i]);
1031347a39b4SMariusz Zaborski 	} else {
1032347a39b4SMariusz Zaborski 		/* Parent */
1033347a39b4SMariusz Zaborski 		fd = socks[1];
1034347a39b4SMariusz Zaborski 		close(socks[0]);
1035347a39b4SMariusz Zaborski 
1036347a39b4SMariusz Zaborski 		errno = 0;
1037347a39b4SMariusz Zaborski 		nvl = nvlist_recv(fd, 0);
1038347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvl != NULL);
1039347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1040347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
1041347a39b4SMariusz Zaborski 
10428d86e318SEnji Cooper 		const_result = nvlist_get_descriptor_array(nvl, key, &num_items);
1043347a39b4SMariusz Zaborski 		ATF_REQUIRE(const_result != NULL);
1044e02f530eSEnji Cooper 		ATF_REQUIRE_EQ(num_items, nitems(desc));
10458d86e318SEnji Cooper 		for (i = 0; i < num_items; i++)
1046347a39b4SMariusz Zaborski 			ATF_REQUIRE(fd_is_valid(const_result[i]));
1047347a39b4SMariusz Zaborski 
1048347a39b4SMariusz Zaborski 		atf::utils::wait(pid, 0, "", "");
1049347a39b4SMariusz Zaborski 	}
1050347a39b4SMariusz Zaborski 
1051347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
1052347a39b4SMariusz Zaborski 	close(fd);
1053347a39b4SMariusz Zaborski }
1054347a39b4SMariusz Zaborski 
1055347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_string_array__pack);
1056347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_string_array__pack)
1057347a39b4SMariusz Zaborski {
1058347a39b4SMariusz Zaborski 	nvlist_t *nvl, *unpacked;
1059347a39b4SMariusz Zaborski 	const char *key;
1060347a39b4SMariusz Zaborski 	size_t packed_size, count;
1061347a39b4SMariusz Zaborski 	void *packed;
1062347a39b4SMariusz Zaborski 	unsigned int i;
1063347a39b4SMariusz Zaborski 	const char * const *const_result;
1064bd7f70daSEnji Cooper 	const char *string_arr[8] = { "a", "b", "kot", "foo",
1065347a39b4SMariusz Zaborski 	    "tests", "nice test", "", "abcdef" };
1066347a39b4SMariusz Zaborski 
1067347a39b4SMariusz Zaborski 	key = "nvl/string";
1068347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
1069347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
1070347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
1071347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
1072347a39b4SMariusz Zaborski 
1073e02f530eSEnji Cooper 	nvlist_add_string_array(nvl, key, string_arr, nitems(string_arr));
1074347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1075347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
1076347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
1077347a39b4SMariusz Zaborski 
1078347a39b4SMariusz Zaborski 	packed = nvlist_pack(nvl, &packed_size);
1079347a39b4SMariusz Zaborski 	ATF_REQUIRE(packed != NULL);
1080347a39b4SMariusz Zaborski 
1081347a39b4SMariusz Zaborski 	unpacked = nvlist_unpack(packed, packed_size, 0);
1082347a39b4SMariusz Zaborski 	ATF_REQUIRE(unpacked != NULL);
1083347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(unpacked), 0);
1084347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_string_array(unpacked, key));
1085347a39b4SMariusz Zaborski 
1086347a39b4SMariusz Zaborski 	const_result = nvlist_get_string_array(unpacked, key, &count);
1087e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(count, nitems(string_arr));
1088347a39b4SMariusz Zaborski 	for (i = 0; i < count; i++) {
1089bd7f70daSEnji Cooper 		ATF_REQUIRE_EQ(strcmp(string_arr[i], const_result[i]), 0);
1090347a39b4SMariusz Zaborski 	}
1091347a39b4SMariusz Zaborski 
1092347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
1093347a39b4SMariusz Zaborski 	nvlist_destroy(unpacked);
1094347a39b4SMariusz Zaborski 	free(packed);
1095347a39b4SMariusz Zaborski }
1096347a39b4SMariusz Zaborski 
1097347a39b4SMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_nvlist_array__pack);
1098347a39b4SMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_nvlist_array__pack)
1099347a39b4SMariusz Zaborski {
1100347a39b4SMariusz Zaborski 	nvlist_t *testnvl[8], *unpacked;
1101347a39b4SMariusz Zaborski 	const nvlist_t * const *const_result;
1102347a39b4SMariusz Zaborski 	nvlist_t *nvl;
11038d86e318SEnji Cooper 	size_t num_items, packed_size;
1104347a39b4SMariusz Zaborski 	unsigned int i;
1105347a39b4SMariusz Zaborski 	void *packed;
1106347a39b4SMariusz Zaborski 	const char *somestr[8] = { "a", "b", "c", "d", "e", "f", "g", "h" };
1107347a39b4SMariusz Zaborski 	const char *key;
1108347a39b4SMariusz Zaborski 
1109e02f530eSEnji Cooper 	for (i = 0; i < nitems(testnvl); i++) {
1110347a39b4SMariusz Zaborski 		testnvl[i] = nvlist_create(0);
1111347a39b4SMariusz Zaborski 		ATF_REQUIRE(testnvl[i] != NULL);
1112347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
1113347a39b4SMariusz Zaborski 		nvlist_add_string(testnvl[i], "nvl/string", somestr[i]);
1114347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
1115347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_exists_string(testnvl[i], "nvl/string"));
1116347a39b4SMariusz Zaborski 	}
1117347a39b4SMariusz Zaborski 
1118347a39b4SMariusz Zaborski 	key = "nvl/nvlist";
1119347a39b4SMariusz Zaborski 	nvl = nvlist_create(0);
1120347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvl != NULL);
1121347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_empty(nvl));
1122347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
1123347a39b4SMariusz Zaborski 
1124347a39b4SMariusz Zaborski 	nvlist_add_nvlist_array(nvl, key, (const nvlist_t * const *)testnvl, 8);
1125347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1126347a39b4SMariusz Zaborski 	ATF_REQUIRE(!nvlist_empty(nvl));
1127347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, key));
1128347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, "nvl/nvlist"));
1129347a39b4SMariusz Zaborski 	packed = nvlist_pack(nvl, &packed_size);
1130347a39b4SMariusz Zaborski 	ATF_REQUIRE(packed != NULL);
1131347a39b4SMariusz Zaborski 
1132347a39b4SMariusz Zaborski 	unpacked = nvlist_unpack(packed, packed_size, 0);
1133347a39b4SMariusz Zaborski 	ATF_REQUIRE(unpacked != NULL);
1134347a39b4SMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(unpacked), 0);
1135347a39b4SMariusz Zaborski 	ATF_REQUIRE(nvlist_exists_nvlist_array(unpacked, key));
1136347a39b4SMariusz Zaborski 
11378d86e318SEnji Cooper 	const_result = nvlist_get_nvlist_array(unpacked, key, &num_items);
1138347a39b4SMariusz Zaborski 	ATF_REQUIRE(const_result != NULL);
1139e02f530eSEnji Cooper 	ATF_REQUIRE_EQ(num_items, nitems(testnvl));
11408d86e318SEnji Cooper 	for (i = 0; i < num_items; i++) {
1141347a39b4SMariusz Zaborski 		ATF_REQUIRE_EQ(nvlist_error(const_result[i]), 0);
11428d86e318SEnji Cooper 		if (i < num_items - 1) {
1143347a39b4SMariusz Zaborski 			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
1144347a39b4SMariusz Zaborski 			    const_result[i + 1]);
1145347a39b4SMariusz Zaborski 		} else {
1146347a39b4SMariusz Zaborski 			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
1147347a39b4SMariusz Zaborski 			    NULL);
1148347a39b4SMariusz Zaborski 		}
1149347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_get_parent(const_result[i], NULL) == unpacked);
1150347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_in_array(const_result[i]));
1151347a39b4SMariusz Zaborski 		ATF_REQUIRE(nvlist_exists_string(const_result[i],
1152347a39b4SMariusz Zaborski 		    "nvl/string"));
1153347a39b4SMariusz Zaborski 		ATF_REQUIRE(strcmp(nvlist_get_string(const_result[i],
1154347a39b4SMariusz Zaborski 		    "nvl/string"), somestr[i]) == 0);
1155347a39b4SMariusz Zaborski 	}
1156347a39b4SMariusz Zaborski 
1157e02f530eSEnji Cooper 	for (i = 0; i < nitems(testnvl); i++)
1158347a39b4SMariusz Zaborski 		nvlist_destroy(testnvl[i]);
1159347a39b4SMariusz Zaborski 	nvlist_destroy(nvl);
1160347a39b4SMariusz Zaborski 	nvlist_destroy(unpacked);
1161347a39b4SMariusz Zaborski 	free(packed);
1162347a39b4SMariusz Zaborski }
1163347a39b4SMariusz Zaborski 
1164*2981431eSMariusz Zaborski 
1165*2981431eSMariusz Zaborski ATF_TEST_CASE_WITHOUT_HEAD(nvlist_string_array_nonull__pack);
1166*2981431eSMariusz Zaborski ATF_TEST_CASE_BODY(nvlist_string_array_nonull__pack)
1167*2981431eSMariusz Zaborski {
1168*2981431eSMariusz Zaborski 	nvlist_t *testnvl, *unpacked;
1169*2981431eSMariusz Zaborski 	const char *somestr[3] = { "a", "b", "XXX" };
1170*2981431eSMariusz Zaborski 	uint8_t *packed, *twopages, *dataptr, *secondpage;
1171*2981431eSMariusz Zaborski 	size_t packed_size, page_size;
1172*2981431eSMariusz Zaborski 	bool found;
1173*2981431eSMariusz Zaborski 
1174*2981431eSMariusz Zaborski 	page_size = sysconf(_SC_PAGESIZE);
1175*2981431eSMariusz Zaborski 	testnvl = nvlist_create(0);
1176*2981431eSMariusz Zaborski 	ATF_REQUIRE(testnvl != NULL);
1177*2981431eSMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(testnvl), 0);
1178*2981431eSMariusz Zaborski 	nvlist_add_string_array(testnvl, "nvl/string", somestr,
1179*2981431eSMariusz Zaborski 	    nitems(somestr));
1180*2981431eSMariusz Zaborski 	ATF_REQUIRE_EQ(nvlist_error(testnvl), 0);
1181*2981431eSMariusz Zaborski 
1182*2981431eSMariusz Zaborski 	packed = (uint8_t *)nvlist_pack(testnvl, &packed_size);
1183*2981431eSMariusz Zaborski 	ATF_REQUIRE(packed != NULL);
1184*2981431eSMariusz Zaborski 
1185*2981431eSMariusz Zaborski 	twopages = (uint8_t *)mmap(NULL, page_size * 2, PROT_READ | PROT_WRITE,
1186*2981431eSMariusz Zaborski 	    MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1187*2981431eSMariusz Zaborski 	ATF_REQUIRE(twopages != MAP_FAILED);
1188*2981431eSMariusz Zaborski 	dataptr = &twopages[page_size - packed_size];
1189*2981431eSMariusz Zaborski 	secondpage = &twopages[page_size];
1190*2981431eSMariusz Zaborski 
1191*2981431eSMariusz Zaborski 	memset(twopages, 'A', page_size * 2);
1192*2981431eSMariusz Zaborski 
1193*2981431eSMariusz Zaborski 	mprotect(secondpage, page_size, PROT_NONE);
1194*2981431eSMariusz Zaborski 	memcpy(dataptr, packed, packed_size);
1195*2981431eSMariusz Zaborski 
1196*2981431eSMariusz Zaborski 	found = false;
1197*2981431eSMariusz Zaborski 	for (size_t i = 0; i < packed_size - 3; i++) {
1198*2981431eSMariusz Zaborski 		if (dataptr[i] == 'X' && dataptr[i + 1] == 'X' &&
1199*2981431eSMariusz Zaborski 		    dataptr[i + 2] == 'X' && dataptr[i + 3] == '\0') {
1200*2981431eSMariusz Zaborski 			dataptr[i + 3] = 'X';
1201*2981431eSMariusz Zaborski 			found = true;
1202*2981431eSMariusz Zaborski 			break;
1203*2981431eSMariusz Zaborski 		}
1204*2981431eSMariusz Zaborski 	}
1205*2981431eSMariusz Zaborski 	ATF_REQUIRE(found == true);
1206*2981431eSMariusz Zaborski 
1207*2981431eSMariusz Zaborski 	unpacked = nvlist_unpack(dataptr, packed_size, 0);
1208*2981431eSMariusz Zaborski 	ATF_REQUIRE(unpacked == NULL);
1209*2981431eSMariusz Zaborski 
1210*2981431eSMariusz Zaborski 	nvlist_destroy(testnvl);
1211*2981431eSMariusz Zaborski 	free(packed);
1212*2981431eSMariusz Zaborski 	munmap(twopages, page_size * 2);
1213*2981431eSMariusz Zaborski }
1214*2981431eSMariusz Zaborski 
1215*2981431eSMariusz Zaborski 
1216347a39b4SMariusz Zaborski ATF_INIT_TEST_CASES(tp)
1217347a39b4SMariusz Zaborski {
1218347a39b4SMariusz Zaborski 
1219347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_bool_array__basic);
1220347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_string_array__basic);
1221347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_descriptor_array__basic);
1222347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_number_array__basic);
1223347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_nvlist_array__basic)
1224347a39b4SMariusz Zaborski 
1225347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_clone_array)
1226347a39b4SMariusz Zaborski 
1227347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_bool_array__move);
1228347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_string_array__move);
1229347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_nvlist_array__move);
1230347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_number_array__move);
1231347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_descriptor_array__move);
1232347a39b4SMariusz Zaborski 
1233347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_arrays__error_null);
1234347a39b4SMariusz Zaborski 
1235347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_arrays__bad_value)
1236347a39b4SMariusz Zaborski 
1237347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_nvlist_array__travel)
1238347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_nvlist_array__travel_alternative)
1239347a39b4SMariusz Zaborski 
1240347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_bool_array__pack)
1241347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_number_array__pack)
1242347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_descriptor_array__pack)
1243347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_string_array__pack)
1244347a39b4SMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_nvlist_array__pack)
1245*2981431eSMariusz Zaborski 
1246*2981431eSMariusz Zaborski 	ATF_ADD_TEST_CASE(tp, nvlist_string_array_nonull__pack)
1247347a39b4SMariusz Zaborski }
1248347a39b4SMariusz Zaborski 
1249