nv_tests.cc revision 282254
1/*-
2 * Copyright (c) 2014-2015 Sandvine Inc.  All rights reserved.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/lib/libnv/tests/nv_tests.cc 282254 2015-04-29 22:46:18Z oshogbo $");
29
30#include <atf-c++.hpp>
31#include <nv.h>
32
33#include <errno.h>
34#include <limits>
35#include <set>
36#include <sstream>
37#include <string>
38
39/*
40 * Test that a newly created nvlist has no errors, and is empty.
41 */
42ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
43ATF_TEST_CASE_BODY(nvlist_create__is_empty)
44{
45	nvlist_t *nvl;
46	int type;
47	void *it;
48
49	nvl = nvlist_create(0);
50
51	ATF_REQUIRE(nvl != NULL);
52
53	ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
54	ATF_REQUIRE(nvlist_empty(nvl));
55
56	it = NULL;
57	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
58
59	nvlist_destroy(nvl);
60}
61
62ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
63ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
64{
65	nvlist_t *nvl;
66	void *it;
67	const char *key;
68	int type;
69
70	key = "key";
71	nvl = nvlist_create(0);
72
73	ATF_REQUIRE(nvl != NULL);
74	ATF_REQUIRE(!nvlist_exists(nvl, key));
75
76	nvlist_add_null(nvl, key);
77
78	ATF_REQUIRE(!nvlist_empty(nvl));
79	ATF_REQUIRE(nvlist_exists(nvl, key));
80	ATF_REQUIRE(nvlist_exists_null(nvl, key));
81	ATF_REQUIRE(nvlist_exists_null(nvl, "key"));
82
83	/* Iterate over the nvlist; ensure that it has only our one key. */
84	it = NULL;
85	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
86	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
87	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
88
89	nvlist_destroy(nvl);
90}
91
92ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
93ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
94{
95	nvlist_t *nvl;
96	void *it;
97	const char *key;
98	int type;
99
100	key = "name";
101	nvl = nvlist_create(0);
102
103	ATF_REQUIRE(nvl != NULL);
104	ATF_REQUIRE(!nvlist_exists(nvl, key));
105
106	nvlist_add_bool(nvl, key, true);
107
108	ATF_REQUIRE(!nvlist_empty(nvl));
109	ATF_REQUIRE(nvlist_exists(nvl, key));
110	ATF_REQUIRE(nvlist_exists(nvl, "name"));
111	ATF_REQUIRE(nvlist_exists_bool(nvl, key));
112	ATF_REQUIRE(nvlist_exists_bool(nvl, "name"));
113	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
114
115	/* Iterate over the nvlist; ensure that it has only our one key. */
116	it = NULL;
117	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
118	ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
119	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
120
121	nvlist_destroy(nvl);
122}
123
124ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
125ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
126{
127	nvlist_t *nvl;
128	void *it;
129	const char *key;
130	uint64_t value;
131	int type;
132
133	key = "foo123";
134	value = 71965;
135	nvl = nvlist_create(0);
136
137	ATF_REQUIRE(nvl != NULL);
138	ATF_REQUIRE(!nvlist_exists(nvl, key));
139
140	nvlist_add_number(nvl, key, value);
141
142	ATF_REQUIRE(!nvlist_empty(nvl));
143	ATF_REQUIRE(nvlist_exists(nvl, key));
144	ATF_REQUIRE(nvlist_exists(nvl, "foo123"));
145	ATF_REQUIRE(nvlist_exists_number(nvl, key));
146	ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
147
148	/* Iterate over the nvlist; ensure that it has only our one key. */
149	it = NULL;
150	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
151	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
152	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
153
154	nvlist_destroy(nvl);
155}
156
157ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
158ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
159{
160	nvlist_t *nvl;
161	void *it;
162	const char *key;
163	const char *value;
164	int type;
165
166	key = "test";
167	value = "fgjdkgjdk";
168	nvl = nvlist_create(0);
169
170	ATF_REQUIRE(nvl != NULL);
171	ATF_REQUIRE(!nvlist_exists(nvl, key));
172
173	nvlist_add_string(nvl, key, value);
174
175	ATF_REQUIRE(!nvlist_empty(nvl));
176	ATF_REQUIRE(nvlist_exists(nvl, key));
177	ATF_REQUIRE(nvlist_exists(nvl, "test"));
178	ATF_REQUIRE(nvlist_exists_string(nvl, key));
179	ATF_REQUIRE(nvlist_exists_string(nvl, "test"));
180	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
181
182	/* nvlist_add_* is required to clone the value, so check for that. */
183	ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
184
185	/* Iterate over the nvlist; ensure that it has only our one key. */
186	it = NULL;
187	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
188	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
189	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
190
191	nvlist_destroy(nvl);
192}
193
194ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
195ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
196{
197	nvlist_t *nvl;
198	void *it;
199	const char *key, *subkey;
200	nvlist_t *sublist;
201	const nvlist_t *value;
202	int type;
203
204	key = "test";
205	subkey = "subkey";
206	sublist = nvlist_create(0);
207	nvl = nvlist_create(0);
208
209	ATF_REQUIRE(nvl != NULL);
210	ATF_REQUIRE(!nvlist_exists(nvl, key));
211
212	nvlist_add_null(sublist, subkey);
213	nvlist_add_nvlist(nvl, key, sublist);
214
215	ATF_REQUIRE(!nvlist_empty(nvl));
216	ATF_REQUIRE(nvlist_exists(nvl, key));
217	ATF_REQUIRE(nvlist_exists(nvl, "test"));
218	ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
219	ATF_REQUIRE(nvlist_exists_nvlist(nvl, "test"));
220
221	value = nvlist_get_nvlist(nvl, key);
222	ATF_REQUIRE(nvlist_exists_null(value, subkey));
223
224	/* nvlist_add_* is required to clone the value, so check for that. */
225	ATF_REQUIRE(sublist != value);
226
227	/* Iterate over the nvlist; ensure that it has only our one key. */
228	it = NULL;
229	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
230	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
231	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
232
233	nvlist_destroy(sublist);
234	nvlist_destroy(nvl);
235}
236
237ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error);
238ATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error)
239{
240	nvlist_t *nvl, *parent;
241
242	nvl = nvlist_create(0);
243	parent = nvlist_create(0);
244
245	nvlist_set_error(nvl, EBADF);
246	nvlist_add_nvlist(parent, "test", nvl);
247	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
248
249	nvlist_destroy(nvl);
250	nvlist_destroy(parent);
251}
252
253ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
254ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
255{
256	nvlist_t *nvl;
257	void *it;
258	const char *key;
259	void *value;
260	const void *ret_value;
261	size_t value_size, ret_size;
262	int type;
263
264	key = "binary";
265	value_size = 13;
266	value = malloc(value_size);
267	memset(value, 0xa5, value_size);
268	nvl = nvlist_create(0);
269
270	ATF_REQUIRE(nvl != NULL);
271	ATF_REQUIRE(!nvlist_exists(nvl, key));
272
273	nvlist_add_binary(nvl, key, value, value_size);
274
275	ATF_REQUIRE(!nvlist_empty(nvl));
276	ATF_REQUIRE(nvlist_exists(nvl, key));
277	ATF_REQUIRE(nvlist_exists(nvl, "binary"));
278	ATF_REQUIRE(nvlist_exists_binary(nvl, key));
279	ATF_REQUIRE(nvlist_exists_binary(nvl, "binary"));
280
281	ret_value = nvlist_get_binary(nvl, key, &ret_size);
282	ATF_REQUIRE_EQ(value_size, ret_size);
283	ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
284
285	/* nvlist_add_* is required to clone the value, so check for that. */
286	ATF_REQUIRE(value != ret_value);
287
288	/* Iterate over the nvlist; ensure that it has only our one key. */
289	it = NULL;
290	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
291	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
292	ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
293
294	nvlist_destroy(nvl);
295	free(value);
296}
297
298ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist);
299ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist)
300{
301	nvlist_t *nvl, *clone;
302
303	nvl = nvlist_create(0);
304	ATF_REQUIRE(nvl != NULL);
305
306	clone = nvlist_clone(nvl);
307	ATF_REQUIRE(clone != NULL);
308	ATF_REQUIRE(clone != nvl);
309	ATF_REQUIRE(nvlist_empty(clone));
310
311	nvlist_destroy(clone);
312	nvlist_destroy(nvl);
313}
314
315ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist);
316ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist)
317{
318	nvlist_t *nvl, *clone;
319	const char *key;
320	void *it;
321	uint64_t value;
322	int type;
323
324	nvl = nvlist_create(0);
325	ATF_REQUIRE(nvl != NULL);
326
327	key = "testkey";
328	value = 684874;
329	nvlist_add_number(nvl, key, value);
330
331	clone = nvlist_clone(nvl);
332	ATF_REQUIRE(clone != NULL);
333	ATF_REQUIRE(clone != nvl);
334	ATF_REQUIRE(nvlist_exists_number(clone, key));
335	ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value);
336
337	/* Iterate over the nvlist; ensure that it has only our one key. */
338	it = NULL;
339	ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0);
340	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
341	ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), static_cast<const char *>(NULL));
342
343	nvlist_destroy(clone);
344	nvlist_destroy(nvl);
345}
346
347static const char * const test_subnvlist_key = "nvlist";
348
349static const char * const test_string_key = "string";
350static const char * const test_string_val = "59525";
351
352static nvlist_t*
353create_test_nvlist(void)
354{
355	nvlist_t *nvl, *sublist;
356
357	nvl = nvlist_create(0);
358	ATF_REQUIRE(nvl != NULL);
359
360	sublist = nvlist_create(0);
361	ATF_REQUIRE(sublist != NULL);
362
363	nvlist_add_string(sublist, test_string_key, test_string_val);
364	nvlist_move_nvlist(nvl, test_subnvlist_key, sublist);
365
366	return (nvl);
367}
368
369static void
370verify_test_nvlist(const nvlist_t *nvl)
371{
372	void *it;
373	const nvlist_t *value;
374	int type;
375
376	ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key));
377
378	value = nvlist_get_nvlist(nvl, test_subnvlist_key);
379
380	ATF_REQUIRE(nvlist_exists_string(value, test_string_key));
381	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0);
382	ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val);
383
384	/* Iterate over both nvlists; ensure that each has only the one key. */
385	it = NULL;
386	ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it),
387	    test_string_key), 0);
388	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
389	ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), static_cast<const char *>(NULL));
390
391	it = NULL;
392	ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it),
393	    test_subnvlist_key), 0);
394	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
395	ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
396}
397
398ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist);
399ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist)
400{
401	nvlist_t *nvl, *clone;
402
403	nvl = create_test_nvlist();
404	clone = nvlist_clone(nvl);
405
406	ATF_REQUIRE(clone != NULL);
407	ATF_REQUIRE(clone != nvl);
408	verify_test_nvlist(clone);
409
410	nvlist_destroy(clone);
411	nvlist_destroy(nvl);
412}
413
414ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist);
415ATF_TEST_CASE_BODY(nvlist_clone__error_nvlist)
416{
417	nvlist_t *nvl, *clone;
418
419	nvl = nvlist_create(0);
420	ATF_REQUIRE(nvl != NULL);
421
422	nvlist_set_error(nvl, ENOMEM);
423
424	clone = nvlist_clone(nvl);
425	ATF_REQUIRE(clone == NULL);
426
427	nvlist_destroy(nvl);
428}
429
430ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist);
431ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist)
432{
433	nvlist_t *nvl, *unpacked;
434	void *packed;
435	size_t packed_size;
436
437	nvl = nvlist_create(0);
438	ATF_REQUIRE(nvl != NULL);
439
440	packed = nvlist_pack(nvl, &packed_size);
441	ATF_REQUIRE(packed != NULL);
442
443	unpacked = nvlist_unpack(packed, packed_size);
444	ATF_REQUIRE(unpacked != NULL);
445	ATF_REQUIRE(unpacked != nvl);
446	ATF_REQUIRE(nvlist_empty(unpacked));
447
448	nvlist_destroy(unpacked);
449	nvlist_destroy(nvl);
450	free(packed);
451}
452
453static void
454verify_null(const nvlist_t *nvl, int type)
455{
456
457	ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
458}
459
460static void
461verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value)
462{
463
464	ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
465	ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value);
466}
467
468static void
469verify_string(const nvlist_t *nvl, const char *name, int type,
470    const char * value)
471{
472
473	ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
474	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0);
475}
476
477static void
478verify_nvlist(const nvlist_t *nvl, const char *name, int type)
479{
480
481	ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
482	verify_test_nvlist(nvlist_get_nvlist(nvl, name));
483}
484
485static void
486verify_binary(const nvlist_t *nvl, const char *name, int type,
487    const void * value, size_t size)
488{
489	const void *actual_value;
490	size_t actual_size;
491
492	ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
493	actual_value = nvlist_get_binary(nvl, name, &actual_size);
494	ATF_REQUIRE_EQ(size, actual_size);
495	ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0);
496}
497
498ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values);
499ATF_TEST_CASE_BODY(nvlist_pack__multiple_values)
500{
501	std::ostringstream msg;
502	std::set<std::string> keys_seen;
503	nvlist_t *nvl, *unpacked, *nvvalue;
504	const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name;
505	int numvalue;
506	const char * strvalue;
507	void *binvalue, *packed, *it;
508	size_t binsize, packed_size;
509	int type;
510
511	nvl = nvlist_create(0);
512
513	nullkey = "null";
514	nvlist_add_null(nvl, nullkey);
515
516	numkey = "number";
517	numvalue = 939853984;
518	nvlist_add_number(nvl, numkey, numvalue);
519
520	strkey = "string";
521	strvalue = "jfieutijf";
522	nvlist_add_string(nvl, strkey, strvalue);
523
524	nvkey = "nvlist";
525	nvvalue = create_test_nvlist();
526	nvlist_move_nvlist(nvl, nvkey, nvvalue);
527
528	binkey = "binary";
529	binsize = 4;
530	binvalue = malloc(binsize);
531	memset(binvalue, 'b', binsize);
532	nvlist_move_binary(nvl, binkey, binvalue, binsize);
533
534	packed = nvlist_pack(nvl, &packed_size);
535	ATF_REQUIRE(packed != NULL);
536
537	unpacked = nvlist_unpack(packed, packed_size);
538	ATF_REQUIRE(unpacked != 0);
539
540	it = NULL;
541	while ((name = nvlist_next(unpacked, &type, &it)) != NULL) {
542		/* Ensure that we see every key only once. */
543		ATF_REQUIRE_EQ(keys_seen.count(name), 0);
544
545		if (strcmp(name, nullkey) == 0)
546			verify_null(unpacked, type);
547		else if (strcmp(name, numkey) == 0)
548			verify_number(unpacked, name, type, numvalue);
549		else if (strcmp(name, strkey) == 0)
550			verify_string(unpacked, name, type, strvalue);
551		else if (strcmp(name, nvkey) == 0)
552			verify_nvlist(unpacked, name, type);
553		else if (strcmp(name, binkey) == 0)
554			verify_binary(unpacked, name, type, binvalue, binsize);
555		else {
556			msg << "Unexpected key :'" << name << "'";
557			ATF_FAIL(msg.str().c_str());
558		}
559
560		keys_seen.insert(name);
561	}
562
563	/* Ensure that we saw every key. */
564	ATF_REQUIRE_EQ(keys_seen.size(), 5);
565
566	nvlist_destroy(nvl);
567	nvlist_destroy(unpacked);
568	free(packed);
569}
570
571ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist);
572ATF_TEST_CASE_BODY(nvlist_pack__error_nvlist)
573{
574	nvlist_t *nvl;
575	void *packed;
576	size_t size;
577
578	nvl = nvlist_create(0);
579	ATF_REQUIRE(nvl != NULL);
580
581	nvlist_set_error(nvl, ENOMEM);
582
583	packed = nvlist_pack(nvl, &size);
584	ATF_REQUIRE(packed == NULL);
585
586	nvlist_destroy(nvl);
587}
588
589ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key);
590ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key)
591{
592	nvlist_t *nvl, *unpacked;
593	const char *key1, *key2;
594	void *packed, *keypos;
595	size_t size, keylen;
596
597	nvl = nvlist_create(0);
598
599	key1 = "key1";
600	keylen = strlen(key1);
601	nvlist_add_number(nvl, key1, 5);
602
603	key2 = "key2";
604	ATF_REQUIRE_EQ(keylen, strlen(key2));
605	nvlist_add_number(nvl, key2, 10);
606
607	packed = nvlist_pack(nvl, &size);
608
609	/*
610	 * Mangle the packed nvlist by replacing key1 with key2, creating a
611	 * packed nvlist with a duplicate key.
612	 */
613	keypos = memmem(packed, size, key1, keylen);
614	ATF_REQUIRE(keypos != NULL);
615	memcpy(keypos, key2, keylen);
616
617	unpacked = nvlist_unpack(packed, size);
618	ATF_REQUIRE(nvlist_error(unpacked) != 0);
619
620	free(packed);
621	nvlist_destroy(nvl);
622	nvlist_destroy(unpacked);
623}
624
625ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert);
626ATF_TEST_CASE_BODY(nvlist_move_string__single_insert)
627{
628	nvlist_t *nvl;
629	const char *key;
630	char *value;
631
632	nvl = nvlist_create(0);
633	ATF_REQUIRE(nvl != NULL);
634
635	key = "testkey";
636	value = strdup("testval");
637	ATF_REQUIRE(value != NULL);
638
639	nvlist_move_string(nvl, key, value);
640	ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value);
641
642	nvlist_destroy(nvl);
643}
644
645ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child);
646ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child)
647{
648	nvlist_t *parent;
649
650	parent = nvlist_create(0);
651
652	nvlist_move_nvlist(parent, "test", NULL);
653
654	ATF_REQUIRE(nvlist_error(parent) != 0);
655
656	nvlist_destroy(parent);
657}
658
659ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error);
660ATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error)
661{
662	nvlist_t *nvl, *parent;
663
664	nvl = nvlist_create(0);
665	parent = nvlist_create(0);
666
667	nvlist_set_error(nvl, EBADF);
668	nvlist_move_nvlist(parent, "test", nvl);
669	ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
670
671	nvlist_destroy(parent);
672}
673
674ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert);
675ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert)
676{
677	nvlist_t *nvl;
678	const char *key;
679	nvlist_t *value;
680
681	nvl = nvlist_create(0);
682	ATF_REQUIRE(nvl != NULL);
683
684	key = "testkey";
685	value = nvlist_create(0);
686	ATF_REQUIRE(value != NULL);
687
688	nvlist_move_nvlist(nvl, key, value);
689	ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value);
690
691	nvlist_destroy(nvl);
692}
693
694ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert);
695ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert)
696{
697	nvlist_t *nvl;
698	const char *key;
699	void *value;
700	size_t size, actual_size;
701
702	nvl = nvlist_create(0);
703	ATF_REQUIRE(nvl != NULL);
704
705	key = "testkey";
706	size = 73;
707	value = malloc(size);
708	ATF_REQUIRE(value != NULL);
709
710	nvlist_move_binary(nvl, key, value, size);
711	ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value);
712	ATF_REQUIRE_EQ(size, actual_size);
713
714	nvlist_destroy(nvl);
715}
716
717ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove);
718ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove)
719{
720	nvlist_t *nvl;
721	const char *testkey;
722	bool testval;
723
724	nvl = nvlist_create(0);
725	ATF_REQUIRE(nvl != NULL);
726
727	testkey = "boolkey";
728	testval = false;
729	nvlist_add_bool(nvl, testkey, testval);
730
731	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
732	ATF_REQUIRE(nvlist_empty(nvl));
733
734	nvlist_destroy(nvl);
735}
736
737ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged);
738ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged)
739{
740	nvlist_t *nvl;
741	const char *testkey, *otherkey1, *otherkey2;
742	bool testval, otherval1;
743	nvlist_t *otherval2;
744
745	nvl = nvlist_create(0);
746	ATF_REQUIRE(nvl != NULL);
747
748	testkey = "boolkey";
749	testval = true;
750	nvlist_add_bool(nvl, testkey, testval);
751
752	otherkey1 = "key1";
753	otherval1 = false;
754	nvlist_add_bool(nvl, otherkey1, otherval1);
755
756	otherkey2 = "key2";
757	otherval2 = create_test_nvlist();
758	nvlist_move_nvlist(nvl, otherkey2, otherval2);
759
760	ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
761
762	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1));
763	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1);
764
765	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2));
766	verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2));
767
768	nvlist_destroy(nvl);
769}
770
771ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove);
772ATF_TEST_CASE_BODY(nvlist_take_number__single_remove)
773{
774	nvlist_t *nvl;
775	const char *testkey;
776	uint64_t testval;
777
778	nvl = nvlist_create(0);
779	ATF_REQUIRE(nvl != NULL);
780
781	testkey = "numkey";
782	testval = std::numeric_limits<uint64_t>::max();
783	nvlist_add_number(nvl, testkey, testval);
784
785	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
786	ATF_REQUIRE(nvlist_empty(nvl));
787
788	nvlist_destroy(nvl);
789}
790
791ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged);
792ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged)
793{
794	nvlist_t *nvl;
795	const char *testkey, *otherkey1, *otherkey2;
796	uint64_t testval, otherval1;
797	const char *otherval2;
798
799	nvl = nvlist_create(0);
800	ATF_REQUIRE(nvl != NULL);
801
802	otherkey1 = "key1";
803	otherval1 = 5;
804	nvlist_add_number(nvl, otherkey1, otherval1);
805
806	testkey = "numkey";
807	testval = 1654;
808	nvlist_add_number(nvl, testkey, testval);
809
810	otherkey2 = "key2";
811	otherval2 = "string";
812	nvlist_add_string(nvl, otherkey2, otherval2);
813
814	ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
815
816	ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1));
817	ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1);
818
819	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2));
820	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0);
821
822	nvlist_destroy(nvl);
823}
824
825ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove);
826ATF_TEST_CASE_BODY(nvlist_take_string__single_remove)
827{
828	nvlist_t *nvl;
829	const char *testkey;
830	const char *testval;
831
832	nvl = nvlist_create(0);
833	ATF_REQUIRE(nvl != NULL);
834
835	testkey = "numkey";
836	testval = "nvlist";
837	nvlist_add_string(nvl, testkey, testval);
838
839	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
840	ATF_REQUIRE(nvlist_empty(nvl));
841
842	nvlist_destroy(nvl);
843}
844
845ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged);
846ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged)
847{
848	nvlist_t *nvl;
849	const char *testkey, *otherkey1, *otherkey2;
850	const char *testval, *otherval1;
851	bool otherval2;
852
853	nvl = nvlist_create(0);
854	ATF_REQUIRE(nvl != NULL);
855
856	otherkey1 = "key1";
857	otherval1 = "fjdifjdk";
858	nvlist_add_string(nvl, otherkey1, otherval1);
859
860	otherkey2 = "key2";
861	otherval2 = true;
862	nvlist_add_bool(nvl, otherkey2, otherval2);
863
864	testkey = "strkey";
865	testval = "1654";
866	nvlist_add_string(nvl, testkey, testval);
867
868	ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
869
870	ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1));
871	ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0);
872
873	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
874	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
875
876	nvlist_destroy(nvl);
877}
878
879ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove);
880ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove)
881{
882	nvlist_t *nvl;
883	const char *testkey;
884	nvlist_t *testval;
885
886	nvl = nvlist_create(0);
887	ATF_REQUIRE(nvl != NULL);
888
889	testkey = "numkey";
890	testval = create_test_nvlist();
891	nvlist_move_nvlist(nvl, testkey, testval);
892
893	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
894	ATF_REQUIRE(nvlist_empty(nvl));
895
896	nvlist_destroy(nvl);
897}
898
899ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged);
900ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged)
901{
902	nvlist_t *nvl;
903	const char *testkey, *otherkey1, *otherkey2;
904	nvlist_t *testval, *otherval1;
905
906	nvl = nvlist_create(0);
907	ATF_REQUIRE(nvl != NULL);
908
909	testkey = "strkey";
910	testval = create_test_nvlist();
911	nvlist_move_nvlist(nvl, testkey, testval);
912
913	otherkey1 = "key1";
914	otherval1 = nvlist_create(0);
915	nvlist_move_nvlist(nvl, otherkey1, otherval1);
916
917	otherkey2 = "key2";
918	nvlist_add_null(nvl, otherkey2);
919
920	verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
921
922	ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1));
923	ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1)));
924
925	ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2));
926
927	nvlist_destroy(nvl);
928}
929
930ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove);
931ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove)
932{
933	nvlist_t *nvl;
934	const char *testkey;
935	void *testval;
936	const void *actual_val;
937	size_t testsize, actual_size;
938
939	nvl = nvlist_create(0);
940	ATF_REQUIRE(nvl != NULL);
941
942	testkey = "numkey";
943	testsize = 457;
944	testval = malloc(testsize);
945	memset(testval, '5', testsize);
946	nvlist_move_binary(nvl, testkey, testval, testsize);
947
948	actual_val = nvlist_take_binary(nvl, testkey, &actual_size);
949	ATF_REQUIRE_EQ(testsize, actual_size);
950	ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0);
951	ATF_REQUIRE(nvlist_empty(nvl));
952
953	nvlist_destroy(nvl);
954}
955
956ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged);
957ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged)
958{
959	nvlist_t *nvl;
960	const char *testkey, *otherkey1, *otherkey2;
961	const void *actual_value;
962	char testval[] = "gjiertj";
963	char otherval1[] = "fdreg";
964	size_t testsize, othersize, actual_size;
965	bool otherval2;
966
967	nvl = nvlist_create(0);
968	ATF_REQUIRE(nvl != NULL);
969
970	otherkey1 = "key1";
971	othersize = sizeof(otherval1);
972	nvlist_add_binary(nvl, otherkey1, otherval1, othersize);
973
974	otherkey2 = "key2";
975	otherval2 = true;
976	nvlist_add_bool(nvl, otherkey2, otherval2);
977
978	testkey = "strkey";
979	testsize = sizeof(testval);
980	nvlist_add_binary(nvl, testkey, testval, testsize);
981
982	actual_value = nvlist_take_binary(nvl, testkey, &actual_size);
983	ATF_REQUIRE_EQ(testsize, actual_size);
984	ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0);
985
986	ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1));
987	actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size);
988	ATF_REQUIRE_EQ(othersize, actual_size);
989	ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0);
990
991	ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
992	ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
993
994	nvlist_destroy(nvl);
995}
996
997ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null);
998ATF_TEST_CASE_BODY(nvlist_free__single_null)
999{
1000	nvlist_t *nvl;
1001	const char *key;
1002
1003	nvl = nvlist_create(0);
1004	key = "test";
1005	nvlist_add_null(nvl, key);
1006
1007	nvlist_free(nvl, key);
1008	ATF_REQUIRE(nvlist_empty(nvl));
1009
1010	nvlist_destroy(nvl);
1011}
1012
1013ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool);
1014ATF_TEST_CASE_BODY(nvlist_free__single_bool)
1015{
1016	nvlist_t *nvl;
1017	const char *key;
1018
1019	nvl = nvlist_create(0);
1020	key = "test";
1021	nvlist_add_bool(nvl, key, true);
1022
1023	nvlist_free(nvl, key);
1024	ATF_REQUIRE(nvlist_empty(nvl));
1025
1026	nvlist_destroy(nvl);
1027}
1028
1029ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number);
1030ATF_TEST_CASE_BODY(nvlist_free__single_number)
1031{
1032	nvlist_t *nvl;
1033	const char *key;
1034
1035	nvl = nvlist_create(0);
1036	key = "test";
1037	nvlist_add_number(nvl, key, 584);
1038
1039	nvlist_free(nvl, key);
1040	ATF_REQUIRE(nvlist_empty(nvl));
1041
1042	nvlist_destroy(nvl);
1043}
1044
1045ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string);
1046ATF_TEST_CASE_BODY(nvlist_free__single_string)
1047{
1048	nvlist_t *nvl;
1049	const char *key;
1050
1051	nvl = nvlist_create(0);
1052	key = "test";
1053	nvlist_add_string(nvl, key, "gjkfkjd");
1054
1055	nvlist_free(nvl, key);
1056	ATF_REQUIRE(nvlist_empty(nvl));
1057
1058	nvlist_destroy(nvl);
1059}
1060
1061ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist);
1062ATF_TEST_CASE_BODY(nvlist_free__single_nvlist)
1063{
1064	nvlist_t *nvl;
1065	const char *key;
1066
1067	nvl = nvlist_create(0);
1068	key = "test";
1069	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1070
1071	nvlist_free(nvl, key);
1072	ATF_REQUIRE(nvlist_empty(nvl));
1073
1074	nvlist_destroy(nvl);
1075}
1076
1077ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary);
1078ATF_TEST_CASE_BODY(nvlist_free__single_binary)
1079{
1080	nvlist_t *nvl;
1081	const char *key;
1082
1083	nvl = nvlist_create(0);
1084	key = "test";
1085	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1086
1087	nvlist_free(nvl, key);
1088	ATF_REQUIRE(nvlist_empty(nvl));
1089
1090	nvlist_destroy(nvl);
1091}
1092
1093ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null);
1094ATF_TEST_CASE_BODY(nvlist_free_null__single_null)
1095{
1096	nvlist_t *nvl;
1097	const char *key;
1098
1099	nvl = nvlist_create(0);
1100	key = "test";
1101	nvlist_add_null(nvl, key);
1102
1103	nvlist_free_null(nvl, key);
1104	ATF_REQUIRE(nvlist_empty(nvl));
1105
1106	nvlist_destroy(nvl);
1107}
1108
1109ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool);
1110ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool)
1111{
1112	nvlist_t *nvl;
1113	const char *key;
1114
1115	nvl = nvlist_create(0);
1116	key = "test";
1117	nvlist_add_bool(nvl, key, true);
1118
1119	nvlist_free_bool(nvl, key);
1120	ATF_REQUIRE(nvlist_empty(nvl));
1121
1122	nvlist_destroy(nvl);
1123}
1124
1125ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number);
1126ATF_TEST_CASE_BODY(nvlist_free_number__single_number)
1127{
1128	nvlist_t *nvl;
1129	const char *key;
1130
1131	nvl = nvlist_create(0);
1132	key = "test";
1133	nvlist_add_number(nvl, key, 584);
1134
1135	nvlist_free_number(nvl, key);
1136	ATF_REQUIRE(nvlist_empty(nvl));
1137
1138	nvlist_destroy(nvl);
1139}
1140
1141ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string);
1142ATF_TEST_CASE_BODY(nvlist_free_string__single_string)
1143{
1144	nvlist_t *nvl;
1145	const char *key;
1146
1147	nvl = nvlist_create(0);
1148	key = "test";
1149	nvlist_add_string(nvl, key, "gjkfkjd");
1150
1151	nvlist_free_string(nvl, key);
1152	ATF_REQUIRE(nvlist_empty(nvl));
1153
1154	nvlist_destroy(nvl);
1155}
1156
1157ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist);
1158ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist)
1159{
1160	nvlist_t *nvl;
1161	const char *key;
1162
1163	nvl = nvlist_create(0);
1164	key = "test";
1165	nvlist_add_nvlist(nvl, key, nvlist_create(0));
1166
1167	nvlist_free_nvlist(nvl, key);
1168	ATF_REQUIRE(nvlist_empty(nvl));
1169
1170	nvlist_destroy(nvl);
1171}
1172
1173ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary);
1174ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary)
1175{
1176	nvlist_t *nvl;
1177	const char *key;
1178
1179	nvl = nvlist_create(0);
1180	key = "test";
1181	nvlist_add_binary(nvl, key, "jgjgfd", 6);
1182
1183	nvlist_free_binary(nvl, key);
1184	ATF_REQUIRE(nvlist_empty(nvl));
1185
1186	nvlist_destroy(nvl);
1187}
1188
1189ATF_INIT_TEST_CASES(tp)
1190{
1191	ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
1192	ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
1193	ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
1194	ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
1195	ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
1196	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
1197	ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error);
1198	ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
1199
1200	ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist);
1201	ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist);
1202	ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist);
1203	ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist);
1204
1205	ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist);
1206	ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values);
1207	ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist);
1208	ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key);
1209
1210	ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert);
1211	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert);
1212	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child);
1213	ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error);
1214	ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert);
1215
1216	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove);
1217	ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged);
1218	ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove);
1219	ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged);
1220	ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove);
1221	ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged);
1222	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove);
1223	ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged);
1224	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove);
1225	ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged);
1226
1227	ATF_ADD_TEST_CASE(tp, nvlist_free__single_null);
1228	ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool);
1229	ATF_ADD_TEST_CASE(tp, nvlist_free__single_number);
1230	ATF_ADD_TEST_CASE(tp, nvlist_free__single_string);
1231	ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist);
1232	ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary);
1233
1234	ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null);
1235	ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool);
1236	ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number);
1237	ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string);
1238	ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist);
1239	ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary);
1240}
1241