1235783Skib/*-
2235783Skib * Copyright (c) 2014-2015 Sandvine Inc.  All rights reserved.
3235783Skib * All rights reserved.
4235783Skib *
5235783Skib * Redistribution and use in source and binary forms, with or without
6235783Skib * modification, are permitted provided that the following conditions
7235783Skib * are met:
8235783Skib * 1. Redistributions of source code must retain the above copyright
9235783Skib *    notice, this list of conditions and the following disclaimer.
10235783Skib * 2. Redistributions in binary form must reproduce the above copyright
11235783Skib *    notice, this list of conditions and the following disclaimer in the
12235783Skib *    documentation and/or other materials provided with the distribution.
13235783Skib *
14235783Skib * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15235783Skib * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16235783Skib * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17235783Skib * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18235783Skib * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19235783Skib * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20235783Skib * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21235783Skib * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22235783Skib * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23235783Skib * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24235783Skib * SUCH DAMAGE.
25235783Skib */
26235783Skib
27235783Skib#include <sys/cdefs.h>
28235783Skib__FBSDID("$FreeBSD: stable/10/lib/libnv/tests/nv_tests.cc 319370 2017-06-01 06:16:57Z ngie $");
29235783Skib
30235783Skib#include <atf-c++.hpp>
31235783Skib#include <nv.h>
32235783Skib
33235783Skib#include <errno.h>
34235783Skib#include <limits>
35235783Skib#include <set>
36235783Skib#include <sstream>
37235783Skib#include <string>
38235783Skib
39235783Skib/*
40235783Skib * Test that a newly created nvlist has no errors, and is empty.
41235783Skib */
42235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
43235783SkibATF_TEST_CASE_BODY(nvlist_create__is_empty)
44235783Skib{
45235783Skib	nvlist_t *nvl;
46235783Skib	int type;
47235783Skib	void *it;
48235783Skib
49235783Skib	nvl = nvlist_create(0);
50235783Skib
51235783Skib	ATF_REQUIRE(nvl != NULL);
52235783Skib
53235783Skib	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
54235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
55235783Skib
56235783Skib	it = NULL;
57235783Skib	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
58235783Skib
59235783Skib	nvlist_destroy(nvl);
60235783Skib}
61235783Skib
62235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
63235783SkibATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
64235783Skib{
65235783Skib	nvlist_t *nvl;
66235783Skib	void *it;
67235783Skib	const char *key;
68235783Skib	int type;
69235783Skib
70235783Skib	key = "key";
71235783Skib	nvl = nvlist_create(0);
72235783Skib
73235783Skib	ATF_REQUIRE(nvl != NULL);
74235783Skib	ATF_REQUIRE(!nvlist_exists(nvl, key));
75235783Skib
76235783Skib	nvlist_add_null(nvl, key);
77235783Skib
78235783Skib	ATF_REQUIRE(!nvlist_empty(nvl));
79235783Skib	ATF_REQUIRE(nvlist_exists(nvl, key));
80235783Skib	ATF_REQUIRE(nvlist_exists_null(nvl, key));
81235783Skib	ATF_REQUIRE(nvlist_exists_null(nvl, "key"));
82235783Skib
83235783Skib	/* Iterate over the nvlist; ensure that it has only our one key. */
84235783Skib	it = NULL;
85235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
86235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
87235783Skib	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
88235783Skib
89235783Skib	nvlist_destroy(nvl);
90235783Skib}
91235783Skib
92235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
93235783SkibATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
94235783Skib{
95235783Skib	nvlist_t *nvl;
96235783Skib	void *it;
97235783Skib	const char *key;
98235783Skib	int type;
99235783Skib
100235783Skib	key = "name";
101235783Skib	nvl = nvlist_create(0);
102235783Skib
103235783Skib	ATF_REQUIRE(nvl != NULL);
104235783Skib	ATF_REQUIRE(!nvlist_exists(nvl, key));
105235783Skib
106235783Skib	nvlist_add_bool(nvl, key, true);
107235783Skib
108235783Skib	ATF_REQUIRE(!nvlist_empty(nvl));
109235783Skib	ATF_REQUIRE(nvlist_exists(nvl, key));
110235783Skib	ATF_REQUIRE(nvlist_exists(nvl, "name"));
111235783Skib	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
112235783Skib	ATF_REQUIRE(nvlist_exists_bool(nvl, "name"));
113235783Skib	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
114235783Skib
115235783Skib	/* Iterate over the nvlist; ensure that it has only our one key. */
116235783Skib	it = NULL;
117235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
118235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
119235783Skib	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
120235783Skib
121235783Skib	nvlist_destroy(nvl);
122235783Skib}
123235783Skib
124235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
125235783SkibATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
126235783Skib{
127235783Skib	nvlist_t *nvl;
128235783Skib	void *it;
129235783Skib	const char *key;
130235783Skib	uint64_t value;
131235783Skib	int type;
132235783Skib
133235783Skib	key = "foo123";
134235783Skib	value = 71965;
135235783Skib	nvl = nvlist_create(0);
136235783Skib
137235783Skib	ATF_REQUIRE(nvl != NULL);
138235783Skib	ATF_REQUIRE(!nvlist_exists(nvl, key));
139235783Skib
140235783Skib	nvlist_add_number(nvl, key, value);
141235783Skib
142235783Skib	ATF_REQUIRE(!nvlist_empty(nvl));
143235783Skib	ATF_REQUIRE(nvlist_exists(nvl, key));
144235783Skib	ATF_REQUIRE(nvlist_exists(nvl, "foo123"));
145235783Skib	ATF_REQUIRE(nvlist_exists_number(nvl, key));
146235783Skib	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
147235783Skib
148235783Skib	/* Iterate over the nvlist; ensure that it has only our one key. */
149235783Skib	it = NULL;
150235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
151235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
152235783Skib	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
153235783Skib
154235783Skib	nvlist_destroy(nvl);
155235783Skib}
156235783Skib
157235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
158235783SkibATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
159235783Skib{
160235783Skib	nvlist_t *nvl;
161235783Skib	void *it;
162235783Skib	const char *key;
163235783Skib	const char *value;
164235783Skib	int type;
165235783Skib
166235783Skib	key = "test";
167235783Skib	value = "fgjdkgjdk";
168235783Skib	nvl = nvlist_create(0);
169235783Skib
170235783Skib	ATF_REQUIRE(nvl != NULL);
171235783Skib	ATF_REQUIRE(!nvlist_exists(nvl, key));
172235783Skib
173261632Sdumbbell	nvlist_add_string(nvl, key, value);
174261632Sdumbbell
175261632Sdumbbell	ATF_REQUIRE(!nvlist_empty(nvl));
176235783Skib	ATF_REQUIRE(nvlist_exists(nvl, key));
177235783Skib	ATF_REQUIRE(nvlist_exists(nvl, "test"));
178235783Skib	ATF_REQUIRE(nvlist_exists_string(nvl, key));
179235783Skib	ATF_REQUIRE(nvlist_exists_string(nvl, "test"));
180235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
181235783Skib
182235783Skib	/* nvlist_add_* is required to clone the value, so check for that. */
183235783Skib	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
184235783Skib
185235783Skib	/* Iterate over the nvlist; ensure that it has only our one key. */
186235783Skib	it = NULL;
187235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
188235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
189235783Skib	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
190235783Skib
191235783Skib	nvlist_destroy(nvl);
192235783Skib}
193235783Skib
194235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
195235783SkibATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
196235783Skib{
197235783Skib	nvlist_t *nvl;
198235783Skib	void *it;
199235783Skib	const char *key, *subkey;
200235783Skib	nvlist_t *sublist;
201235783Skib	const nvlist_t *value;
202235783Skib	int type;
203235783Skib
204235783Skib	key = "test";
205235783Skib	subkey = "subkey";
206235783Skib	sublist = nvlist_create(0);
207235783Skib	nvl = nvlist_create(0);
208235783Skib
209235783Skib	ATF_REQUIRE(nvl != NULL);
210235783Skib	ATF_REQUIRE(!nvlist_exists(nvl, key));
211235783Skib
212235783Skib	nvlist_add_null(sublist, subkey);
213235783Skib	nvlist_add_nvlist(nvl, key, sublist);
214235783Skib
215235783Skib	ATF_REQUIRE(!nvlist_empty(nvl));
216235783Skib	ATF_REQUIRE(nvlist_exists(nvl, key));
217235783Skib	ATF_REQUIRE(nvlist_exists(nvl, "test"));
218235783Skib	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
219235783Skib	ATF_REQUIRE(nvlist_exists_nvlist(nvl, "test"));
220235783Skib
221235783Skib	value = nvlist_get_nvlist(nvl, key);
222235783Skib	ATF_REQUIRE(nvlist_exists_null(value, subkey));
223235783Skib
224235783Skib	/* nvlist_add_* is required to clone the value, so check for that. */
225235783Skib	ATF_REQUIRE(sublist != value);
226235783Skib
227235783Skib	/* Iterate over the nvlist; ensure that it has only our one key. */
228235783Skib	it = NULL;
229235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
230235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
231235783Skib	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
232235783Skib
233235783Skib	nvlist_destroy(sublist);
234235783Skib	nvlist_destroy(nvl);
235235783Skib}
236235783Skib
237235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error);
238235783SkibATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error)
239235783Skib{
240235783Skib	nvlist_t *nvl, *parent;
241235783Skib
242235783Skib	nvl = nvlist_create(0);
243235783Skib	parent = nvlist_create(0);
244235783Skib
245235783Skib	nvlist_set_error(nvl, EBADF);
246235783Skib	nvlist_add_nvlist(parent, "test", nvl);
247235783Skib	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
248235783Skib
249235783Skib	nvlist_destroy(nvl);
250235783Skib	nvlist_destroy(parent);
251235783Skib}
252235783Skib
253235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
254235783SkibATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
255235783Skib{
256235783Skib	nvlist_t *nvl;
257235783Skib	void *it;
258235783Skib	const char *key;
259235783Skib	void *value;
260235783Skib	const void *ret_value;
261235783Skib	size_t value_size, ret_size;
262235783Skib	int type;
263235783Skib
264235783Skib	key = "binary";
265235783Skib	value_size = 13;
266235783Skib	value = malloc(value_size);
267235783Skib	memset(value, 0xa5, value_size);
268235783Skib	nvl = nvlist_create(0);
269235783Skib
270235783Skib	ATF_REQUIRE(nvl != NULL);
271235783Skib	ATF_REQUIRE(!nvlist_exists(nvl, key));
272235783Skib
273235783Skib	nvlist_add_binary(nvl, key, value, value_size);
274235783Skib
275235783Skib	ATF_REQUIRE(!nvlist_empty(nvl));
276235783Skib	ATF_REQUIRE(nvlist_exists(nvl, key));
277235783Skib	ATF_REQUIRE(nvlist_exists(nvl, "binary"));
278235783Skib	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
279235783Skib	ATF_REQUIRE(nvlist_exists_binary(nvl, "binary"));
280235783Skib
281235783Skib	ret_value = nvlist_get_binary(nvl, key, &ret_size);
282235783Skib	ATF_REQUIRE_EQ(value_size, ret_size);
283235783Skib	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
284235783Skib
285235783Skib	/* nvlist_add_* is required to clone the value, so check for that. */
286235783Skib	ATF_REQUIRE(value != ret_value);
287235783Skib
288235783Skib	/* Iterate over the nvlist; ensure that it has only our one key. */
289235783Skib	it = NULL;
290235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
291235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
292235783Skib	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
293235783Skib
294235783Skib	nvlist_destroy(nvl);
295235783Skib	free(value);
296235783Skib}
297235783Skib
298235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist);
299235783SkibATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist)
300235783Skib{
301235783Skib	nvlist_t *nvl, *clone;
302235783Skib
303235783Skib	nvl = nvlist_create(0);
304235783Skib	ATF_REQUIRE(nvl != NULL);
305235783Skib
306235783Skib	clone = nvlist_clone(nvl);
307235783Skib	ATF_REQUIRE(clone != NULL);
308235783Skib	ATF_REQUIRE(clone != nvl);
309235783Skib	ATF_REQUIRE(nvlist_empty(clone));
310235783Skib
311235783Skib	nvlist_destroy(clone);
312235783Skib	nvlist_destroy(nvl);
313235783Skib}
314235783Skib
315235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist);
316235783SkibATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist)
317235783Skib{
318235783Skib	nvlist_t *nvl, *clone;
319235783Skib	const char *key;
320235783Skib	void *it;
321235783Skib	uint64_t value;
322235783Skib	int type;
323235783Skib
324235783Skib	nvl = nvlist_create(0);
325235783Skib	ATF_REQUIRE(nvl != NULL);
326235783Skib
327235783Skib	key = "testkey";
328235783Skib	value = 684874;
329235783Skib	nvlist_add_number(nvl, key, value);
330235783Skib
331235783Skib	clone = nvlist_clone(nvl);
332235783Skib	ATF_REQUIRE(clone != NULL);
333235783Skib	ATF_REQUIRE(clone != nvl);
334235783Skib	ATF_REQUIRE(nvlist_exists_number(clone, key));
335235783Skib	ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value);
336235783Skib
337235783Skib	/* Iterate over the nvlist; ensure that it has only our one key. */
338235783Skib	it = NULL;
339235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0);
340235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
341235783Skib	ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), static_cast<const char *>(NULL));
342235783Skib
343235783Skib	nvlist_destroy(clone);
344235783Skib	nvlist_destroy(nvl);
345235783Skib}
346235783Skib
347235783Skibstatic const char * const test_subnvlist_key = "nvlist";
348235783Skib
349235783Skibstatic const char * const test_string_key = "string";
350235783Skibstatic const char * const test_string_val = "59525";
351235783Skib
352235783Skibstatic nvlist_t*
353235783Skibcreate_test_nvlist(void)
354235783Skib{
355235783Skib	nvlist_t *nvl, *sublist;
356235783Skib
357235783Skib	nvl = nvlist_create(0);
358235783Skib	ATF_REQUIRE(nvl != NULL);
359235783Skib
360235783Skib	sublist = nvlist_create(0);
361235783Skib	ATF_REQUIRE(sublist != NULL);
362235783Skib
363235783Skib	nvlist_add_string(sublist, test_string_key, test_string_val);
364235783Skib	nvlist_move_nvlist(nvl, test_subnvlist_key, sublist);
365235783Skib
366235783Skib	return (nvl);
367235783Skib}
368235783Skib
369235783Skibstatic void
370235783Skibverify_test_nvlist(const nvlist_t *nvl)
371235783Skib{
372235783Skib	void *it;
373235783Skib	const nvlist_t *value;
374235783Skib	int type;
375235783Skib
376235783Skib	ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key));
377235783Skib
378235783Skib	value = nvlist_get_nvlist(nvl, test_subnvlist_key);
379235783Skib
380235783Skib	ATF_REQUIRE(nvlist_exists_string(value, test_string_key));
381235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0);
382235783Skib	ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val);
383235783Skib
384235783Skib	/* Iterate over both nvlists; ensure that each has only the one key. */
385235783Skib	it = NULL;
386235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it),
387235783Skib	    test_string_key), 0);
388235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
389235783Skib	ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), static_cast<const char *>(NULL));
390235783Skib
391235783Skib	it = NULL;
392235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it),
393235783Skib	    test_subnvlist_key), 0);
394235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
395235783Skib	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
396235783Skib}
397235783Skib
398235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist);
399235783SkibATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist)
400235783Skib{
401235783Skib	nvlist_t *nvl, *clone;
402235783Skib
403235783Skib	nvl = create_test_nvlist();
404235783Skib	clone = nvlist_clone(nvl);
405235783Skib
406235783Skib	ATF_REQUIRE(clone != NULL);
407235783Skib	ATF_REQUIRE(clone != nvl);
408235783Skib	verify_test_nvlist(clone);
409235783Skib
410235783Skib	nvlist_destroy(clone);
411235783Skib	nvlist_destroy(nvl);
412235783Skib}
413235783Skib
414235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist);
415235783SkibATF_TEST_CASE_BODY(nvlist_clone__error_nvlist)
416235783Skib{
417235783Skib	nvlist_t *nvl, *clone;
418235783Skib
419235783Skib	nvl = nvlist_create(0);
420235783Skib	ATF_REQUIRE(nvl != NULL);
421235783Skib
422235783Skib	nvlist_set_error(nvl, ENOMEM);
423235783Skib
424235783Skib	clone = nvlist_clone(nvl);
425235783Skib	ATF_REQUIRE(clone == NULL);
426235783Skib
427235783Skib	nvlist_destroy(nvl);
428235783Skib}
429235783Skib
430235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist);
431235783SkibATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist)
432235783Skib{
433235783Skib	nvlist_t *nvl, *unpacked;
434235783Skib	void *packed;
435235783Skib	size_t packed_size;
436235783Skib
437235783Skib	nvl = nvlist_create(0);
438235783Skib	ATF_REQUIRE(nvl != NULL);
439235783Skib
440235783Skib	packed = nvlist_pack(nvl, &packed_size);
441235783Skib	ATF_REQUIRE(packed != NULL);
442235783Skib
443235783Skib	unpacked = nvlist_unpack(packed, packed_size);
444235783Skib	ATF_REQUIRE(unpacked != NULL);
445235783Skib	ATF_REQUIRE(unpacked != nvl);
446235783Skib	ATF_REQUIRE(nvlist_empty(unpacked));
447235783Skib
448235783Skib	nvlist_destroy(unpacked);
449235783Skib	nvlist_destroy(nvl);
450235783Skib	free(packed);
451235783Skib}
452235783Skib
453235783Skibstatic void
454235783Skibverify_null(const nvlist_t *nvl, int type)
455235783Skib{
456235783Skib
457235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
458235783Skib}
459235783Skib
460235783Skibstatic void
461235783Skibverify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value)
462235783Skib{
463235783Skib
464235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
465235783Skib	ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value);
466235783Skib}
467235783Skib
468235783Skibstatic void
469235783Skibverify_string(const nvlist_t *nvl, const char *name, int type,
470235783Skib    const char * value)
471235783Skib{
472235783Skib
473235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
474235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0);
475235783Skib}
476235783Skib
477235783Skibstatic void
478235783Skibverify_nvlist(const nvlist_t *nvl, const char *name, int type)
479235783Skib{
480235783Skib
481235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
482235783Skib	verify_test_nvlist(nvlist_get_nvlist(nvl, name));
483235783Skib}
484235783Skib
485235783Skibstatic void
486235783Skibverify_binary(const nvlist_t *nvl, const char *name, int type,
487235783Skib    const void * value, size_t size)
488235783Skib{
489235783Skib	const void *actual_value;
490235783Skib	size_t actual_size;
491235783Skib
492235783Skib	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
493235783Skib	actual_value = nvlist_get_binary(nvl, name, &actual_size);
494235783Skib	ATF_REQUIRE_EQ(size, actual_size);
495235783Skib	ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0);
496235783Skib}
497235783Skib
498235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values);
499235783SkibATF_TEST_CASE_BODY(nvlist_pack__multiple_values)
500235783Skib{
501235783Skib	std::ostringstream msg;
502235783Skib	std::set<std::string> keys_seen;
503235783Skib	nvlist_t *nvl, *unpacked, *nvvalue;
504235783Skib	const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name;
505235783Skib	int numvalue;
506235783Skib	const char * strvalue;
507235783Skib	void *binvalue, *packed, *it;
508235783Skib	size_t binsize, packed_size;
509235783Skib	int type;
510235783Skib
511235783Skib	nvl = nvlist_create(0);
512235783Skib
513235783Skib	nullkey = "null";
514235783Skib	nvlist_add_null(nvl, nullkey);
515235783Skib
516235783Skib	numkey = "number";
517235783Skib	numvalue = 939853984;
518235783Skib	nvlist_add_number(nvl, numkey, numvalue);
519235783Skib
520235783Skib	strkey = "string";
521235783Skib	strvalue = "jfieutijf";
522235783Skib	nvlist_add_string(nvl, strkey, strvalue);
523235783Skib
524235783Skib	nvkey = "nvlist";
525235783Skib	nvvalue = create_test_nvlist();
526261632Sdumbbell	nvlist_move_nvlist(nvl, nvkey, nvvalue);
527261632Sdumbbell
528235783Skib	binkey = "binary";
529235783Skib	binsize = 4;
530235783Skib	binvalue = malloc(binsize);
531235783Skib	memset(binvalue, 'b', binsize);
532235783Skib	nvlist_move_binary(nvl, binkey, binvalue, binsize);
533235783Skib
534235783Skib	packed = nvlist_pack(nvl, &packed_size);
535235783Skib	ATF_REQUIRE(packed != NULL);
536235783Skib
537235783Skib	unpacked = nvlist_unpack(packed, packed_size);
538235783Skib	ATF_REQUIRE(unpacked != 0);
539235783Skib
540235783Skib	it = NULL;
541235783Skib	while ((name = nvlist_next(unpacked, &type, &it)) != NULL) {
542235783Skib		/* Ensure that we see every key only once. */
543235783Skib		ATF_REQUIRE_EQ(keys_seen.count(name), 0);
544235783Skib
545235783Skib		if (strcmp(name, nullkey) == 0)
546235783Skib			verify_null(unpacked, type);
547235783Skib		else if (strcmp(name, numkey) == 0)
548235783Skib			verify_number(unpacked, name, type, numvalue);
549235783Skib		else if (strcmp(name, strkey) == 0)
550235783Skib			verify_string(unpacked, name, type, strvalue);
551235783Skib		else if (strcmp(name, nvkey) == 0)
552235783Skib			verify_nvlist(unpacked, name, type);
553235783Skib		else if (strcmp(name, binkey) == 0)
554235783Skib			verify_binary(unpacked, name, type, binvalue, binsize);
555235783Skib		else {
556235783Skib			msg << "Unexpected key :'" << name << "'";
557235783Skib			ATF_FAIL(msg.str().c_str());
558235783Skib		}
559235783Skib
560235783Skib		keys_seen.insert(name);
561235783Skib	}
562235783Skib
563235783Skib	/* Ensure that we saw every key. */
564235783Skib	ATF_REQUIRE_EQ(keys_seen.size(), 5);
565235783Skib
566235783Skib	nvlist_destroy(nvl);
567235783Skib	nvlist_destroy(unpacked);
568235783Skib	free(packed);
569235783Skib}
570235783Skib
571235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist);
572235783SkibATF_TEST_CASE_BODY(nvlist_pack__error_nvlist)
573235783Skib{
574235783Skib	nvlist_t *nvl;
575235783Skib	void *packed;
576235783Skib	size_t size;
577235783Skib
578235783Skib	nvl = nvlist_create(0);
579235783Skib	ATF_REQUIRE(nvl != NULL);
580235783Skib
581235783Skib	nvlist_set_error(nvl, ENOMEM);
582235783Skib
583235783Skib	packed = nvlist_pack(nvl, &size);
584235783Skib	ATF_REQUIRE(packed == NULL);
585235783Skib
586235783Skib	nvlist_destroy(nvl);
587235783Skib}
588235783Skib
589235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key);
590235783SkibATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key)
591235783Skib{
592235783Skib	nvlist_t *nvl, *unpacked;
593235783Skib	const char *key1, *key2;
594235783Skib	void *packed, *keypos;
595235783Skib	size_t size, keylen;
596235783Skib
597235783Skib	nvl = nvlist_create(0);
598235783Skib
599235783Skib	key1 = "key1";
600235783Skib	keylen = strlen(key1);
601235783Skib	nvlist_add_number(nvl, key1, 5);
602235783Skib
603235783Skib	key2 = "key2";
604235783Skib	ATF_REQUIRE_EQ(keylen, strlen(key2));
605235783Skib	nvlist_add_number(nvl, key2, 10);
606235783Skib
607235783Skib	packed = nvlist_pack(nvl, &size);
608235783Skib	ATF_REQUIRE(packed != NULL);
609235783Skib
610235783Skib	/*
611235783Skib	 * Mangle the packed nvlist by replacing key1 with key2, creating a
612235783Skib	 * packed nvlist with a duplicate key.
613235783Skib	 */
614235783Skib	keypos = memmem(packed, size, key1, keylen);
615235783Skib	ATF_REQUIRE(keypos != NULL);
616235783Skib	memcpy(keypos, key2, keylen);
617235783Skib
618235783Skib	unpacked = nvlist_unpack(packed, size);
619235783Skib	ATF_REQUIRE(nvlist_error(unpacked) != 0);
620235783Skib
621235783Skib	free(packed);
622235783Skib	nvlist_destroy(nvl);
623235783Skib	nvlist_destroy(unpacked);
624235783Skib}
625235783Skib
626235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert);
627235783SkibATF_TEST_CASE_BODY(nvlist_move_string__single_insert)
628235783Skib{
629235783Skib	nvlist_t *nvl;
630235783Skib	const char *key;
631235783Skib	char *value;
632235783Skib
633235783Skib	nvl = nvlist_create(0);
634235783Skib	ATF_REQUIRE(nvl != NULL);
635235783Skib
636235783Skib	key = "testkey";
637235783Skib	value = strdup("testval");
638235783Skib	ATF_REQUIRE(value != NULL);
639235783Skib
640235783Skib	nvlist_move_string(nvl, key, value);
641235783Skib	ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value);
642235783Skib
643235783Skib	nvlist_destroy(nvl);
644235783Skib}
645235783Skib
646235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child);
647235783SkibATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child)
648235783Skib{
649235783Skib	nvlist_t *parent;
650235783Skib
651235783Skib	parent = nvlist_create(0);
652235783Skib
653235783Skib	nvlist_move_nvlist(parent, "test", NULL);
654235783Skib
655235783Skib	ATF_REQUIRE(nvlist_error(parent) != 0);
656235783Skib
657235783Skib	nvlist_destroy(parent);
658235783Skib}
659235783Skib
660235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error);
661235783SkibATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error)
662235783Skib{
663235783Skib	nvlist_t *nvl, *parent;
664235783Skib
665235783Skib	nvl = nvlist_create(0);
666235783Skib	parent = nvlist_create(0);
667235783Skib
668235783Skib	nvlist_set_error(nvl, EBADF);
669235783Skib	nvlist_move_nvlist(parent, "test", nvl);
670235783Skib	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
671235783Skib
672235783Skib	nvlist_destroy(parent);
673235783Skib}
674235783Skib
675235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert);
676235783SkibATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert)
677235783Skib{
678235783Skib	nvlist_t *nvl;
679235783Skib	const char *key;
680235783Skib	nvlist_t *value;
681235783Skib
682235783Skib	nvl = nvlist_create(0);
683235783Skib	ATF_REQUIRE(nvl != NULL);
684235783Skib
685235783Skib	key = "testkey";
686235783Skib	value = nvlist_create(0);
687235783Skib	ATF_REQUIRE(value != NULL);
688235783Skib
689235783Skib	nvlist_move_nvlist(nvl, key, value);
690235783Skib	ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value);
691235783Skib
692235783Skib	nvlist_destroy(nvl);
693235783Skib}
694235783Skib
695235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert);
696235783SkibATF_TEST_CASE_BODY(nvlist_move_binary__single_insert)
697235783Skib{
698235783Skib	nvlist_t *nvl;
699235783Skib	const char *key;
700235783Skib	void *value;
701235783Skib	size_t size, actual_size;
702235783Skib
703235783Skib	nvl = nvlist_create(0);
704235783Skib	ATF_REQUIRE(nvl != NULL);
705235783Skib
706235783Skib	key = "testkey";
707235783Skib	size = 73;
708235783Skib	value = malloc(size);
709235783Skib	ATF_REQUIRE(value != NULL);
710235783Skib
711235783Skib	nvlist_move_binary(nvl, key, value, size);
712235783Skib	ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value);
713235783Skib	ATF_REQUIRE_EQ(size, actual_size);
714235783Skib
715235783Skib	nvlist_destroy(nvl);
716235783Skib}
717235783Skib
718235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove);
719235783SkibATF_TEST_CASE_BODY(nvlist_take_bool__single_remove)
720235783Skib{
721235783Skib	nvlist_t *nvl;
722235783Skib	const char *testkey;
723235783Skib	bool testval;
724235783Skib
725235783Skib	nvl = nvlist_create(0);
726235783Skib	ATF_REQUIRE(nvl != NULL);
727235783Skib
728235783Skib	testkey = "boolkey";
729235783Skib	testval = false;
730235783Skib	nvlist_add_bool(nvl, testkey, testval);
731235783Skib
732235783Skib	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
733235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
734235783Skib
735235783Skib	nvlist_destroy(nvl);
736235783Skib}
737235783Skib
738235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged);
739235783SkibATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged)
740235783Skib{
741235783Skib	nvlist_t *nvl;
742235783Skib	const char *testkey, *otherkey1, *otherkey2;
743235783Skib	bool testval, otherval1;
744235783Skib	nvlist_t *otherval2;
745235783Skib
746235783Skib	nvl = nvlist_create(0);
747235783Skib	ATF_REQUIRE(nvl != NULL);
748235783Skib
749235783Skib	testkey = "boolkey";
750235783Skib	testval = true;
751235783Skib	nvlist_add_bool(nvl, testkey, testval);
752235783Skib
753235783Skib	otherkey1 = "key1";
754235783Skib	otherval1 = false;
755235783Skib	nvlist_add_bool(nvl, otherkey1, otherval1);
756235783Skib
757235783Skib	otherkey2 = "key2";
758235783Skib	otherval2 = create_test_nvlist();
759235783Skib	nvlist_move_nvlist(nvl, otherkey2, otherval2);
760235783Skib
761235783Skib	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
762235783Skib
763235783Skib	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1));
764235783Skib	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1);
765235783Skib
766235783Skib	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2));
767235783Skib	verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2));
768235783Skib
769235783Skib	nvlist_destroy(nvl);
770235783Skib}
771235783Skib
772235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove);
773235783SkibATF_TEST_CASE_BODY(nvlist_take_number__single_remove)
774235783Skib{
775235783Skib	nvlist_t *nvl;
776235783Skib	const char *testkey;
777235783Skib	uint64_t testval;
778235783Skib
779235783Skib	nvl = nvlist_create(0);
780235783Skib	ATF_REQUIRE(nvl != NULL);
781235783Skib
782235783Skib	testkey = "numkey";
783235783Skib	testval = std::numeric_limits<uint64_t>::max();
784235783Skib	nvlist_add_number(nvl, testkey, testval);
785235783Skib
786235783Skib	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
787235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
788235783Skib
789235783Skib	nvlist_destroy(nvl);
790235783Skib}
791235783Skib
792235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged);
793235783SkibATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged)
794235783Skib{
795235783Skib	nvlist_t *nvl;
796235783Skib	const char *testkey, *otherkey1, *otherkey2;
797235783Skib	uint64_t testval, otherval1;
798235783Skib	const char *otherval2;
799235783Skib
800235783Skib	nvl = nvlist_create(0);
801235783Skib	ATF_REQUIRE(nvl != NULL);
802235783Skib
803235783Skib	otherkey1 = "key1";
804235783Skib	otherval1 = 5;
805235783Skib	nvlist_add_number(nvl, otherkey1, otherval1);
806235783Skib
807235783Skib	testkey = "numkey";
808235783Skib	testval = 1654;
809235783Skib	nvlist_add_number(nvl, testkey, testval);
810235783Skib
811235783Skib	otherkey2 = "key2";
812235783Skib	otherval2 = "string";
813235783Skib	nvlist_add_string(nvl, otherkey2, otherval2);
814235783Skib
815235783Skib	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
816235783Skib
817235783Skib	ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1));
818235783Skib	ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1);
819235783Skib
820235783Skib	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2));
821235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0);
822235783Skib
823235783Skib	nvlist_destroy(nvl);
824235783Skib}
825235783Skib
826235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove);
827235783SkibATF_TEST_CASE_BODY(nvlist_take_string__single_remove)
828235783Skib{
829235783Skib	nvlist_t *nvl;
830235783Skib	const char *testkey;
831235783Skib	const char *testval;
832235783Skib
833235783Skib	nvl = nvlist_create(0);
834235783Skib	ATF_REQUIRE(nvl != NULL);
835235783Skib
836235783Skib	testkey = "numkey";
837235783Skib	testval = "nvlist";
838235783Skib	nvlist_add_string(nvl, testkey, testval);
839235783Skib
840235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
841235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
842235783Skib
843235783Skib	nvlist_destroy(nvl);
844235783Skib}
845235783Skib
846235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged);
847235783SkibATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged)
848235783Skib{
849235783Skib	nvlist_t *nvl;
850235783Skib	const char *testkey, *otherkey1, *otherkey2;
851235783Skib	const char *testval, *otherval1;
852235783Skib	bool otherval2;
853235783Skib
854235783Skib	nvl = nvlist_create(0);
855235783Skib	ATF_REQUIRE(nvl != NULL);
856235783Skib
857235783Skib	otherkey1 = "key1";
858235783Skib	otherval1 = "fjdifjdk";
859235783Skib	nvlist_add_string(nvl, otherkey1, otherval1);
860235783Skib
861235783Skib	otherkey2 = "key2";
862235783Skib	otherval2 = true;
863235783Skib	nvlist_add_bool(nvl, otherkey2, otherval2);
864235783Skib
865235783Skib	testkey = "strkey";
866235783Skib	testval = "1654";
867235783Skib	nvlist_add_string(nvl, testkey, testval);
868235783Skib
869235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
870235783Skib
871235783Skib	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1));
872235783Skib	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0);
873235783Skib
874235783Skib	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
875235783Skib	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
876235783Skib
877235783Skib	nvlist_destroy(nvl);
878235783Skib}
879235783Skib
880235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove);
881235783SkibATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove)
882235783Skib{
883235783Skib	nvlist_t *nvl;
884235783Skib	const char *testkey;
885235783Skib	nvlist_t *testval;
886235783Skib
887235783Skib	nvl = nvlist_create(0);
888235783Skib	ATF_REQUIRE(nvl != NULL);
889235783Skib
890235783Skib	testkey = "numkey";
891235783Skib	testval = create_test_nvlist();
892235783Skib	nvlist_move_nvlist(nvl, testkey, testval);
893235783Skib
894235783Skib	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
895235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
896235783Skib
897235783Skib	nvlist_destroy(nvl);
898235783Skib}
899235783Skib
900235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged);
901235783SkibATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged)
902235783Skib{
903235783Skib	nvlist_t *nvl;
904235783Skib	const char *testkey, *otherkey1, *otherkey2;
905235783Skib	nvlist_t *testval, *otherval1;
906235783Skib
907235783Skib	nvl = nvlist_create(0);
908235783Skib	ATF_REQUIRE(nvl != NULL);
909235783Skib
910235783Skib	testkey = "strkey";
911235783Skib	testval = create_test_nvlist();
912235783Skib	nvlist_move_nvlist(nvl, testkey, testval);
913235783Skib
914235783Skib	otherkey1 = "key1";
915235783Skib	otherval1 = nvlist_create(0);
916235783Skib	nvlist_move_nvlist(nvl, otherkey1, otherval1);
917235783Skib
918235783Skib	otherkey2 = "key2";
919235783Skib	nvlist_add_null(nvl, otherkey2);
920235783Skib
921235783Skib	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
922235783Skib
923235783Skib	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1));
924235783Skib	ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1)));
925235783Skib
926235783Skib	ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2));
927235783Skib
928235783Skib	nvlist_destroy(nvl);
929235783Skib}
930235783Skib
931235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove);
932235783SkibATF_TEST_CASE_BODY(nvlist_take_binary__single_remove)
933235783Skib{
934235783Skib	nvlist_t *nvl;
935235783Skib	const char *testkey;
936235783Skib	void *testval;
937235783Skib	const void *actual_val;
938235783Skib	size_t testsize, actual_size;
939235783Skib
940235783Skib	nvl = nvlist_create(0);
941235783Skib	ATF_REQUIRE(nvl != NULL);
942235783Skib
943235783Skib	testkey = "numkey";
944235783Skib	testsize = 457;
945235783Skib	testval = malloc(testsize);
946235783Skib	memset(testval, '5', testsize);
947235783Skib	nvlist_move_binary(nvl, testkey, testval, testsize);
948235783Skib
949235783Skib	actual_val = nvlist_take_binary(nvl, testkey, &actual_size);
950235783Skib	ATF_REQUIRE_EQ(testsize, actual_size);
951235783Skib	ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0);
952235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
953235783Skib
954235783Skib	nvlist_destroy(nvl);
955235783Skib}
956235783Skib
957235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged);
958235783SkibATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged)
959235783Skib{
960235783Skib	nvlist_t *nvl;
961235783Skib	const char *testkey, *otherkey1, *otherkey2;
962235783Skib	const void *actual_value;
963235783Skib	char testval[] = "gjiertj";
964235783Skib	char otherval1[] = "fdreg";
965235783Skib	size_t testsize, othersize, actual_size;
966235783Skib	bool otherval2;
967235783Skib
968235783Skib	nvl = nvlist_create(0);
969235783Skib	ATF_REQUIRE(nvl != NULL);
970235783Skib
971235783Skib	otherkey1 = "key1";
972235783Skib	othersize = sizeof(otherval1);
973235783Skib	nvlist_add_binary(nvl, otherkey1, otherval1, othersize);
974235783Skib
975235783Skib	otherkey2 = "key2";
976235783Skib	otherval2 = true;
977235783Skib	nvlist_add_bool(nvl, otherkey2, otherval2);
978235783Skib
979235783Skib	testkey = "strkey";
980235783Skib	testsize = sizeof(testval);
981235783Skib	nvlist_add_binary(nvl, testkey, testval, testsize);
982235783Skib
983235783Skib	actual_value = nvlist_take_binary(nvl, testkey, &actual_size);
984235783Skib	ATF_REQUIRE_EQ(testsize, actual_size);
985235783Skib	ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0);
986235783Skib
987235783Skib	ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1));
988235783Skib	actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size);
989235783Skib	ATF_REQUIRE_EQ(othersize, actual_size);
990235783Skib	ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0);
991235783Skib
992235783Skib	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
993235783Skib	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
994235783Skib
995235783Skib	nvlist_destroy(nvl);
996235783Skib}
997235783Skib
998235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null);
999235783SkibATF_TEST_CASE_BODY(nvlist_free__single_null)
1000235783Skib{
1001235783Skib	nvlist_t *nvl;
1002235783Skib	const char *key;
1003235783Skib
1004235783Skib	nvl = nvlist_create(0);
1005235783Skib	key = "test";
1006235783Skib	nvlist_add_null(nvl, key);
1007235783Skib
1008235783Skib	nvlist_free(nvl, key);
1009235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1010235783Skib
1011235783Skib	nvlist_destroy(nvl);
1012235783Skib}
1013235783Skib
1014235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool);
1015235783SkibATF_TEST_CASE_BODY(nvlist_free__single_bool)
1016235783Skib{
1017235783Skib	nvlist_t *nvl;
1018235783Skib	const char *key;
1019235783Skib
1020235783Skib	nvl = nvlist_create(0);
1021235783Skib	key = "test";
1022235783Skib	nvlist_add_bool(nvl, key, true);
1023235783Skib
1024235783Skib	nvlist_free(nvl, key);
1025235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1026235783Skib
1027235783Skib	nvlist_destroy(nvl);
1028235783Skib}
1029235783Skib
1030235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number);
1031235783SkibATF_TEST_CASE_BODY(nvlist_free__single_number)
1032235783Skib{
1033235783Skib	nvlist_t *nvl;
1034235783Skib	const char *key;
1035235783Skib
1036235783Skib	nvl = nvlist_create(0);
1037235783Skib	key = "test";
1038235783Skib	nvlist_add_number(nvl, key, 584);
1039235783Skib
1040235783Skib	nvlist_free(nvl, key);
1041235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1042235783Skib
1043235783Skib	nvlist_destroy(nvl);
1044235783Skib}
1045235783Skib
1046235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string);
1047235783SkibATF_TEST_CASE_BODY(nvlist_free__single_string)
1048235783Skib{
1049235783Skib	nvlist_t *nvl;
1050235783Skib	const char *key;
1051235783Skib
1052235783Skib	nvl = nvlist_create(0);
1053235783Skib	key = "test";
1054235783Skib	nvlist_add_string(nvl, key, "gjkfkjd");
1055235783Skib
1056235783Skib	nvlist_free(nvl, key);
1057235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1058235783Skib
1059235783Skib	nvlist_destroy(nvl);
1060235783Skib}
1061235783Skib
1062235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist);
1063235783SkibATF_TEST_CASE_BODY(nvlist_free__single_nvlist)
1064235783Skib{
1065235783Skib	nvlist_t *nvl;
1066235783Skib	const char *key;
1067235783Skib
1068235783Skib	nvl = nvlist_create(0);
1069235783Skib	key = "test";
1070235783Skib	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1071235783Skib
1072235783Skib	nvlist_free(nvl, key);
1073235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1074235783Skib
1075235783Skib	nvlist_destroy(nvl);
1076235783Skib}
1077235783Skib
1078235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary);
1079235783SkibATF_TEST_CASE_BODY(nvlist_free__single_binary)
1080235783Skib{
1081235783Skib	nvlist_t *nvl;
1082235783Skib	const char *key;
1083235783Skib
1084235783Skib	nvl = nvlist_create(0);
1085235783Skib	key = "test";
1086235783Skib	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1087235783Skib
1088235783Skib	nvlist_free(nvl, key);
1089235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1090235783Skib
1091235783Skib	nvlist_destroy(nvl);
1092235783Skib}
1093235783Skib
1094235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null);
1095235783SkibATF_TEST_CASE_BODY(nvlist_free_null__single_null)
1096235783Skib{
1097235783Skib	nvlist_t *nvl;
1098235783Skib	const char *key;
1099235783Skib
1100235783Skib	nvl = nvlist_create(0);
1101235783Skib	key = "test";
1102235783Skib	nvlist_add_null(nvl, key);
1103235783Skib
1104235783Skib	nvlist_free_null(nvl, key);
1105235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1106235783Skib
1107235783Skib	nvlist_destroy(nvl);
1108235783Skib}
1109235783Skib
1110235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool);
1111235783SkibATF_TEST_CASE_BODY(nvlist_free_bool__single_bool)
1112235783Skib{
1113235783Skib	nvlist_t *nvl;
1114235783Skib	const char *key;
1115235783Skib
1116235783Skib	nvl = nvlist_create(0);
1117235783Skib	key = "test";
1118235783Skib	nvlist_add_bool(nvl, key, true);
1119235783Skib
1120235783Skib	nvlist_free_bool(nvl, key);
1121235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1122235783Skib
1123235783Skib	nvlist_destroy(nvl);
1124235783Skib}
1125235783Skib
1126235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number);
1127235783SkibATF_TEST_CASE_BODY(nvlist_free_number__single_number)
1128235783Skib{
1129235783Skib	nvlist_t *nvl;
1130235783Skib	const char *key;
1131235783Skib
1132235783Skib	nvl = nvlist_create(0);
1133235783Skib	key = "test";
1134235783Skib	nvlist_add_number(nvl, key, 584);
1135235783Skib
1136235783Skib	nvlist_free_number(nvl, key);
1137235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1138235783Skib
1139235783Skib	nvlist_destroy(nvl);
1140235783Skib}
1141235783Skib
1142235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string);
1143235783SkibATF_TEST_CASE_BODY(nvlist_free_string__single_string)
1144235783Skib{
1145235783Skib	nvlist_t *nvl;
1146235783Skib	const char *key;
1147235783Skib
1148235783Skib	nvl = nvlist_create(0);
1149235783Skib	key = "test";
1150235783Skib	nvlist_add_string(nvl, key, "gjkfkjd");
1151235783Skib
1152235783Skib	nvlist_free_string(nvl, key);
1153235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1154235783Skib
1155235783Skib	nvlist_destroy(nvl);
1156235783Skib}
1157235783Skib
1158235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist);
1159235783SkibATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist)
1160235783Skib{
1161235783Skib	nvlist_t *nvl;
1162235783Skib	const char *key;
1163235783Skib
1164235783Skib	nvl = nvlist_create(0);
1165235783Skib	key = "test";
1166235783Skib	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1167235783Skib
1168235783Skib	nvlist_free_nvlist(nvl, key);
1169235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1170235783Skib
1171235783Skib	nvlist_destroy(nvl);
1172235783Skib}
1173235783Skib
1174235783SkibATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary);
1175235783SkibATF_TEST_CASE_BODY(nvlist_free_binary__single_binary)
1176235783Skib{
1177235783Skib	nvlist_t *nvl;
1178235783Skib	const char *key;
1179235783Skib
1180235783Skib	nvl = nvlist_create(0);
1181235783Skib	key = "test";
1182235783Skib	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1183235783Skib
1184235783Skib	nvlist_free_binary(nvl, key);
1185235783Skib	ATF_REQUIRE(nvlist_empty(nvl));
1186235783Skib
1187235783Skib	nvlist_destroy(nvl);
1188235783Skib}
1189235783Skib
1190235783SkibATF_INIT_TEST_CASES(tp)
1191235783Skib{
1192235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
1193235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
1194235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
1195235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
1196235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
1197235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
1198235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error);
1199235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
1200235783Skib
1201235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist);
1202235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist);
1203235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist);
1204235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist);
1205235783Skib
1206235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist);
1207235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values);
1208235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist);
1209235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key);
1210235783Skib
1211235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert);
1212235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert);
1213235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child);
1214235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error);
1215235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert);
1216235783Skib
1217235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove);
1218235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged);
1219235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove);
1220235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged);
1221235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove);
1222235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged);
1223235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove);
1224235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged);
1225235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove);
1226235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged);
1227235783Skib
1228235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free__single_null);
1229235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool);
1230235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free__single_number);
1231235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free__single_string);
1232235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist);
1233235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary);
1234235783Skib
1235235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null);
1236235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool);
1237235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number);
1238235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string);
1239235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist);
1240235783Skib	ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary);
1241235783Skib}
1242235783Skib