1258070Spjd/*-
2258070Spjd * Copyright (c) 2013 The FreeBSD Foundation
3258070Spjd * All rights reserved.
4258070Spjd *
5258070Spjd * This software was developed by Pawel Jakub Dawidek under sponsorship from
6258070Spjd * the FreeBSD Foundation.
7258070Spjd *
8258070Spjd * Redistribution and use in source and binary forms, with or without
9258070Spjd * modification, are permitted provided that the following conditions
10258070Spjd * are met:
11258070Spjd * 1. Redistributions of source code must retain the above copyright
12258070Spjd *    notice, this list of conditions and the following disclaimer.
13258070Spjd * 2. Redistributions in binary form must reproduce the above copyright
14258070Spjd *    notice, this list of conditions and the following disclaimer in the
15258070Spjd *    documentation and/or other materials provided with the distribution.
16258070Spjd *
17258070Spjd * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
18258070Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19258070Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20258070Spjd * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
21258070Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22258070Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23258070Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24258070Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25258070Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26258070Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27258070Spjd * SUCH DAMAGE.
28258070Spjd *
29258070Spjd * $FreeBSD: releng/10.3/lib/libnv/tests/nvlist_free_test.c 269603 2014-08-05 18:41:27Z ngie $
30258070Spjd */
31258070Spjd
32258070Spjd#include <stdio.h>
33258070Spjd#include <unistd.h>
34258070Spjd
35258070Spjd#include <nv.h>
36258070Spjd
37258070Spjdstatic int ntest = 1;
38258070Spjd
39258070Spjd#define	CHECK(expr)	do {						\
40258070Spjd	if ((expr))							\
41258070Spjd		printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);	\
42258070Spjd	else								\
43258070Spjd		printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
44258070Spjd	ntest++;							\
45258070Spjd} while (0)
46258070Spjd
47258070Spjdint
48258070Spjdmain(void)
49258070Spjd{
50258070Spjd	nvlist_t *nvl;
51258070Spjd
52258070Spjd	printf("1..114\n");
53258070Spjd
54258070Spjd	nvl = nvlist_create(0);
55258070Spjd
56258070Spjd	nvlist_add_null(nvl, "nvlist/null");
57258070Spjd	nvlist_add_bool(nvl, "nvlist/bool", true);
58258070Spjd	nvlist_add_number(nvl, "nvlist/number", 0);
59258070Spjd	nvlist_add_string(nvl, "nvlist/string", "test");
60258070Spjd	nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
61258070Spjd	nvlist_add_descriptor(nvl, "nvlist/descriptor", STDERR_FILENO);
62258070Spjd	nvlist_add_binary(nvl, "nvlist/binary", "test", 4);
63258070Spjd
64258070Spjd	CHECK(nvlist_exists_null(nvl, "nvlist/null"));
65258070Spjd	CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
66258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
67258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
68258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
69258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
70258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
71258070Spjd
72258070Spjd	nvlist_free_null(nvl, "nvlist/null");
73258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
74258070Spjd	CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
75258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
76258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
77258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
78258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
79258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
80258070Spjd
81258070Spjd	nvlist_free_bool(nvl, "nvlist/bool");
82258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
83258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
84258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
85258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
86258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
87258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
88258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
89258070Spjd
90258070Spjd	nvlist_free_number(nvl, "nvlist/number");
91258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
92258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
93258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
94258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
95258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
96258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
97258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
98258070Spjd
99258070Spjd	nvlist_free_string(nvl, "nvlist/string");
100258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
101258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
102258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
103258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
104258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
105258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
106258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
107258070Spjd
108258070Spjd	nvlist_free_nvlist(nvl, "nvlist/nvlist");
109258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
110258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
111258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
112258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
113258070Spjd	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
114258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
115258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
116258070Spjd
117258070Spjd	nvlist_free_descriptor(nvl, "nvlist/descriptor");
118258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
119258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
120258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
121258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
122258070Spjd	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
123258070Spjd	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
124258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
125258070Spjd
126258070Spjd	nvlist_free_binary(nvl, "nvlist/binary");
127258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
128258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
129258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
130258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
131258070Spjd	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
132258070Spjd	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
133258070Spjd	CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
134258070Spjd
135258070Spjd	CHECK(nvlist_empty(nvl));
136258070Spjd
137258070Spjd	nvlist_add_null(nvl, "nvlist/null");
138258070Spjd	nvlist_add_bool(nvl, "nvlist/bool", true);
139258070Spjd	nvlist_add_number(nvl, "nvlist/number", 0);
140258070Spjd	nvlist_add_string(nvl, "nvlist/string", "test");
141258070Spjd	nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
142258070Spjd	nvlist_add_descriptor(nvl, "nvlist/descriptor", STDERR_FILENO);
143258070Spjd	nvlist_add_binary(nvl, "nvlist/binary", "test", 4);
144258070Spjd
145258070Spjd	CHECK(nvlist_exists_null(nvl, "nvlist/null"));
146258070Spjd	CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
147258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
148258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
149258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
150258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
151258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
152258070Spjd
153258070Spjd	nvlist_free(nvl, "nvlist/null");
154258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
155258070Spjd	CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
156258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
157258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
158258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
159258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
160258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
161258070Spjd
162258070Spjd	nvlist_free(nvl, "nvlist/bool");
163258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
164258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
165258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number"));
166258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
167258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
168258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
169258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
170258070Spjd
171258070Spjd	nvlist_free(nvl, "nvlist/number");
172258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
173258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
174258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
175258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string"));
176258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
177258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
178258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
179258070Spjd
180258070Spjd	nvlist_free(nvl, "nvlist/string");
181258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
182258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
183258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
184258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
185258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
186258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
187258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
188258070Spjd
189258070Spjd	nvlist_free(nvl, "nvlist/nvlist");
190258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
191258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
192258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
193258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
194258070Spjd	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
195258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
196258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
197258070Spjd
198258070Spjd	nvlist_free(nvl, "nvlist/descriptor");
199258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
200258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
201258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
202258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
203258070Spjd	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
204258070Spjd	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
205258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
206258070Spjd
207258070Spjd	nvlist_free(nvl, "nvlist/binary");
208258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
209258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
210258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
211258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
212258070Spjd	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
213258070Spjd	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
214258070Spjd	CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
215258070Spjd
216258070Spjd	CHECK(nvlist_empty(nvl));
217258070Spjd
218258070Spjd	nvlist_destroy(nvl);
219258070Spjd
220258070Spjd	return (0);
221258070Spjd}
222