xref: /freebsd/lib/libnv/tests/nvlist_move_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  */
28b236bcf1SEnji Cooper 
29*c36e54bbSMariusz Zaborski #include <sys/nv.h>
30*c36e54bbSMariusz Zaborski 
31b236bcf1SEnji Cooper #include <errno.h>
32b236bcf1SEnji Cooper #include <stdio.h>
33b236bcf1SEnji Cooper #include <stdlib.h>
34b236bcf1SEnji Cooper #include <string.h>
35b236bcf1SEnji Cooper #include <unistd.h>
36b236bcf1SEnji Cooper 
37b236bcf1SEnji Cooper static int ntest = 1;
38b236bcf1SEnji Cooper 
39b236bcf1SEnji Cooper #define	CHECK(expr)	do {						\
40b236bcf1SEnji Cooper 	if ((expr))							\
41b236bcf1SEnji Cooper 		printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);	\
42b236bcf1SEnji Cooper 	else								\
43b236bcf1SEnji Cooper 		printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
44b236bcf1SEnji Cooper 	ntest++;							\
45b236bcf1SEnji Cooper } while (0)
46b236bcf1SEnji Cooper 
47b236bcf1SEnji Cooper int
48b236bcf1SEnji Cooper main(void)
49b236bcf1SEnji Cooper {
50b236bcf1SEnji Cooper 	const nvlist_t *cnvl;
51b236bcf1SEnji Cooper 	nvlist_t *nvl;
52b236bcf1SEnji Cooper 	void *ptr;
53b236bcf1SEnji Cooper 	size_t size;
54b236bcf1SEnji Cooper 	int fd;
55b236bcf1SEnji Cooper 
56b236bcf1SEnji Cooper 	printf("1..52\n");
57b236bcf1SEnji Cooper 
58b236bcf1SEnji Cooper 	nvl = nvlist_create(0);
59b236bcf1SEnji Cooper 
60b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_string(nvl, "nvlist/string/"));
61b236bcf1SEnji Cooper 	ptr = strdup("");
62b236bcf1SEnji Cooper 	CHECK(ptr != NULL);
63b236bcf1SEnji Cooper 	nvlist_move_string(nvl, "nvlist/string/", ptr);
64b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
65b236bcf1SEnji Cooper 	CHECK(nvlist_exists_string(nvl, "nvlist/string/"));
66b236bcf1SEnji Cooper 	CHECK(ptr == nvlist_get_string(nvl, "nvlist/string/"));
67b236bcf1SEnji Cooper 
68b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_string(nvl, "nvlist/string/x"));
69b236bcf1SEnji Cooper 	ptr = strdup("x");
70b236bcf1SEnji Cooper 	CHECK(ptr != NULL);
71b236bcf1SEnji Cooper 	nvlist_move_string(nvl, "nvlist/string/x", ptr);
72b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
73b236bcf1SEnji Cooper 	CHECK(nvlist_exists_string(nvl, "nvlist/string/x"));
74b236bcf1SEnji Cooper 	CHECK(ptr == nvlist_get_string(nvl, "nvlist/string/x"));
75b236bcf1SEnji Cooper 
76b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_string(nvl,
77b236bcf1SEnji Cooper 	    "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
78b236bcf1SEnji Cooper 	ptr = strdup("abcdefghijklmnopqrstuvwxyz");
79b236bcf1SEnji Cooper 	CHECK(ptr != NULL);
80b236bcf1SEnji Cooper 	nvlist_move_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz",
81b236bcf1SEnji Cooper 	    ptr);
82b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
83b236bcf1SEnji Cooper 	CHECK(nvlist_exists_string(nvl,
84b236bcf1SEnji Cooper 	    "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
85b236bcf1SEnji Cooper 	CHECK(ptr ==
86b236bcf1SEnji Cooper 	    nvlist_get_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
87b236bcf1SEnji Cooper 
88b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_descriptor(nvl,
89b236bcf1SEnji Cooper 	    "nvlist/descriptor/STDERR_FILENO"));
90b236bcf1SEnji Cooper 	fd = dup(STDERR_FILENO);
91b236bcf1SEnji Cooper 	CHECK(fd >= 0);
92b236bcf1SEnji Cooper 	nvlist_move_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", fd);
93b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
94b236bcf1SEnji Cooper 	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
95b236bcf1SEnji Cooper 	CHECK(fd ==
96b236bcf1SEnji Cooper 	    nvlist_get_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
97b236bcf1SEnji Cooper 
98b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/x"));
99b236bcf1SEnji Cooper 	ptr = malloc(1);
100b236bcf1SEnji Cooper 	CHECK(ptr != NULL);
101b236bcf1SEnji Cooper 	memcpy(ptr, "x", 1);
102b236bcf1SEnji Cooper 	nvlist_move_binary(nvl, "nvlist/binary/x", ptr, 1);
103b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
104b236bcf1SEnji Cooper 	CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x"));
105b236bcf1SEnji Cooper 	CHECK(ptr == nvlist_get_binary(nvl, "nvlist/binary/x", NULL));
106b236bcf1SEnji Cooper 	CHECK(ptr == nvlist_get_binary(nvl, "nvlist/binary/x", &size));
107b236bcf1SEnji Cooper 	CHECK(size == 1);
108b236bcf1SEnji Cooper 
109b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_binary(nvl,
110b236bcf1SEnji Cooper 	    "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
111b236bcf1SEnji Cooper 	ptr = malloc(sizeof("abcdefghijklmnopqrstuvwxyz"));
112b236bcf1SEnji Cooper 	CHECK(ptr != NULL);
113b236bcf1SEnji Cooper 	memcpy(ptr, "abcdefghijklmnopqrstuvwxyz",
114b236bcf1SEnji Cooper 	    sizeof("abcdefghijklmnopqrstuvwxyz"));
115b236bcf1SEnji Cooper 	nvlist_move_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz",
116b236bcf1SEnji Cooper 	    ptr, sizeof("abcdefghijklmnopqrstuvwxyz"));
117b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
118b236bcf1SEnji Cooper 	CHECK(nvlist_exists_binary(nvl,
119b236bcf1SEnji Cooper 	    "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
120b236bcf1SEnji Cooper 	CHECK(ptr == nvlist_get_binary(nvl,
121b236bcf1SEnji Cooper 	    "nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL));
122b236bcf1SEnji Cooper 	CHECK(ptr == nvlist_get_binary(nvl,
123b236bcf1SEnji Cooper 	    "nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size));
124b236bcf1SEnji Cooper 	CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
125b236bcf1SEnji Cooper 
126b236bcf1SEnji Cooper 	CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
127b236bcf1SEnji Cooper 	ptr = nvlist_clone(nvl);
128b236bcf1SEnji Cooper 	CHECK(ptr != NULL);
129b236bcf1SEnji Cooper 	nvlist_move_nvlist(nvl, "nvlist/nvlist", ptr);
130b236bcf1SEnji Cooper 	CHECK(nvlist_error(nvl) == 0);
131b236bcf1SEnji Cooper 	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
132b236bcf1SEnji Cooper 	CHECK(ptr == nvlist_get_nvlist(nvl, "nvlist/nvlist"));
133b236bcf1SEnji Cooper 
134b236bcf1SEnji Cooper 	CHECK(nvlist_exists_string(nvl, "nvlist/string/"));
135b236bcf1SEnji Cooper 	CHECK(nvlist_exists_string(nvl, "nvlist/string/x"));
136b236bcf1SEnji Cooper 	CHECK(nvlist_exists_string(nvl,
137b236bcf1SEnji Cooper 	    "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
138b236bcf1SEnji Cooper 	CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
139b236bcf1SEnji Cooper 	CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x"));
140b236bcf1SEnji Cooper 	CHECK(nvlist_exists_binary(nvl,
141b236bcf1SEnji Cooper 	    "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
142b236bcf1SEnji Cooper 	CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
143b236bcf1SEnji Cooper 
144b236bcf1SEnji Cooper 	cnvl = nvlist_get_nvlist(nvl, "nvlist/nvlist");
145b236bcf1SEnji Cooper 	CHECK(nvlist_exists_string(cnvl, "nvlist/string/"));
146b236bcf1SEnji Cooper 	CHECK(nvlist_exists_string(cnvl, "nvlist/string/x"));
147b236bcf1SEnji Cooper 	CHECK(nvlist_exists_string(cnvl,
148b236bcf1SEnji Cooper 	    "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
149b236bcf1SEnji Cooper 	CHECK(nvlist_exists_descriptor(cnvl,
150b236bcf1SEnji Cooper 	    "nvlist/descriptor/STDERR_FILENO"));
151b236bcf1SEnji Cooper 	CHECK(nvlist_exists_binary(cnvl, "nvlist/binary/x"));
152b236bcf1SEnji Cooper 	CHECK(nvlist_exists_binary(cnvl,
153b236bcf1SEnji Cooper 	    "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
154b236bcf1SEnji Cooper 
155b236bcf1SEnji Cooper 	nvlist_destroy(nvl);
156b236bcf1SEnji Cooper 
157b236bcf1SEnji Cooper 	return (0);
158b236bcf1SEnji Cooper }
159