xref: /freebsd-src/lib/libnv/tests/nvlist_get_test.c (revision 5c2bc3db201a4fe8d7911cf816bea104d5dc2138)
1b236bcf1SEnji Cooper /*-
2b236bcf1SEnji Cooper  * Copyright (c) 2013 The FreeBSD Foundation
3b236bcf1SEnji Cooper  *
4b236bcf1SEnji Cooper  * This software was developed by Pawel Jakub Dawidek under sponsorship from
5b236bcf1SEnji Cooper  * the FreeBSD Foundation.
6b236bcf1SEnji Cooper  *
7b236bcf1SEnji Cooper  * Redistribution and use in source and binary forms, with or without
8b236bcf1SEnji Cooper  * modification, are permitted provided that the following conditions
9b236bcf1SEnji Cooper  * are met:
10b236bcf1SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
11b236bcf1SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
12b236bcf1SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
13b236bcf1SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
14b236bcf1SEnji Cooper  *    documentation and/or other materials provided with the distribution.
15b236bcf1SEnji Cooper  *
16b236bcf1SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
17b236bcf1SEnji Cooper  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18b236bcf1SEnji Cooper  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19b236bcf1SEnji Cooper  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
20b236bcf1SEnji Cooper  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21b236bcf1SEnji Cooper  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22b236bcf1SEnji Cooper  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23b236bcf1SEnji Cooper  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24b236bcf1SEnji Cooper  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25b236bcf1SEnji Cooper  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26b236bcf1SEnji Cooper  * SUCH DAMAGE.
27b236bcf1SEnji Cooper  */
28*c36e54bbSMariusz Zaborski #include <sys/nv.h>
29b236bcf1SEnji Cooper 
30b236bcf1SEnji Cooper #include <errno.h>
31b236bcf1SEnji Cooper #include <fcntl.h>
32b236bcf1SEnji Cooper #include <stdio.h>
33b236bcf1SEnji Cooper #include <string.h>
34b236bcf1SEnji Cooper #include <unistd.h>
35b236bcf1SEnji Cooper 
36b236bcf1SEnji Cooper static int ntest = 1;
37b236bcf1SEnji Cooper 
38b236bcf1SEnji Cooper #define	CHECK(expr)	do {						\
39b236bcf1SEnji Cooper 	if ((expr))							\
40b236bcf1SEnji Cooper 		printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);	\
41b236bcf1SEnji Cooper 	else								\
42b236bcf1SEnji Cooper 		printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
43b236bcf1SEnji Cooper 	ntest++;							\
44b236bcf1SEnji Cooper } while (0)
45b236bcf1SEnji Cooper 
46b236bcf1SEnji Cooper #define	fd_is_valid(fd)	(fcntl((fd), F_GETFL) != -1 || errno != EBADF)
47b236bcf1SEnji Cooper 
48b236bcf1SEnji Cooper int
49b236bcf1SEnji Cooper main(void)
50b236bcf1SEnji Cooper {
51b236bcf1SEnji Cooper 	const nvlist_t *cnvl;
52b236bcf1SEnji Cooper 	nvlist_t *nvl;
53b236bcf1SEnji Cooper 	size_t size;
54b236bcf1SEnji Cooper 
55b236bcf1SEnji Cooper 	printf("1..83\n");
56b236bcf1SEnji Cooper 
57b236bcf1SEnji Cooper 	nvl = nvlist_create(0);
58b236bcf1SEnji Cooper 
59b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/true"));
60b236bcf1SEnji Cooper 	nvlist_add_bool(nvl, "nvlist/bool/true", true);
61b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
62b236bcf1SEnji Cooper 	CHECK(nvlist_get_bool(nvl, "nvlist/bool/true") == true);
63b236bcf1SEnji Cooper 
64b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/false"));
65b236bcf1SEnji Cooper 	nvlist_add_bool(nvl, "nvlist/bool/false", false);
66b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
67b236bcf1SEnji Cooper 	CHECK(nvlist_get_bool(nvl, "nvlist/bool/false") == false);
68b236bcf1SEnji Cooper 
69b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_number(nvl, "nvlist/number/0"));
70b236bcf1SEnji Cooper 	nvlist_add_number(nvl, "nvlist/number/0", 0);
71b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
72b236bcf1SEnji Cooper 	CHECK(nvlist_get_number(nvl, "nvlist/number/0") == 0);
73b236bcf1SEnji Cooper 
74b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_number(nvl, "nvlist/number/1"));
75b236bcf1SEnji Cooper 	nvlist_add_number(nvl, "nvlist/number/1", 1);
76b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
77b236bcf1SEnji Cooper 	CHECK(nvlist_get_number(nvl, "nvlist/number/1") == 1);
78b236bcf1SEnji Cooper 
79b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_number(nvl, "nvlist/number/-1"));
80b236bcf1SEnji Cooper 	nvlist_add_number(nvl, "nvlist/number/-1", -1);
81b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
82b236bcf1SEnji Cooper 	CHECK((int)nvlist_get_number(nvl, "nvlist/number/-1") == -1);
83b236bcf1SEnji Cooper 
84b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
85b236bcf1SEnji Cooper 	nvlist_add_number(nvl, "nvlist/number/UINT64_MAX", UINT64_MAX);
86b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
87b236bcf1SEnji Cooper 	CHECK(nvlist_get_number(nvl, "nvlist/number/UINT64_MAX") == UINT64_MAX);
88b236bcf1SEnji Cooper 
89b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
90b236bcf1SEnji Cooper 	nvlist_add_number(nvl, "nvlist/number/INT64_MIN", INT64_MIN);
91b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
92b236bcf1SEnji Cooper 	CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MIN") == INT64_MIN);
93b236bcf1SEnji Cooper 
94b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
95b236bcf1SEnji Cooper 	nvlist_add_number(nvl, "nvlist/number/INT64_MAX", INT64_MAX);
96b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
97b236bcf1SEnji Cooper 	CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MAX") == INT64_MAX);
98b236bcf1SEnji Cooper 
99b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_string(nvl, "nvlist/string/"));
100b236bcf1SEnji Cooper 	nvlist_add_string(nvl, "nvlist/string/", "");
101b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
102b236bcf1SEnji Cooper 	CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/"), "") == 0);
103b236bcf1SEnji Cooper 
104b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_string(nvl, "nvlist/string/x"));
105b236bcf1SEnji Cooper 	nvlist_add_string(nvl, "nvlist/string/x", "x");
106b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
107b236bcf1SEnji Cooper 	CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/x"), "x") == 0);
108b236bcf1SEnji Cooper 
109b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
110b236bcf1SEnji Cooper 	nvlist_add_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz");
111b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
112b236bcf1SEnji Cooper 	CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz") == 0);
113b236bcf1SEnji Cooper 
114b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
115b236bcf1SEnji Cooper 	nvlist_add_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", STDERR_FILENO);
116b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
117b236bcf1SEnji Cooper 	CHECK(fd_is_valid(nvlist_get_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO")));
118b236bcf1SEnji Cooper 
119b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/x"));
120b236bcf1SEnji Cooper 	nvlist_add_binary(nvl, "nvlist/binary/x", "x", 1);
121b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
122b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", NULL), "x", 1) == 0);
123b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", &size), "x", 1) == 0);
124b236bcf1SEnji Cooper 	CHECK(size == 1);
125b236bcf1SEnji Cooper 
126b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
127b236bcf1SEnji Cooper 	nvlist_add_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz"));
128b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
129b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
130b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
131b236bcf1SEnji Cooper 	CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
132b236bcf1SEnji Cooper 
133b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
134b236bcf1SEnji Cooper 	nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
135b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
136b236bcf1SEnji Cooper 	cnvl = nvlist_get_nvlist(nvl, "nvlist/nvlist");
137b236bcf1SEnji Cooper 	CHECK(nvlist_get_bool(cnvl, "nvlist/bool/true") == true);
138b236bcf1SEnji Cooper 	CHECK(nvlist_get_bool(cnvl, "nvlist/bool/false") == false);
139b236bcf1SEnji Cooper 	CHECK(nvlist_get_number(cnvl, "nvlist/number/0") == 0);
140b236bcf1SEnji Cooper 	CHECK(nvlist_get_number(cnvl, "nvlist/number/1") == 1);
141b236bcf1SEnji Cooper 	CHECK((int)nvlist_get_number(cnvl, "nvlist/number/-1") == -1);
142b236bcf1SEnji Cooper 	CHECK(nvlist_get_number(cnvl, "nvlist/number/UINT64_MAX") == UINT64_MAX);
143b236bcf1SEnji Cooper 	CHECK((int64_t)nvlist_get_number(cnvl, "nvlist/number/INT64_MIN") == INT64_MIN);
144b236bcf1SEnji Cooper 	CHECK((int64_t)nvlist_get_number(cnvl, "nvlist/number/INT64_MAX") == INT64_MAX);
145b236bcf1SEnji Cooper 	CHECK(strcmp(nvlist_get_string(cnvl, "nvlist/string/"), "") == 0);
146b236bcf1SEnji Cooper 	CHECK(strcmp(nvlist_get_string(cnvl, "nvlist/string/x"), "x") == 0);
147b236bcf1SEnji Cooper 	CHECK(strcmp(nvlist_get_string(cnvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz") == 0);
148b236bcf1SEnji Cooper 	/* TODO */
149b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(cnvl, "nvlist/binary/x", NULL), "x", 1) == 0);
150b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(cnvl, "nvlist/binary/x", &size), "x", 1) == 0);
151b236bcf1SEnji Cooper 	CHECK(size == 1);
152b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(cnvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
153b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(cnvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
154b236bcf1SEnji Cooper 	CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
155b236bcf1SEnji Cooper 
156b236bcf1SEnji Cooper 	CHECK(nvlist_get_bool(nvl, "nvlist/bool/true") == true);
157b236bcf1SEnji Cooper 	CHECK(nvlist_get_bool(nvl, "nvlist/bool/false") == false);
158b236bcf1SEnji Cooper 	CHECK(nvlist_get_number(nvl, "nvlist/number/0") == 0);
159b236bcf1SEnji Cooper 	CHECK(nvlist_get_number(nvl, "nvlist/number/1") == 1);
160b236bcf1SEnji Cooper 	CHECK((int)nvlist_get_number(nvl, "nvlist/number/-1") == -1);
161b236bcf1SEnji Cooper 	CHECK(nvlist_get_number(nvl, "nvlist/number/UINT64_MAX") == UINT64_MAX);
162b236bcf1SEnji Cooper 	CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MIN") == INT64_MIN);
163b236bcf1SEnji Cooper 	CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MAX") == INT64_MAX);
164b236bcf1SEnji Cooper 	CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/"), "") == 0);
165b236bcf1SEnji Cooper 	CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/x"), "x") == 0);
166b236bcf1SEnji Cooper 	CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz") == 0);
167b236bcf1SEnji Cooper 	CHECK(fd_is_valid(nvlist_get_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO")));
168b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", NULL), "x", 1) == 0);
169b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", &size), "x", 1) == 0);
170b236bcf1SEnji Cooper 	CHECK(size == 1);
171b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
172b236bcf1SEnji Cooper 	CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
173b236bcf1SEnji Cooper 	CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
174b236bcf1SEnji Cooper 
175b236bcf1SEnji Cooper 	nvlist_destroy(nvl);
176b236bcf1SEnji Cooper 
177b236bcf1SEnji Cooper 	return (0);
178b236bcf1SEnji Cooper }
179