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/11.0/lib/libnv/tests/nvlist_add_test.c 285063 2015-07-02 21:58:10Z oshogbo $
30258070Spjd */
31258070Spjd
32285063Soshogbo#include <sys/nv.h>
33285063Soshogbo
34258070Spjd#include <errno.h>
35258070Spjd#include <stdio.h>
36258070Spjd#include <unistd.h>
37258070Spjd
38258070Spjdstatic int ntest = 1;
39258070Spjd
40258070Spjd#define	CHECK(expr)	do {						\
41258070Spjd	if ((expr))							\
42258070Spjd		printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);	\
43258070Spjd	else								\
44258070Spjd		printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
45258070Spjd	ntest++;							\
46258070Spjd} while (0)
47258070Spjd
48258070Spjdint
49258070Spjdmain(void)
50258070Spjd{
51258070Spjd	const nvlist_t *cnvl;
52258070Spjd	nvlist_t *nvl;
53258070Spjd
54258070Spjd	printf("1..94\n");
55258070Spjd
56258070Spjd	nvl = nvlist_create(0);
57258070Spjd
58258070Spjd	CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
59258070Spjd	nvlist_add_null(nvl, "nvlist/null");
60258070Spjd	CHECK(nvlist_error(nvl) == 0);
61258070Spjd	CHECK(nvlist_exists_null(nvl, "nvlist/null"));
62258070Spjd
63258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/true"));
64258070Spjd	nvlist_add_bool(nvl, "nvlist/bool/true", true);
65258070Spjd	CHECK(nvlist_error(nvl) == 0);
66258070Spjd	CHECK(nvlist_exists_bool(nvl, "nvlist/bool/true"));
67258070Spjd
68258070Spjd	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/false"));
69258070Spjd	nvlist_add_bool(nvl, "nvlist/bool/false", false);
70258070Spjd	CHECK(nvlist_error(nvl) == 0);
71258070Spjd	CHECK(nvlist_exists_bool(nvl, "nvlist/bool/false"));
72258070Spjd
73258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number/0"));
74258070Spjd	nvlist_add_number(nvl, "nvlist/number/0", 0);
75258070Spjd	CHECK(nvlist_error(nvl) == 0);
76258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/0"));
77258070Spjd
78258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number/1"));
79258070Spjd	nvlist_add_number(nvl, "nvlist/number/1", 1);
80258070Spjd	CHECK(nvlist_error(nvl) == 0);
81258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/1"));
82258070Spjd
83258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number/-1"));
84258070Spjd	nvlist_add_number(nvl, "nvlist/number/-1", -1);
85258070Spjd	CHECK(nvlist_error(nvl) == 0);
86258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/-1"));
87258070Spjd
88258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
89258070Spjd	nvlist_add_number(nvl, "nvlist/number/UINT64_MAX", UINT64_MAX);
90258070Spjd	CHECK(nvlist_error(nvl) == 0);
91258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
92258070Spjd
93258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
94258070Spjd	nvlist_add_number(nvl, "nvlist/number/INT64_MIN", INT64_MIN);
95258070Spjd	CHECK(nvlist_error(nvl) == 0);
96258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
97258070Spjd
98258070Spjd	CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
99258070Spjd	nvlist_add_number(nvl, "nvlist/number/INT64_MAX", INT64_MAX);
100258070Spjd	CHECK(nvlist_error(nvl) == 0);
101258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
102258070Spjd
103258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/string/"));
104258070Spjd	nvlist_add_string(nvl, "nvlist/string/", "");
105258070Spjd	CHECK(nvlist_error(nvl) == 0);
106258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string/"));
107258070Spjd
108258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/string/x"));
109258070Spjd	nvlist_add_string(nvl, "nvlist/string/x", "x");
110258070Spjd	CHECK(nvlist_error(nvl) == 0);
111258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string/x"));
112258070Spjd
113258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
114258070Spjd	nvlist_add_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz");
115258070Spjd	CHECK(nvlist_error(nvl) == 0);
116258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
117258070Spjd
118258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/stringf/"));
119258070Spjd	nvlist_add_stringf(nvl, "nvlist/stringf/", "%s", "");
120258070Spjd	CHECK(nvlist_error(nvl) == 0);
121258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/stringf/"));
122258070Spjd
123258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/stringf/x"));
124258070Spjd	nvlist_add_stringf(nvl, "nvlist/stringf/x", "%s", "x");
125258070Spjd	CHECK(nvlist_error(nvl) == 0);
126258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/stringf/x"));
127258070Spjd
128258070Spjd	CHECK(!nvlist_exists_string(nvl, "nvlist/stringf/666Xabc"));
129258070Spjd	nvlist_add_stringf(nvl, "nvlist/stringf/666Xabc", "%d%c%s", 666, 'X', "abc");
130258070Spjd	CHECK(nvlist_error(nvl) == 0);
131258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/stringf/666Xabc"));
132258070Spjd
133258070Spjd	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
134258070Spjd	nvlist_add_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", STDERR_FILENO);
135258070Spjd	CHECK(nvlist_error(nvl) == 0);
136258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
137258070Spjd
138258070Spjd	CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/x"));
139258070Spjd	nvlist_add_binary(nvl, "nvlist/binary/x", "x", 1);
140258070Spjd	CHECK(nvlist_error(nvl) == 0);
141258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x"));
142258070Spjd
143258070Spjd	CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
144258070Spjd	nvlist_add_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz"));
145258070Spjd	CHECK(nvlist_error(nvl) == 0);
146258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
147258070Spjd
148258070Spjd	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
149258070Spjd	nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
150258070Spjd	CHECK(nvlist_error(nvl) == 0);
151258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
152258070Spjd
153258070Spjd	CHECK(nvlist_exists_null(nvl, "nvlist/null"));
154258070Spjd	CHECK(nvlist_exists_bool(nvl, "nvlist/bool/true"));
155258070Spjd	CHECK(nvlist_exists_bool(nvl, "nvlist/bool/false"));
156258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/0"));
157258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/1"));
158258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/-1"));
159258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
160258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
161258070Spjd	CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
162258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string/"));
163258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string/x"));
164258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
165258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/stringf/"));
166258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/stringf/x"));
167258070Spjd	CHECK(nvlist_exists_string(nvl, "nvlist/stringf/666Xabc"));
168258070Spjd	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
169258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x"));
170258070Spjd	CHECK(nvlist_exists_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
171258070Spjd	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
172258070Spjd
173258070Spjd	cnvl = nvlist_get_nvlist(nvl, "nvlist/nvlist");
174258070Spjd	CHECK(nvlist_exists_null(cnvl, "nvlist/null"));
175258070Spjd	CHECK(nvlist_exists_bool(cnvl, "nvlist/bool/true"));
176258070Spjd	CHECK(nvlist_exists_bool(cnvl, "nvlist/bool/false"));
177258070Spjd	CHECK(nvlist_exists_number(cnvl, "nvlist/number/0"));
178258070Spjd	CHECK(nvlist_exists_number(cnvl, "nvlist/number/1"));
179258070Spjd	CHECK(nvlist_exists_number(cnvl, "nvlist/number/-1"));
180258070Spjd	CHECK(nvlist_exists_number(cnvl, "nvlist/number/UINT64_MAX"));
181258070Spjd	CHECK(nvlist_exists_number(cnvl, "nvlist/number/INT64_MIN"));
182258070Spjd	CHECK(nvlist_exists_number(cnvl, "nvlist/number/INT64_MAX"));
183258070Spjd	CHECK(nvlist_exists_string(cnvl, "nvlist/string/"));
184258070Spjd	CHECK(nvlist_exists_string(cnvl, "nvlist/string/x"));
185258070Spjd	CHECK(nvlist_exists_string(cnvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
186258070Spjd	CHECK(nvlist_exists_string(cnvl, "nvlist/stringf/"));
187258070Spjd	CHECK(nvlist_exists_string(cnvl, "nvlist/stringf/x"));
188258070Spjd	CHECK(nvlist_exists_string(cnvl, "nvlist/stringf/666Xabc"));
189258070Spjd	CHECK(nvlist_exists_descriptor(cnvl, "nvlist/descriptor/STDERR_FILENO"));
190258070Spjd	CHECK(nvlist_exists_binary(cnvl, "nvlist/binary/x"));
191258070Spjd	CHECK(nvlist_exists_binary(cnvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
192258070Spjd
193258070Spjd	nvlist_destroy(nvl);
194258070Spjd
195258070Spjd	return (0);
196258070Spjd}
197