1286796Soshogbo/*-
2286796Soshogbo * Copyright (c) 2015 Mariusz Zaborski <oshogbo@FreeBSD.org>
3286796Soshogbo * All rights reserved.
4286796Soshogbo *
5286796Soshogbo * Redistribution and use in source and binary forms, with or without
6286796Soshogbo * modification, are permitted provided that the following conditions
7286796Soshogbo * are met:
8286796Soshogbo * 1. Redistributions of source code must retain the above copyright
9286796Soshogbo *    notice, this list of conditions and the following disclaimer.
10286796Soshogbo * 2. Redistributions in binary form must reproduce the above copyright
11286796Soshogbo *    notice, this list of conditions and the following disclaimer in the
12286796Soshogbo *    documentation and/or other materials provided with the distribution.
13286796Soshogbo *
14286796Soshogbo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15286796Soshogbo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16286796Soshogbo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17286796Soshogbo * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18286796Soshogbo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19286796Soshogbo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20286796Soshogbo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21286796Soshogbo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22286796Soshogbo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23286796Soshogbo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24286796Soshogbo * SUCH DAMAGE.
25286796Soshogbo */
26286796Soshogbo
27286796Soshogbo#include <sys/cdefs.h>
28286796Soshogbo__FBSDID("$FreeBSD: stable/11/lib/libnv/tests/nv_array_tests.cc 336346 2018-07-16 15:02:21Z kevans $");
29286796Soshogbo
30293134Sngie#include <sys/param.h>
31293134Sngie#include <sys/types.h>
32286796Soshogbo#include <sys/nv.h>
33286796Soshogbo#include <sys/socket.h>
34286796Soshogbo
35286796Soshogbo#include <atf-c++.hpp>
36286796Soshogbo
37286796Soshogbo#include <cstdio>
38286796Soshogbo#include <errno.h>
39286796Soshogbo#include <fcntl.h>
40286796Soshogbo#include <limits>
41286796Soshogbo#include <set>
42286796Soshogbo#include <sstream>
43286796Soshogbo#include <string>
44286796Soshogbo
45286796Soshogbo#define fd_is_valid(fd) (fcntl((fd), F_GETFL) != -1 || errno != EBADF)
46286796Soshogbo
47286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_bool_array__basic);
48286796SoshogboATF_TEST_CASE_BODY(nvlist_bool_array__basic)
49286796Soshogbo{
50286796Soshogbo	bool testbool[16];
51286796Soshogbo	const bool *const_result;
52286796Soshogbo	bool *result;
53286796Soshogbo	nvlist_t *nvl;
54293130Sngie	size_t num_items;
55286796Soshogbo	unsigned int i;
56286796Soshogbo	const char *key;
57286796Soshogbo
58286796Soshogbo	key = "nvl/bool";
59286796Soshogbo	nvl = nvlist_create(0);
60286796Soshogbo	ATF_REQUIRE(nvl != NULL);
61286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
62286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
63286796Soshogbo
64286796Soshogbo	for (i = 0; i < 16; i++)
65286796Soshogbo		testbool[i] = (i % 2 == 0);
66286796Soshogbo
67286796Soshogbo	nvlist_add_bool_array(nvl, key, testbool, 16);
68286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
69286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
70286796Soshogbo	ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
71286796Soshogbo	ATF_REQUIRE(nvlist_exists_bool_array(nvl, "nvl/bool"));
72286796Soshogbo
73293130Sngie	const_result = nvlist_get_bool_array(nvl, key, &num_items);
74293130Sngie	ATF_REQUIRE_EQ(num_items, 16);
75286796Soshogbo	ATF_REQUIRE(const_result != NULL);
76293130Sngie	for (i = 0; i < num_items; i++)
77286796Soshogbo		ATF_REQUIRE_EQ(const_result[i], testbool[i]);
78286796Soshogbo
79293130Sngie	result = nvlist_take_bool_array(nvl, key, &num_items);
80293130Sngie	ATF_REQUIRE_EQ(num_items, 16);
81286796Soshogbo	ATF_REQUIRE(const_result != NULL);
82293130Sngie	for (i = 0; i < num_items; i++)
83286796Soshogbo		ATF_REQUIRE_EQ(result[i], testbool[i]);
84286796Soshogbo
85286796Soshogbo	ATF_REQUIRE(!nvlist_exists_bool_array(nvl, key));
86286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
87286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
88286796Soshogbo
89286796Soshogbo	free(result);
90286796Soshogbo	nvlist_destroy(nvl);
91286796Soshogbo}
92286796Soshogbo
93286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_string_array__basic);
94286796SoshogboATF_TEST_CASE_BODY(nvlist_string_array__basic)
95286796Soshogbo{
96286796Soshogbo	const char * const *const_result;
97286796Soshogbo	char **result;
98286796Soshogbo	nvlist_t *nvl;
99293130Sngie	size_t num_items;
100286796Soshogbo	unsigned int i;
101286796Soshogbo	const char *key;
102293130Sngie	const char *string_arr[8] = { "a", "b", "kot", "foo",
103286796Soshogbo	    "tests", "nice test", "", "abcdef" };
104286796Soshogbo
105286796Soshogbo	key = "nvl/string";
106286796Soshogbo	nvl = nvlist_create(0);
107286796Soshogbo	ATF_REQUIRE(nvl != NULL);
108286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
109286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
110286796Soshogbo
111293134Sngie	nvlist_add_string_array(nvl, key, string_arr, nitems(string_arr));
112286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
113286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
114286796Soshogbo	ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
115286796Soshogbo	ATF_REQUIRE(nvlist_exists_string_array(nvl, "nvl/string"));
116286796Soshogbo
117293130Sngie	const_result = nvlist_get_string_array(nvl, key, &num_items);
118286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
119286796Soshogbo	ATF_REQUIRE(const_result != NULL);
120293134Sngie	ATF_REQUIRE(num_items == nitems(string_arr));
121293130Sngie	for (i = 0; i < num_items; i++) {
122293130Sngie		if (string_arr[i] != NULL) {
123293130Sngie			ATF_REQUIRE(strcmp(const_result[i],
124293130Sngie			    string_arr[i]) == 0);
125286796Soshogbo		} else {
126293130Sngie			ATF_REQUIRE(const_result[i] == string_arr[i]);
127286796Soshogbo		}
128286796Soshogbo	}
129286796Soshogbo
130293130Sngie	result = nvlist_take_string_array(nvl, key, &num_items);
131286796Soshogbo	ATF_REQUIRE(result != NULL);
132293134Sngie	ATF_REQUIRE_EQ(num_items, nitems(string_arr));
133293130Sngie	for (i = 0; i < num_items; i++) {
134293130Sngie		if (string_arr[i] != NULL) {
135293130Sngie			ATF_REQUIRE_EQ(strcmp(result[i], string_arr[i]), 0);
136286796Soshogbo		} else {
137293130Sngie			ATF_REQUIRE_EQ(result[i], string_arr[i]);
138286796Soshogbo		}
139286796Soshogbo	}
140286796Soshogbo
141286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
142286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
143286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
144286796Soshogbo
145293134Sngie	for (i = 0; i < num_items; i++)
146286796Soshogbo		free(result[i]);
147286796Soshogbo	free(result);
148286796Soshogbo	nvlist_destroy(nvl);
149286796Soshogbo}
150286796Soshogbo
151286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_descriptor_array__basic);
152286796SoshogboATF_TEST_CASE_BODY(nvlist_descriptor_array__basic)
153286796Soshogbo{
154286796Soshogbo	int fd[32], *result;
155286796Soshogbo	const int *const_result;
156286796Soshogbo	nvlist_t *nvl;
157293130Sngie	size_t num_items;
158286796Soshogbo	unsigned int i;
159286796Soshogbo	const char *key;
160286796Soshogbo
161293134Sngie	for (i = 0; i < nitems(fd); i++) {
162286796Soshogbo		fd[i] = dup(STDERR_FILENO);
163286796Soshogbo		ATF_REQUIRE(fd_is_valid(fd[i]));
164286796Soshogbo	}
165286796Soshogbo
166286796Soshogbo	key = "nvl/descriptor";
167286796Soshogbo	nvl = nvlist_create(0);
168286796Soshogbo	ATF_REQUIRE(nvl != NULL);
169286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
170286796Soshogbo	ATF_REQUIRE(!nvlist_exists_descriptor_array(nvl, key));
171286796Soshogbo
172293134Sngie	nvlist_add_descriptor_array(nvl, key, fd, nitems(fd));
173286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
174286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
175286796Soshogbo	ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
176286796Soshogbo	ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, "nvl/descriptor"));
177286796Soshogbo
178293130Sngie	const_result = nvlist_get_descriptor_array(nvl, key, &num_items);
179286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
180286796Soshogbo	ATF_REQUIRE(const_result != NULL);
181293134Sngie	ATF_REQUIRE(num_items == nitems(fd));
182293130Sngie	for (i = 0; i < num_items; i++) {
183286796Soshogbo		ATF_REQUIRE(fd_is_valid(const_result[i]));
184286796Soshogbo		if (i > 0)
185286796Soshogbo			ATF_REQUIRE(const_result[i] != const_result[i - 1]);
186286796Soshogbo	}
187286796Soshogbo
188293130Sngie	result = nvlist_take_descriptor_array(nvl, key, &num_items);
189286796Soshogbo	ATF_REQUIRE(result != NULL);
190293134Sngie	ATF_REQUIRE_EQ(num_items, nitems(fd));
191293130Sngie	for (i = 0; i < num_items; i++) {
192286796Soshogbo		ATF_REQUIRE(fd_is_valid(result[i]));
193286796Soshogbo		if (i > 0)
194286796Soshogbo			ATF_REQUIRE(const_result[i] != const_result[i - 1]);
195286796Soshogbo	}
196286796Soshogbo
197286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
198286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
199286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
200286796Soshogbo
201293130Sngie	for (i = 0; i < num_items; i++) {
202286796Soshogbo		close(result[i]);
203286796Soshogbo		close(fd[i]);
204286796Soshogbo	}
205286796Soshogbo	free(result);
206286796Soshogbo	nvlist_destroy(nvl);
207286796Soshogbo}
208286796Soshogbo
209286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_number_array__basic);
210286796SoshogboATF_TEST_CASE_BODY(nvlist_number_array__basic)
211286796Soshogbo{
212286796Soshogbo	const uint64_t *const_result;
213286796Soshogbo	uint64_t *result;
214286796Soshogbo	nvlist_t *nvl;
215293130Sngie	size_t num_items;
216286796Soshogbo	unsigned int i;
217286796Soshogbo	const char *key;
218286796Soshogbo	const uint64_t number[8] = { 0, UINT_MAX, 7, 123, 90,
219286796Soshogbo	    100000, 8, 1 };
220286796Soshogbo
221286796Soshogbo	key = "nvl/number";
222286796Soshogbo	nvl = nvlist_create(0);
223286796Soshogbo	ATF_REQUIRE(nvl != NULL);
224286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
225286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
226286796Soshogbo
227293134Sngie	nvlist_add_number_array(nvl, key, number, nitems(number));
228286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
229286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
230286796Soshogbo	ATF_REQUIRE(nvlist_exists_number_array(nvl, key));
231286796Soshogbo	ATF_REQUIRE(nvlist_exists_number_array(nvl, "nvl/number"));
232286796Soshogbo
233293130Sngie	const_result = nvlist_get_number_array(nvl, key, &num_items);
234286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
235286796Soshogbo	ATF_REQUIRE(const_result != NULL);
236293134Sngie	ATF_REQUIRE(num_items == nitems(number));
237293130Sngie	for (i = 0; i < num_items; i++)
238286796Soshogbo		ATF_REQUIRE_EQ(const_result[i], number[i]);
239286796Soshogbo
240293130Sngie	result = nvlist_take_number_array(nvl, key, &num_items);
241286796Soshogbo	ATF_REQUIRE(result != NULL);
242293134Sngie	ATF_REQUIRE_EQ(num_items, nitems(number));
243293130Sngie	for (i = 0; i < num_items; i++)
244286796Soshogbo		ATF_REQUIRE_EQ(result[i], number[i]);
245286796Soshogbo
246286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
247286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
248286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
249286796Soshogbo
250286796Soshogbo	free(result);
251286796Soshogbo	nvlist_destroy(nvl);
252286796Soshogbo}
253286796Soshogbo
254286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_nvlist_array__basic);
255286796SoshogboATF_TEST_CASE_BODY(nvlist_nvlist_array__basic)
256286796Soshogbo{
257286796Soshogbo	nvlist_t *testnvl[8];
258286796Soshogbo	const nvlist_t * const *const_result;
259286796Soshogbo	nvlist_t **result;
260286796Soshogbo	nvlist_t *nvl;
261293130Sngie	size_t num_items;
262286796Soshogbo	unsigned int i;
263286796Soshogbo	const char *somestr[8] = { "a", "b", "c", "d", "e", "f", "g", "h" };
264286796Soshogbo	const char *key;
265286796Soshogbo
266286796Soshogbo	for (i = 0; i < 8; i++) {
267286796Soshogbo		testnvl[i] = nvlist_create(0);
268286796Soshogbo		ATF_REQUIRE(testnvl[i] != NULL);
269286796Soshogbo		ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
270286796Soshogbo		nvlist_add_string(testnvl[i], "nvl/string", somestr[i]);
271286796Soshogbo		ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
272286796Soshogbo		ATF_REQUIRE(nvlist_exists_string(testnvl[i], "nvl/string"));
273286796Soshogbo	}
274286796Soshogbo
275286796Soshogbo	key = "nvl/nvlist";
276286796Soshogbo	nvl = nvlist_create(0);
277286796Soshogbo	ATF_REQUIRE(nvl != NULL);
278286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
279286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
280286796Soshogbo
281286796Soshogbo	nvlist_add_nvlist_array(nvl, key, (const nvlist_t * const *)testnvl, 8);
282286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
283286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
284286796Soshogbo	ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, key));
285286796Soshogbo	ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, "nvl/nvlist"));
286286796Soshogbo
287293130Sngie	const_result = nvlist_get_nvlist_array(nvl, key, &num_items);
288286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
289286796Soshogbo	ATF_REQUIRE(const_result != NULL);
290293134Sngie	ATF_REQUIRE(num_items == nitems(testnvl));
291286796Soshogbo
292293130Sngie	for (i = 0; i < num_items; i++) {
293286796Soshogbo		ATF_REQUIRE_EQ(nvlist_error(const_result[i]), 0);
294293130Sngie		if (i < num_items - 1) {
295286796Soshogbo			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
296286796Soshogbo			    const_result[i + 1]);
297286796Soshogbo		} else {
298286796Soshogbo			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
299286796Soshogbo			    NULL);
300286796Soshogbo		}
301286796Soshogbo		ATF_REQUIRE(nvlist_get_parent(const_result[i], NULL) == nvl);
302286796Soshogbo		ATF_REQUIRE(nvlist_in_array(const_result[i]));
303286796Soshogbo		ATF_REQUIRE(nvlist_exists_string(const_result[i],
304286796Soshogbo		    "nvl/string"));
305286796Soshogbo		ATF_REQUIRE(strcmp(nvlist_get_string(const_result[i],
306286796Soshogbo		    "nvl/string"), somestr[i]) == 0);
307286796Soshogbo	}
308286796Soshogbo
309293130Sngie	result = nvlist_take_nvlist_array(nvl, key, &num_items);
310286796Soshogbo	ATF_REQUIRE(result != NULL);
311293130Sngie	ATF_REQUIRE_EQ(num_items, 8);
312293130Sngie	for (i = 0; i < num_items; i++) {
313286796Soshogbo		ATF_REQUIRE_EQ(nvlist_error(result[i]), 0);
314286796Soshogbo		ATF_REQUIRE(nvlist_get_array_next(result[i]) == NULL);
315336346Skevans		ATF_REQUIRE(nvlist_get_parent(result[i], NULL) == NULL);
316286796Soshogbo		ATF_REQUIRE(nvlist_get_array_next(const_result[i]) == NULL);
317286796Soshogbo		ATF_REQUIRE(!nvlist_in_array(const_result[i]));
318286796Soshogbo	}
319286796Soshogbo
320286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
321286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
322286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
323286796Soshogbo
324286796Soshogbo	for (i = 0; i < 8; i++) {
325286796Soshogbo		nvlist_destroy(result[i]);
326286796Soshogbo		nvlist_destroy(testnvl[i]);
327286796Soshogbo	}
328286796Soshogbo
329286796Soshogbo	free(result);
330286796Soshogbo	nvlist_destroy(nvl);
331286796Soshogbo}
332286796Soshogbo
333286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone_array);
334286796SoshogboATF_TEST_CASE_BODY(nvlist_clone_array)
335286796Soshogbo{
336286796Soshogbo	nvlist_t *testnvl[8];
337286796Soshogbo	nvlist_t *src, *dst;
338286796Soshogbo	const nvlist_t *nvl;
339286796Soshogbo	bool testbool[16];
340286796Soshogbo	int testfd[16];
341293130Sngie	size_t i, num_items;
342293130Sngie	const char *string_arr[8] = { "a", "b", "kot", "foo",
343286796Soshogbo	    "tests", "nice test", "", "abcdef" };
344286796Soshogbo	const char *somestr[8] = { "a", "b", "c", "d", "e", "f", "g", "h" };
345286796Soshogbo	const uint64_t number[8] = { 0, UINT_MAX, 7, 123, 90,
346286796Soshogbo	    100000, 8, 1 };
347286796Soshogbo
348293134Sngie	for (i = 0; i < nitems(testfd); i++) {
349286796Soshogbo		testbool[i] = (i % 2 == 0);
350286796Soshogbo		testfd[i] = dup(STDERR_FILENO);
351286796Soshogbo		ATF_REQUIRE(fd_is_valid(testfd[i]));
352286796Soshogbo	}
353293134Sngie	for (i = 0; i < nitems(testnvl); i++) {
354286796Soshogbo		testnvl[i] = nvlist_create(0);
355286796Soshogbo		ATF_REQUIRE(nvlist_error(testnvl[i]) == 0);
356286796Soshogbo		nvlist_add_string(testnvl[i], "nvl/nvl/teststr", somestr[i]);
357286796Soshogbo		ATF_REQUIRE(nvlist_error(testnvl[i]) == 0);
358286796Soshogbo	}
359286796Soshogbo
360286796Soshogbo	src = nvlist_create(0);
361286796Soshogbo	ATF_REQUIRE(nvlist_error(src) == 0);
362286796Soshogbo
363286796Soshogbo	ATF_REQUIRE(!nvlist_exists_bool_array(src, "nvl/bool"));
364293134Sngie	nvlist_add_bool_array(src, "nvl/bool", testbool, nitems(testbool));
365286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(src), 0);
366286796Soshogbo	ATF_REQUIRE(nvlist_exists_bool_array(src, "nvl/bool"));
367286796Soshogbo
368286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(src, "nvl/string"));
369293134Sngie	nvlist_add_string_array(src, "nvl/string", string_arr,
370293134Sngie	    nitems(string_arr));
371286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(src), 0);
372286796Soshogbo	ATF_REQUIRE(nvlist_exists_string_array(src, "nvl/string"));
373286796Soshogbo
374286796Soshogbo	ATF_REQUIRE(!nvlist_exists_descriptor_array(src, "nvl/fd"));
375293134Sngie	nvlist_add_descriptor_array(src, "nvl/fd", testfd, nitems(testfd));
376286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(src), 0);
377286796Soshogbo	ATF_REQUIRE(nvlist_exists_descriptor_array(src, "nvl/fd"));
378286796Soshogbo
379286796Soshogbo	ATF_REQUIRE(!nvlist_exists_number_array(src, "nvl/number"));
380293134Sngie	nvlist_add_number_array(src, "nvl/number", number,
381293134Sngie	    nitems(number));
382286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(src), 0);
383286796Soshogbo	ATF_REQUIRE(nvlist_exists_number_array(src, "nvl/number"));
384286796Soshogbo
385286796Soshogbo	ATF_REQUIRE(!nvlist_exists_nvlist_array(src, "nvl/array"));
386286796Soshogbo	nvlist_add_nvlist_array(src, "nvl/array",
387293134Sngie	    (const nvlist_t * const *)testnvl, nitems(testnvl));
388286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(src), 0);
389286796Soshogbo	ATF_REQUIRE(nvlist_exists_nvlist_array(src, "nvl/array"));
390286796Soshogbo
391286796Soshogbo	dst = nvlist_clone(src);
392286796Soshogbo	ATF_REQUIRE(dst != NULL);
393286796Soshogbo
394286796Soshogbo	ATF_REQUIRE(nvlist_exists_bool_array(dst, "nvl/bool"));
395293130Sngie	(void) nvlist_get_bool_array(dst, "nvl/bool", &num_items);
396293134Sngie	ATF_REQUIRE_EQ(num_items, nitems(testbool));
397293130Sngie	for (i = 0; i < num_items; i++) {
398286796Soshogbo		ATF_REQUIRE(
399293130Sngie		    nvlist_get_bool_array(dst, "nvl/bool", &num_items)[i] ==
400293130Sngie		    nvlist_get_bool_array(src, "nvl/bool", &num_items)[i]);
401286796Soshogbo	}
402286796Soshogbo
403286796Soshogbo	ATF_REQUIRE(nvlist_exists_string_array(dst, "nvl/string"));
404293130Sngie	(void) nvlist_get_string_array(dst, "nvl/string", &num_items);
405293134Sngie	ATF_REQUIRE_EQ(num_items, nitems(string_arr));
406293130Sngie	for (i = 0; i < num_items; i++) {
407286796Soshogbo		if (nvlist_get_string_array(dst, "nvl/string",
408293130Sngie		    &num_items)[i] == NULL) {
409286796Soshogbo			ATF_REQUIRE(nvlist_get_string_array(dst, "nvl/string",
410293130Sngie			    &num_items)[i] == nvlist_get_string_array(src,
411293130Sngie			    "nvl/string", &num_items)[i]);
412286796Soshogbo		} else {
413286796Soshogbo			ATF_REQUIRE(strcmp(nvlist_get_string_array(dst,
414293130Sngie			    "nvl/string", &num_items)[i], nvlist_get_string_array(
415293130Sngie			    src, "nvl/string", &num_items)[i]) == 0);
416286796Soshogbo		}
417286796Soshogbo	}
418286796Soshogbo
419286796Soshogbo	ATF_REQUIRE(nvlist_exists_descriptor_array(dst, "nvl/fd"));
420293130Sngie	(void) nvlist_get_descriptor_array(dst, "nvl/fd", &num_items);
421293134Sngie	ATF_REQUIRE_EQ(num_items, nitems(testfd));
422293130Sngie	for (i = 0; i < num_items; i++) {
423286796Soshogbo		ATF_REQUIRE(fd_is_valid(
424293130Sngie		    nvlist_get_descriptor_array(dst, "nvl/fd", &num_items)[i]));
425286796Soshogbo	}
426286796Soshogbo	ATF_REQUIRE(nvlist_exists_number_array(dst, "nvl/number"));
427293130Sngie	(void) nvlist_get_number_array(dst, "nvl/number", &num_items);
428293134Sngie	ATF_REQUIRE_EQ(num_items, nitems(number));
429286796Soshogbo
430293130Sngie	for (i = 0; i < num_items; i++) {
431286796Soshogbo		ATF_REQUIRE(
432293130Sngie		    nvlist_get_number_array(dst, "nvl/number", &num_items)[i] ==
433293130Sngie		    nvlist_get_number_array(src, "nvl/number", &num_items)[i]);
434286796Soshogbo	}
435286796Soshogbo
436286796Soshogbo	ATF_REQUIRE(nvlist_exists_nvlist_array(dst, "nvl/array"));
437293130Sngie	(void) nvlist_get_nvlist_array(dst, "nvl/array", &num_items);
438293134Sngie	ATF_REQUIRE_EQ(num_items, nitems(testnvl));
439293130Sngie	for (i = 0; i < num_items; i++) {
440293130Sngie		nvl = nvlist_get_nvlist_array(dst, "nvl/array", &num_items)[i];
441286796Soshogbo		ATF_REQUIRE(nvlist_exists_string(nvl, "nvl/nvl/teststr"));
442286796Soshogbo		ATF_REQUIRE(strcmp(nvlist_get_string(nvl, "nvl/nvl/teststr"),
443286796Soshogbo		    somestr[i]) == 0);
444286796Soshogbo	}
445286796Soshogbo
446293134Sngie	for (i = 0; i < nitems(testfd); i++) {
447286796Soshogbo		close(testfd[i]);
448286796Soshogbo	}
449293134Sngie	for (i = 0; i < nitems(testnvl); i++) {
450293134Sngie		nvlist_destroy(testnvl[i]);
451293134Sngie	}
452286796Soshogbo	nvlist_destroy(src);
453286796Soshogbo	nvlist_destroy(dst);
454286796Soshogbo}
455286796Soshogbo
456286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_bool_array__move);
457286796SoshogboATF_TEST_CASE_BODY(nvlist_bool_array__move)
458286796Soshogbo{
459286796Soshogbo	bool *testbool;
460286796Soshogbo	const bool *const_result;
461286796Soshogbo	nvlist_t *nvl;
462293130Sngie	size_t num_items, count;
463286796Soshogbo	unsigned int i;
464286796Soshogbo	const char *key;
465286796Soshogbo
466286796Soshogbo	key = "nvl/bool";
467286796Soshogbo	nvl = nvlist_create(0);
468286796Soshogbo	ATF_REQUIRE(nvl != NULL);
469286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
470286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
471286796Soshogbo
472286796Soshogbo	count = 16;
473286796Soshogbo	testbool = (bool*)malloc(sizeof(*testbool) * count);
474286796Soshogbo	ATF_REQUIRE(testbool != NULL);
475286796Soshogbo	for (i = 0; i < count; i++)
476286796Soshogbo		testbool[i] = (i % 2 == 0);
477286796Soshogbo
478286796Soshogbo	nvlist_move_bool_array(nvl, key, testbool, count);
479286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
480286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
481286796Soshogbo	ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
482286796Soshogbo
483293130Sngie	const_result = nvlist_get_bool_array(nvl, key, &num_items);
484293130Sngie	ATF_REQUIRE_EQ(num_items, count);
485286796Soshogbo	ATF_REQUIRE(const_result != NULL);
486286796Soshogbo	ATF_REQUIRE(const_result == testbool);
487293130Sngie	for (i = 0; i < num_items; i++)
488286796Soshogbo		ATF_REQUIRE_EQ(const_result[i], (i % 2 == 0));
489286796Soshogbo
490286796Soshogbo	nvlist_destroy(nvl);
491286796Soshogbo}
492286796Soshogbo
493286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_string_array__move);
494286796SoshogboATF_TEST_CASE_BODY(nvlist_string_array__move)
495286796Soshogbo{
496286796Soshogbo	char **teststr;
497286796Soshogbo	const char * const *const_result;
498286796Soshogbo	nvlist_t *nvl;
499293130Sngie	size_t num_items, count;
500286796Soshogbo	unsigned int i;
501286796Soshogbo	const char *key;
502286796Soshogbo
503286796Soshogbo	key = "nvl/string";
504286796Soshogbo	nvl = nvlist_create(0);
505286796Soshogbo	ATF_REQUIRE(nvl != NULL);
506286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
507286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
508286796Soshogbo
509286796Soshogbo	count = 26;
510286796Soshogbo	teststr = (char**)malloc(sizeof(*teststr) * count);
511286796Soshogbo	ATF_REQUIRE(teststr != NULL);
512286796Soshogbo	for (i = 0; i < count; i++) {
513286796Soshogbo		teststr[i] = (char*)malloc(sizeof(**teststr) * 2);
514286796Soshogbo		ATF_REQUIRE(teststr[i] != NULL);
515286796Soshogbo		teststr[i][0] = 'a' + i;
516286796Soshogbo		teststr[i][1] = '\0';
517286796Soshogbo	}
518286796Soshogbo
519286796Soshogbo	nvlist_move_string_array(nvl, key, teststr, count);
520286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
521286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
522286796Soshogbo	ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
523286796Soshogbo
524293130Sngie	const_result = nvlist_get_string_array(nvl, key, &num_items);
525293130Sngie	ATF_REQUIRE_EQ(num_items, count);
526286796Soshogbo	ATF_REQUIRE(const_result != NULL);
527286796Soshogbo	ATF_REQUIRE((intptr_t)const_result == (intptr_t)teststr);
528293130Sngie	for (i = 0; i < num_items; i++) {
529286796Soshogbo		ATF_REQUIRE_EQ(const_result[i][0], (char)('a' + i));
530286796Soshogbo		ATF_REQUIRE_EQ(const_result[i][1], '\0');
531286796Soshogbo	}
532286796Soshogbo
533286796Soshogbo	nvlist_destroy(nvl);
534286796Soshogbo}
535286796Soshogbo
536286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_nvlist_array__move);
537286796SoshogboATF_TEST_CASE_BODY(nvlist_nvlist_array__move)
538286796Soshogbo{
539286796Soshogbo	nvlist **testnv;
540286796Soshogbo	const nvlist * const *const_result;
541286796Soshogbo	nvlist_t *nvl;
542293130Sngie	size_t num_items, count;
543286796Soshogbo	unsigned int i;
544286796Soshogbo	const char *key;
545286796Soshogbo
546286796Soshogbo	key = "nvl/nvlist";
547286796Soshogbo	nvl = nvlist_create(0);
548286796Soshogbo	ATF_REQUIRE(nvl != NULL);
549286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
550286796Soshogbo	ATF_REQUIRE(!nvlist_exists_nvlist_array(nvl, key));
551286796Soshogbo
552286796Soshogbo	count = 26;
553286796Soshogbo	testnv = (nvlist**)malloc(sizeof(*testnv) * count);
554286796Soshogbo	ATF_REQUIRE(testnv != NULL);
555286796Soshogbo	for (i = 0; i < count; i++) {
556286796Soshogbo		testnv[i] = nvlist_create(0);
557286796Soshogbo		ATF_REQUIRE(testnv[i] != NULL);
558286796Soshogbo	}
559286796Soshogbo
560286796Soshogbo	nvlist_move_nvlist_array(nvl, key, testnv, count);
561286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
562286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
563286796Soshogbo	ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, key));
564286796Soshogbo
565293130Sngie	const_result = nvlist_get_nvlist_array(nvl, key, &num_items);
566293130Sngie	ATF_REQUIRE_EQ(num_items, count);
567286796Soshogbo	ATF_REQUIRE(const_result != NULL);
568286796Soshogbo	ATF_REQUIRE((intptr_t)const_result == (intptr_t)testnv);
569293130Sngie	for (i = 0; i < num_items; i++) {
570286796Soshogbo		ATF_REQUIRE_EQ(nvlist_error(const_result[i]), 0);
571286796Soshogbo		ATF_REQUIRE(nvlist_empty(const_result[i]));
572293130Sngie		if (i < num_items - 1) {
573286796Soshogbo			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
574286796Soshogbo			    const_result[i + 1]);
575286796Soshogbo		} else {
576286796Soshogbo			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
577286796Soshogbo			    NULL);
578286796Soshogbo		}
579286796Soshogbo		ATF_REQUIRE(nvlist_get_parent(const_result[i], NULL) == nvl);
580286796Soshogbo		ATF_REQUIRE(nvlist_in_array(const_result[i]));
581286796Soshogbo	}
582286796Soshogbo
583286796Soshogbo	nvlist_destroy(nvl);
584286796Soshogbo}
585286796Soshogbo
586286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_number_array__move);
587286796SoshogboATF_TEST_CASE_BODY(nvlist_number_array__move)
588286796Soshogbo{
589286796Soshogbo	uint64_t *testnumber;
590286796Soshogbo	const uint64_t *const_result;
591286796Soshogbo	nvlist_t *nvl;
592293130Sngie	size_t num_items, count;
593286796Soshogbo	unsigned int i;
594286796Soshogbo	const char *key;
595286796Soshogbo
596286796Soshogbo	key = "nvl/number";
597286796Soshogbo	nvl = nvlist_create(0);
598286796Soshogbo	ATF_REQUIRE(nvl != NULL);
599286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
600286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
601286796Soshogbo
602286796Soshogbo	count = 1000;
603286796Soshogbo	testnumber = (uint64_t*)malloc(sizeof(*testnumber) * count);
604286796Soshogbo	ATF_REQUIRE(testnumber != NULL);
605286796Soshogbo	for (i = 0; i < count; i++)
606286796Soshogbo		testnumber[i] = i;
607286796Soshogbo
608286796Soshogbo	nvlist_move_number_array(nvl, key, testnumber, count);
609286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
610286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
611286796Soshogbo	ATF_REQUIRE(nvlist_exists_number_array(nvl, key));
612286796Soshogbo
613293130Sngie	const_result = nvlist_get_number_array(nvl, key, &num_items);
614293130Sngie	ATF_REQUIRE_EQ(num_items, count);
615286796Soshogbo	ATF_REQUIRE(const_result != NULL);
616286796Soshogbo	ATF_REQUIRE(const_result == testnumber);
617293130Sngie	for (i = 0; i < num_items; i++)
618286796Soshogbo		ATF_REQUIRE_EQ(const_result[i], i);
619286796Soshogbo
620286796Soshogbo	nvlist_destroy(nvl);
621286796Soshogbo}
622286796Soshogbo
623286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_descriptor_array__move);
624286796SoshogboATF_TEST_CASE_BODY(nvlist_descriptor_array__move)
625286796Soshogbo{
626286796Soshogbo	int *testfd;
627286796Soshogbo	const int *const_result;
628286796Soshogbo	nvlist_t *nvl;
629293130Sngie	size_t num_items, count;
630286796Soshogbo	unsigned int i;
631286796Soshogbo	const char *key;
632286796Soshogbo
633286796Soshogbo	key = "nvl/fd";
634286796Soshogbo	nvl = nvlist_create(0);
635286796Soshogbo	ATF_REQUIRE(nvl != NULL);
636286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
637286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
638286796Soshogbo
639286796Soshogbo	count = 50;
640286796Soshogbo	testfd = (int*)malloc(sizeof(*testfd) * count);
641286796Soshogbo	ATF_REQUIRE(testfd != NULL);
642286796Soshogbo	for (i = 0; i < count; i++) {
643286796Soshogbo		testfd[i] = dup(STDERR_FILENO);
644286796Soshogbo		ATF_REQUIRE(fd_is_valid(testfd[i]));
645286796Soshogbo	}
646286796Soshogbo
647286796Soshogbo	nvlist_move_descriptor_array(nvl, key, testfd, count);
648286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
649286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
650286796Soshogbo	ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
651286796Soshogbo
652293130Sngie	const_result = nvlist_get_descriptor_array(nvl, key, &num_items);
653293130Sngie	ATF_REQUIRE_EQ(num_items, count);
654286796Soshogbo	ATF_REQUIRE(const_result != NULL);
655286796Soshogbo	ATF_REQUIRE(const_result == testfd);
656293130Sngie	for (i = 0; i < num_items; i++)
657286796Soshogbo		ATF_REQUIRE(fd_is_valid(const_result[i]));
658286796Soshogbo
659286796Soshogbo	nvlist_destroy(nvl);
660286796Soshogbo}
661286796Soshogbo
662286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_arrays__error_null);
663286796SoshogboATF_TEST_CASE_BODY(nvlist_arrays__error_null)
664286796Soshogbo{
665286796Soshogbo	nvlist_t *nvl;
666286796Soshogbo
667286796Soshogbo	nvl = nvlist_create(0);
668286796Soshogbo	ATF_REQUIRE(nvl != NULL);
669286796Soshogbo	nvlist_add_number_array(nvl, "nvl/number", NULL, 0);
670286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
671286796Soshogbo	nvlist_destroy(nvl);
672286796Soshogbo
673286796Soshogbo	nvl = nvlist_create(0);
674286796Soshogbo	ATF_REQUIRE(nvl != NULL);
675286796Soshogbo	nvlist_move_number_array(nvl, "nvl/number", NULL, 0);
676286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
677286796Soshogbo	nvlist_destroy(nvl);
678286796Soshogbo
679286796Soshogbo	nvl = nvlist_create(0);
680286796Soshogbo	ATF_REQUIRE(nvl != NULL);
681286796Soshogbo	nvlist_add_descriptor_array(nvl, "nvl/fd", NULL, 0);
682286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
683286796Soshogbo	nvlist_destroy(nvl);
684286796Soshogbo
685286796Soshogbo	nvl = nvlist_create(0);
686286796Soshogbo	ATF_REQUIRE(nvl != NULL);
687286796Soshogbo	nvlist_move_descriptor_array(nvl, "nvl/fd", NULL, 0);
688286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
689286796Soshogbo	nvlist_destroy(nvl);
690286796Soshogbo
691286796Soshogbo	nvl = nvlist_create(0);
692286796Soshogbo	ATF_REQUIRE(nvl != NULL);
693286796Soshogbo	nvlist_add_string_array(nvl, "nvl/string", NULL, 0);
694286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
695286796Soshogbo	nvlist_destroy(nvl);
696286796Soshogbo
697286796Soshogbo	nvl = nvlist_create(0);
698286796Soshogbo	ATF_REQUIRE(nvl != NULL);
699286796Soshogbo	nvlist_move_string_array(nvl, "nvl/string", NULL, 0);
700286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
701286796Soshogbo	nvlist_destroy(nvl);
702286796Soshogbo
703286796Soshogbo	nvl = nvlist_create(0);
704286796Soshogbo	ATF_REQUIRE(nvl != NULL);
705286796Soshogbo	nvlist_add_nvlist_array(nvl, "nvl/nvlist", NULL, 0);
706286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
707286796Soshogbo	nvlist_destroy(nvl);
708286796Soshogbo
709286796Soshogbo	nvl = nvlist_create(0);
710286796Soshogbo	ATF_REQUIRE(nvl != NULL);
711286796Soshogbo	nvlist_move_nvlist_array(nvl, "nvl/nvlist", NULL, 0);
712286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
713286796Soshogbo	nvlist_destroy(nvl);
714286796Soshogbo
715286796Soshogbo	nvl = nvlist_create(0);
716286796Soshogbo	ATF_REQUIRE(nvl != NULL);
717286796Soshogbo	nvlist_add_bool_array(nvl, "nvl/bool", NULL, 0);
718286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
719286796Soshogbo	nvlist_destroy(nvl);
720286796Soshogbo
721286796Soshogbo	nvl = nvlist_create(0);
722286796Soshogbo	ATF_REQUIRE(nvl != NULL);
723286796Soshogbo	nvlist_move_bool_array(nvl, "nvl/bool", NULL, 0);
724286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
725286796Soshogbo	nvlist_destroy(nvl);
726286796Soshogbo}
727286796Soshogbo
728286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_arrays__bad_value);
729286796SoshogboATF_TEST_CASE_BODY(nvlist_arrays__bad_value)
730286796Soshogbo{
731286796Soshogbo	nvlist_t *nvl, *nvladd[1], **nvlmove;
732286796Soshogbo	int fdadd[1], *fdmove;
733286796Soshogbo
734286796Soshogbo	nvladd[0] = NULL;
735286796Soshogbo	nvl = nvlist_create(0);
736286796Soshogbo	ATF_REQUIRE(nvl != NULL);
737286796Soshogbo	nvlist_add_nvlist_array(nvl, "nvl/nvlist", nvladd, 1);
738286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
739286796Soshogbo	nvlist_destroy(nvl);
740286796Soshogbo
741286796Soshogbo	nvlmove = (nvlist_t**)malloc(sizeof(*nvlmove));
742286796Soshogbo	ATF_REQUIRE(nvlmove != NULL);
743286796Soshogbo	nvlmove[0] = NULL;
744286796Soshogbo	nvl = nvlist_create(0);
745286796Soshogbo	ATF_REQUIRE(nvl != NULL);
746286796Soshogbo	nvlist_move_nvlist_array(nvl, "nvl/nvlist", nvlmove, 1);
747286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
748286796Soshogbo	nvlist_destroy(nvl);
749286796Soshogbo
750286796Soshogbo	fdadd[0] = -2;
751286796Soshogbo	nvl = nvlist_create(0);
752286796Soshogbo	ATF_REQUIRE(nvl != NULL);
753286796Soshogbo	nvlist_add_descriptor_array(nvl, "nvl/fd", fdadd, 1);
754286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
755286796Soshogbo	nvlist_destroy(nvl);
756286796Soshogbo
757286796Soshogbo	fdmove = (int*)malloc(sizeof(*fdmove));
758286796Soshogbo	ATF_REQUIRE(fdmove != NULL);
759286796Soshogbo	fdmove[0] = -2;
760286796Soshogbo	nvl = nvlist_create(0);
761286796Soshogbo	ATF_REQUIRE(nvl != NULL);
762286796Soshogbo	nvlist_move_descriptor_array(nvl, "nvl/fd", fdmove, 1);
763286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) != 0);
764286796Soshogbo	nvlist_destroy(nvl);
765286796Soshogbo}
766286796Soshogbo
767286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_nvlist_array__travel);
768286796SoshogboATF_TEST_CASE_BODY(nvlist_nvlist_array__travel)
769286796Soshogbo{
770286796Soshogbo	nvlist_t *nvl, *test[5], *nasted;
771286796Soshogbo	const nvlist_t *travel;
772293134Sngie	const char *name;
773286796Soshogbo	void *cookie;
774293134Sngie	int type;
775293134Sngie	unsigned int i, index;
776286796Soshogbo
777293134Sngie	for (i = 0; i < nitems(test); i++) {
778286796Soshogbo		test[i] = nvlist_create(0);
779286796Soshogbo		ATF_REQUIRE(test[i] != NULL);
780286796Soshogbo		nvlist_add_number(test[i], "nvl/number", i);
781286796Soshogbo		ATF_REQUIRE(nvlist_error(test[i]) == 0);
782286796Soshogbo	}
783286796Soshogbo	nvl = nvlist_create(0);
784286796Soshogbo	ATF_REQUIRE(nvl != NULL);
785293134Sngie	nvlist_add_nvlist_array(nvl, "nvl/nvlist_array", test, nitems(test));
786286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) == 0);
787286796Soshogbo	nasted = nvlist_create(0);
788286796Soshogbo	ATF_REQUIRE(nasted != NULL);
789293134Sngie	nvlist_add_nvlist_array(nasted, "nvl/nvl/nvlist_array", test,
790293134Sngie	    nitems(test));
791286796Soshogbo	ATF_REQUIRE(nvlist_error(nasted) == 0);
792286796Soshogbo	nvlist_move_nvlist(nvl, "nvl/nvl", nasted);
793286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) == 0);
794286796Soshogbo	nvlist_add_string(nvl, "nvl/string", "END");
795286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) == 0);
796286796Soshogbo
797286796Soshogbo	cookie = NULL;
798286796Soshogbo	index = 0;
799286796Soshogbo	travel = nvl;
800286796Soshogbo	do {
801286796Soshogbo		while ((name = nvlist_next(travel, &type, &cookie)) != NULL) {
802286796Soshogbo			if (index == 0) {
803286796Soshogbo				ATF_REQUIRE(type == NV_TYPE_NVLIST_ARRAY);
804293134Sngie			} else if (index >= 1 && index <= nitems(test)) {
805286796Soshogbo				ATF_REQUIRE(type == NV_TYPE_NUMBER);
806293134Sngie			} else if (index == nitems(test) + 1) {
807286796Soshogbo				ATF_REQUIRE(type == NV_TYPE_NVLIST);
808293134Sngie			} else if (index == nitems(test) + 2) {
809286796Soshogbo				ATF_REQUIRE(type == NV_TYPE_NVLIST_ARRAY);
810293134Sngie			} else if (index >= nitems(test) + 3 &&
811293134Sngie				   index <= 2 * nitems(test) + 2) {
812286796Soshogbo				ATF_REQUIRE(type == NV_TYPE_NUMBER);
813293134Sngie			} else if (index == 2 * nitems(test) + 3) {
814286796Soshogbo				ATF_REQUIRE(type == NV_TYPE_STRING);
815286796Soshogbo			}
816286796Soshogbo
817286796Soshogbo			if (type == NV_TYPE_NVLIST) {
818286796Soshogbo				travel = nvlist_get_nvlist(travel, name);
819286796Soshogbo				cookie = NULL;
820286796Soshogbo			} else if (type == NV_TYPE_NVLIST_ARRAY) {
821286796Soshogbo				travel = nvlist_get_nvlist_array(travel, name,
822286796Soshogbo				    NULL)[0];
823286796Soshogbo				cookie = NULL;
824286796Soshogbo			}
825286796Soshogbo			index ++;
826286796Soshogbo		}
827286796Soshogbo	} while ((travel = nvlist_get_pararr(travel, &cookie)) != NULL);
828286796Soshogbo
829293134Sngie	for (i = 0; i < nitems(test); i++)
830286796Soshogbo		nvlist_destroy(test[i]);
831286796Soshogbo
832286796Soshogbo	nvlist_destroy(nvl);
833286796Soshogbo}
834286796Soshogbo
835286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_nvlist_array__travel_alternative);
836286796SoshogboATF_TEST_CASE_BODY(nvlist_nvlist_array__travel_alternative)
837286796Soshogbo{
838286796Soshogbo	nvlist_t *nvl, *test[5], *nasted;
839286796Soshogbo	const nvlist_t *travel, *tmp;
840286796Soshogbo	void *cookie;
841286796Soshogbo	int index, i, type;
842286796Soshogbo	const char *name;
843286796Soshogbo
844286796Soshogbo	for (i = 0; i < 5; i++) {
845286796Soshogbo		test[i] = nvlist_create(0);
846286796Soshogbo		ATF_REQUIRE(test[i] != NULL);
847286796Soshogbo		nvlist_add_number(test[i], "nvl/number", i);
848286796Soshogbo		ATF_REQUIRE(nvlist_error(test[i]) == 0);
849286796Soshogbo	}
850286796Soshogbo	nvl = nvlist_create(0);
851286796Soshogbo	ATF_REQUIRE(nvl != NULL);
852286796Soshogbo	nvlist_add_nvlist_array(nvl, "nvl/nvlist_array", test, 5);
853286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) == 0);
854286796Soshogbo	nasted = nvlist_create(0);
855286796Soshogbo	ATF_REQUIRE(nasted != NULL);
856286796Soshogbo	nvlist_add_nvlist_array(nasted, "nvl/nvl/nvlist_array", test, 5);
857286796Soshogbo	ATF_REQUIRE(nvlist_error(nasted) == 0);
858286796Soshogbo	nvlist_move_nvlist(nvl, "nvl/nvl", nasted);
859286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) == 0);
860286796Soshogbo	nvlist_add_string(nvl, "nvl/string", "END");
861286796Soshogbo	ATF_REQUIRE(nvlist_error(nvl) == 0);
862286796Soshogbo
863286796Soshogbo	cookie = NULL;
864286796Soshogbo	index = 0;
865286796Soshogbo	tmp = travel = nvl;
866286796Soshogbo	do {
867286796Soshogbo		do {
868286796Soshogbo			travel = tmp;
869286796Soshogbo			while ((name = nvlist_next(travel, &type, &cookie)) !=
870286796Soshogbo			    NULL) {
871286796Soshogbo				if (index == 0) {
872286796Soshogbo					ATF_REQUIRE(type ==
873286796Soshogbo					    NV_TYPE_NVLIST_ARRAY);
874286796Soshogbo				} else if (index >= 1 && index <= 5) {
875286796Soshogbo					ATF_REQUIRE(type == NV_TYPE_NUMBER);
876286796Soshogbo				} else if (index == 6) {
877286796Soshogbo					ATF_REQUIRE(type == NV_TYPE_NVLIST);
878286796Soshogbo				} else if (index == 7) {
879286796Soshogbo					ATF_REQUIRE(type ==
880286796Soshogbo					    NV_TYPE_NVLIST_ARRAY);
881286796Soshogbo				} else if (index >= 8 && index <= 12) {
882286796Soshogbo					ATF_REQUIRE(type == NV_TYPE_NUMBER);
883286796Soshogbo				} else if (index == 13) {
884286796Soshogbo					ATF_REQUIRE(type == NV_TYPE_STRING);
885286796Soshogbo				}
886286796Soshogbo
887286796Soshogbo				if (type == NV_TYPE_NVLIST) {
888286796Soshogbo					travel = nvlist_get_nvlist(travel,
889286796Soshogbo					    name);
890286796Soshogbo					cookie = NULL;
891286796Soshogbo				} else if (type == NV_TYPE_NVLIST_ARRAY) {
892286796Soshogbo					travel = nvlist_get_nvlist_array(travel,
893286796Soshogbo					    name, NULL)[0];
894286796Soshogbo					cookie = NULL;
895286796Soshogbo				}
896286796Soshogbo				index ++;
897286796Soshogbo			}
898286796Soshogbo			cookie = NULL;
899286796Soshogbo		} while ((tmp = nvlist_get_array_next(travel)) != NULL);
900286796Soshogbo	} while ((tmp = nvlist_get_parent(travel, &cookie)) != NULL);
901286796Soshogbo
902286796Soshogbo	for (i = 0; i < 5; i++)
903286796Soshogbo		nvlist_destroy(test[i]);
904286796Soshogbo
905286796Soshogbo	nvlist_destroy(nvl);
906286796Soshogbo}
907286796Soshogbo
908286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_bool_array__pack);
909286796SoshogboATF_TEST_CASE_BODY(nvlist_bool_array__pack)
910286796Soshogbo{
911286796Soshogbo	nvlist_t *nvl, *unpacked;
912286796Soshogbo	const char *key;
913286796Soshogbo	size_t packed_size, count;
914286796Soshogbo	void *packed;
915286796Soshogbo	unsigned int i;
916286796Soshogbo	const bool *const_result;
917286796Soshogbo	bool testbool[16];
918286796Soshogbo
919293134Sngie	for (i = 0; i < nitems(testbool); i++)
920286796Soshogbo		testbool[i] = (i % 2 == 0);
921286796Soshogbo
922286796Soshogbo	key = "nvl/bool";
923286796Soshogbo	nvl = nvlist_create(0);
924286796Soshogbo	ATF_REQUIRE(nvl != NULL);
925286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
926286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
927286796Soshogbo
928293134Sngie	nvlist_add_bool_array(nvl, key, testbool, nitems(testbool));
929286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
930286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
931286796Soshogbo	ATF_REQUIRE(nvlist_exists_bool_array(nvl, key));
932286796Soshogbo
933286796Soshogbo	packed = nvlist_pack(nvl, &packed_size);
934286796Soshogbo	ATF_REQUIRE(packed != NULL);
935286796Soshogbo
936286796Soshogbo	unpacked = nvlist_unpack(packed, packed_size, 0);
937286796Soshogbo	ATF_REQUIRE(unpacked != NULL);
938286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(unpacked), 0);
939286796Soshogbo	ATF_REQUIRE(nvlist_exists_bool_array(unpacked, key));
940286796Soshogbo
941286796Soshogbo	const_result = nvlist_get_bool_array(unpacked, key, &count);
942293134Sngie	ATF_REQUIRE_EQ(count, nitems(testbool));
943286796Soshogbo	for (i = 0; i < count; i++) {
944286796Soshogbo		ATF_REQUIRE_EQ(testbool[i], const_result[i]);
945286796Soshogbo	}
946286796Soshogbo
947286796Soshogbo	nvlist_destroy(nvl);
948286796Soshogbo	nvlist_destroy(unpacked);
949286796Soshogbo	free(packed);
950286796Soshogbo}
951286796Soshogbo
952286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_number_array__pack);
953286796SoshogboATF_TEST_CASE_BODY(nvlist_number_array__pack)
954286796Soshogbo{
955286796Soshogbo	nvlist_t *nvl, *unpacked;
956286796Soshogbo	const char *key;
957286796Soshogbo	size_t packed_size, count;
958286796Soshogbo	void *packed;
959286796Soshogbo	unsigned int i;
960286796Soshogbo	const uint64_t *const_result;
961286796Soshogbo	const uint64_t number[8] = { 0, UINT_MAX, 7, 123, 90,
962286796Soshogbo	    100000, 8, 1 };
963286796Soshogbo
964286796Soshogbo	key = "nvl/number";
965286796Soshogbo	nvl = nvlist_create(0);
966286796Soshogbo	ATF_REQUIRE(nvl != NULL);
967286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
968286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
969286796Soshogbo
970286796Soshogbo	nvlist_add_number_array(nvl, key, number, 8);
971286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
972286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
973286796Soshogbo	ATF_REQUIRE(nvlist_exists_number_array(nvl, key));
974286796Soshogbo
975286796Soshogbo	packed = nvlist_pack(nvl, &packed_size);
976286796Soshogbo	ATF_REQUIRE(packed != NULL);
977286796Soshogbo
978286796Soshogbo	unpacked = nvlist_unpack(packed, packed_size, 0);
979286796Soshogbo	ATF_REQUIRE(unpacked != NULL);
980286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(unpacked), 0);
981286796Soshogbo	ATF_REQUIRE(nvlist_exists_number_array(unpacked, key));
982286796Soshogbo
983286796Soshogbo	const_result = nvlist_get_number_array(unpacked, key, &count);
984293134Sngie	ATF_REQUIRE_EQ(count, nitems(number));
985286796Soshogbo	for (i = 0; i < count; i++) {
986286796Soshogbo		ATF_REQUIRE_EQ(number[i], const_result[i]);
987286796Soshogbo	}
988286796Soshogbo
989286796Soshogbo	nvlist_destroy(nvl);
990286796Soshogbo	nvlist_destroy(unpacked);
991286796Soshogbo	free(packed);
992286796Soshogbo}
993286796Soshogbo
994286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_descriptor_array__pack);
995286796SoshogboATF_TEST_CASE_BODY(nvlist_descriptor_array__pack)
996286796Soshogbo{
997286796Soshogbo	nvlist_t *nvl;
998286796Soshogbo	const char *key;
999293130Sngie	size_t num_items;
1000286796Soshogbo	unsigned int i;
1001286796Soshogbo	const int *const_result;
1002286796Soshogbo	int desc[32], fd, socks[2];
1003286796Soshogbo	pid_t pid;
1004286796Soshogbo
1005286796Soshogbo	key = "nvl/descriptor";
1006286796Soshogbo
1007286796Soshogbo	ATF_REQUIRE_EQ(socketpair(PF_UNIX, SOCK_STREAM, 0, socks), 0);
1008286796Soshogbo
1009286796Soshogbo	pid = atf::utils::fork();
1010286796Soshogbo	ATF_REQUIRE(pid >= 0);
1011286796Soshogbo	if (pid == 0) {
1012286796Soshogbo		/* Child. */
1013286796Soshogbo		fd = socks[0];
1014286796Soshogbo		close(socks[1]);
1015293134Sngie		for (i = 0; i < nitems(desc); i++) {
1016286796Soshogbo			desc[i] = dup(STDERR_FILENO);
1017286796Soshogbo			ATF_REQUIRE(fd_is_valid(desc[i]));
1018286796Soshogbo		}
1019286796Soshogbo
1020286796Soshogbo		nvl = nvlist_create(0);
1021286796Soshogbo		ATF_REQUIRE(nvl != NULL);
1022286796Soshogbo		ATF_REQUIRE(nvlist_empty(nvl));
1023286796Soshogbo		ATF_REQUIRE(!nvlist_exists_descriptor_array(nvl, key));
1024286796Soshogbo
1025293134Sngie		nvlist_add_descriptor_array(nvl, key, desc, nitems(desc));
1026286796Soshogbo		ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1027286796Soshogbo		ATF_REQUIRE(!nvlist_empty(nvl));
1028286796Soshogbo		ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
1029286796Soshogbo
1030286796Soshogbo		ATF_REQUIRE(nvlist_send(fd, nvl) >= 0);
1031286796Soshogbo
1032293134Sngie		for (i = 0; i < nitems(desc); i++)
1033286796Soshogbo			close(desc[i]);
1034286796Soshogbo	} else {
1035286796Soshogbo		/* Parent */
1036286796Soshogbo		fd = socks[1];
1037286796Soshogbo		close(socks[0]);
1038286796Soshogbo
1039286796Soshogbo		errno = 0;
1040286796Soshogbo		nvl = nvlist_recv(fd, 0);
1041286796Soshogbo		ATF_REQUIRE(nvl != NULL);
1042286796Soshogbo		ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1043286796Soshogbo		ATF_REQUIRE(nvlist_exists_descriptor_array(nvl, key));
1044286796Soshogbo
1045293130Sngie		const_result = nvlist_get_descriptor_array(nvl, key, &num_items);
1046286796Soshogbo		ATF_REQUIRE(const_result != NULL);
1047293134Sngie		ATF_REQUIRE_EQ(num_items, nitems(desc));
1048293130Sngie		for (i = 0; i < num_items; i++)
1049286796Soshogbo			ATF_REQUIRE(fd_is_valid(const_result[i]));
1050286796Soshogbo
1051286796Soshogbo		atf::utils::wait(pid, 0, "", "");
1052286796Soshogbo	}
1053286796Soshogbo
1054286796Soshogbo	nvlist_destroy(nvl);
1055286796Soshogbo	close(fd);
1056286796Soshogbo}
1057286796Soshogbo
1058286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_string_array__pack);
1059286796SoshogboATF_TEST_CASE_BODY(nvlist_string_array__pack)
1060286796Soshogbo{
1061286796Soshogbo	nvlist_t *nvl, *unpacked;
1062286796Soshogbo	const char *key;
1063286796Soshogbo	size_t packed_size, count;
1064286796Soshogbo	void *packed;
1065286796Soshogbo	unsigned int i;
1066286796Soshogbo	const char * const *const_result;
1067293131Sngie	const char *string_arr[8] = { "a", "b", "kot", "foo",
1068286796Soshogbo	    "tests", "nice test", "", "abcdef" };
1069286796Soshogbo
1070286796Soshogbo	key = "nvl/string";
1071286796Soshogbo	nvl = nvlist_create(0);
1072286796Soshogbo	ATF_REQUIRE(nvl != NULL);
1073286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
1074286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
1075286796Soshogbo
1076293134Sngie	nvlist_add_string_array(nvl, key, string_arr, nitems(string_arr));
1077286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1078286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
1079286796Soshogbo	ATF_REQUIRE(nvlist_exists_string_array(nvl, key));
1080286796Soshogbo
1081286796Soshogbo	packed = nvlist_pack(nvl, &packed_size);
1082286796Soshogbo	ATF_REQUIRE(packed != NULL);
1083286796Soshogbo
1084286796Soshogbo	unpacked = nvlist_unpack(packed, packed_size, 0);
1085286796Soshogbo	ATF_REQUIRE(unpacked != NULL);
1086286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(unpacked), 0);
1087286796Soshogbo	ATF_REQUIRE(nvlist_exists_string_array(unpacked, key));
1088286796Soshogbo
1089286796Soshogbo	const_result = nvlist_get_string_array(unpacked, key, &count);
1090293134Sngie	ATF_REQUIRE_EQ(count, nitems(string_arr));
1091286796Soshogbo	for (i = 0; i < count; i++) {
1092293131Sngie		ATF_REQUIRE_EQ(strcmp(string_arr[i], const_result[i]), 0);
1093286796Soshogbo	}
1094286796Soshogbo
1095286796Soshogbo	nvlist_destroy(nvl);
1096286796Soshogbo	nvlist_destroy(unpacked);
1097286796Soshogbo	free(packed);
1098286796Soshogbo}
1099286796Soshogbo
1100286796SoshogboATF_TEST_CASE_WITHOUT_HEAD(nvlist_nvlist_array__pack);
1101286796SoshogboATF_TEST_CASE_BODY(nvlist_nvlist_array__pack)
1102286796Soshogbo{
1103286796Soshogbo	nvlist_t *testnvl[8], *unpacked;
1104286796Soshogbo	const nvlist_t * const *const_result;
1105286796Soshogbo	nvlist_t *nvl;
1106293130Sngie	size_t num_items, packed_size;
1107286796Soshogbo	unsigned int i;
1108286796Soshogbo	void *packed;
1109286796Soshogbo	const char *somestr[8] = { "a", "b", "c", "d", "e", "f", "g", "h" };
1110286796Soshogbo	const char *key;
1111286796Soshogbo
1112293134Sngie	for (i = 0; i < nitems(testnvl); i++) {
1113286796Soshogbo		testnvl[i] = nvlist_create(0);
1114286796Soshogbo		ATF_REQUIRE(testnvl[i] != NULL);
1115286796Soshogbo		ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
1116286796Soshogbo		nvlist_add_string(testnvl[i], "nvl/string", somestr[i]);
1117286796Soshogbo		ATF_REQUIRE_EQ(nvlist_error(testnvl[i]), 0);
1118286796Soshogbo		ATF_REQUIRE(nvlist_exists_string(testnvl[i], "nvl/string"));
1119286796Soshogbo	}
1120286796Soshogbo
1121286796Soshogbo	key = "nvl/nvlist";
1122286796Soshogbo	nvl = nvlist_create(0);
1123286796Soshogbo	ATF_REQUIRE(nvl != NULL);
1124286796Soshogbo	ATF_REQUIRE(nvlist_empty(nvl));
1125286796Soshogbo	ATF_REQUIRE(!nvlist_exists_string_array(nvl, key));
1126286796Soshogbo
1127286796Soshogbo	nvlist_add_nvlist_array(nvl, key, (const nvlist_t * const *)testnvl, 8);
1128286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
1129286796Soshogbo	ATF_REQUIRE(!nvlist_empty(nvl));
1130286796Soshogbo	ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, key));
1131286796Soshogbo	ATF_REQUIRE(nvlist_exists_nvlist_array(nvl, "nvl/nvlist"));
1132286796Soshogbo	packed = nvlist_pack(nvl, &packed_size);
1133286796Soshogbo	ATF_REQUIRE(packed != NULL);
1134286796Soshogbo
1135286796Soshogbo	unpacked = nvlist_unpack(packed, packed_size, 0);
1136286796Soshogbo	ATF_REQUIRE(unpacked != NULL);
1137286796Soshogbo	ATF_REQUIRE_EQ(nvlist_error(unpacked), 0);
1138286796Soshogbo	ATF_REQUIRE(nvlist_exists_nvlist_array(unpacked, key));
1139286796Soshogbo
1140293130Sngie	const_result = nvlist_get_nvlist_array(unpacked, key, &num_items);
1141286796Soshogbo	ATF_REQUIRE(const_result != NULL);
1142293134Sngie	ATF_REQUIRE_EQ(num_items, nitems(testnvl));
1143293130Sngie	for (i = 0; i < num_items; i++) {
1144286796Soshogbo		ATF_REQUIRE_EQ(nvlist_error(const_result[i]), 0);
1145293130Sngie		if (i < num_items - 1) {
1146286796Soshogbo			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
1147286796Soshogbo			    const_result[i + 1]);
1148286796Soshogbo		} else {
1149286796Soshogbo			ATF_REQUIRE(nvlist_get_array_next(const_result[i]) ==
1150286796Soshogbo			    NULL);
1151286796Soshogbo		}
1152286796Soshogbo		ATF_REQUIRE(nvlist_get_parent(const_result[i], NULL) == unpacked);
1153286796Soshogbo		ATF_REQUIRE(nvlist_in_array(const_result[i]));
1154286796Soshogbo		ATF_REQUIRE(nvlist_exists_string(const_result[i],
1155286796Soshogbo		    "nvl/string"));
1156286796Soshogbo		ATF_REQUIRE(strcmp(nvlist_get_string(const_result[i],
1157286796Soshogbo		    "nvl/string"), somestr[i]) == 0);
1158286796Soshogbo	}
1159286796Soshogbo
1160293134Sngie	for (i = 0; i < nitems(testnvl); i++)
1161286796Soshogbo		nvlist_destroy(testnvl[i]);
1162286796Soshogbo	nvlist_destroy(nvl);
1163286796Soshogbo	nvlist_destroy(unpacked);
1164286796Soshogbo	free(packed);
1165286796Soshogbo}
1166286796Soshogbo
1167286796SoshogboATF_INIT_TEST_CASES(tp)
1168286796Soshogbo{
1169286796Soshogbo
1170286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_bool_array__basic);
1171286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_string_array__basic);
1172286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_descriptor_array__basic);
1173286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_number_array__basic);
1174286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_nvlist_array__basic)
1175286796Soshogbo
1176286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_clone_array)
1177286796Soshogbo
1178286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_bool_array__move);
1179286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_string_array__move);
1180286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_nvlist_array__move);
1181286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_number_array__move);
1182286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_descriptor_array__move);
1183286796Soshogbo
1184286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_arrays__error_null);
1185286796Soshogbo
1186286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_arrays__bad_value)
1187286796Soshogbo
1188286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_nvlist_array__travel)
1189286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_nvlist_array__travel_alternative)
1190286796Soshogbo
1191286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_bool_array__pack)
1192286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_number_array__pack)
1193286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_descriptor_array__pack)
1194286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_string_array__pack)
1195286796Soshogbo	ATF_ADD_TEST_CASE(tp, nvlist_nvlist_array__pack)
1196286796Soshogbo}
1197286796Soshogbo
1198