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