1*24881c06SMariusz Zaborski /*-
2*24881c06SMariusz Zaborski * Copyright (c) 2018 The NetBSD Foundation, Inc.
3*24881c06SMariusz Zaborski * All rights reserved.
4*24881c06SMariusz Zaborski *
5*24881c06SMariusz Zaborski * Redistribution and use in source and binary forms, with or without
6*24881c06SMariusz Zaborski * modification, are permitted provided that the following conditions
7*24881c06SMariusz Zaborski * are met:
8*24881c06SMariusz Zaborski * 1. Redistributions of source code must retain the above copyright
9*24881c06SMariusz Zaborski * notice, this list of conditions and the following disclaimer.
10*24881c06SMariusz Zaborski * 2. Redistributions in binary form must reproduce the above copyright
11*24881c06SMariusz Zaborski * notice, this list of conditions and the following disclaimer in the
12*24881c06SMariusz Zaborski * documentation and/or other materials provided with the distribution.
13*24881c06SMariusz Zaborski *
14*24881c06SMariusz Zaborski * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
15*24881c06SMariusz Zaborski * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
16*24881c06SMariusz Zaborski * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17*24881c06SMariusz Zaborski * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
18*24881c06SMariusz Zaborski * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19*24881c06SMariusz Zaborski * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20*24881c06SMariusz Zaborski * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21*24881c06SMariusz Zaborski * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22*24881c06SMariusz Zaborski * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23*24881c06SMariusz Zaborski * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24*24881c06SMariusz Zaborski * POSSIBILITY OF SUCH DAMAGE.
25*24881c06SMariusz Zaborski */
26*24881c06SMariusz Zaborski
27*24881c06SMariusz Zaborski #include <sys/nv.h>
28*24881c06SMariusz Zaborski
29*24881c06SMariusz Zaborski #include <errno.h>
30*24881c06SMariusz Zaborski #include <stdio.h>
31*24881c06SMariusz Zaborski #include <stdlib.h>
32*24881c06SMariusz Zaborski #include <string.h>
33*24881c06SMariusz Zaborski #include <unistd.h>
34*24881c06SMariusz Zaborski
35*24881c06SMariusz Zaborski static int ntest = 1;
36*24881c06SMariusz Zaborski
37*24881c06SMariusz Zaborski #define CHECK(expr) do { \
38*24881c06SMariusz Zaborski if ((expr)) \
39*24881c06SMariusz Zaborski printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \
40*24881c06SMariusz Zaborski else \
41*24881c06SMariusz Zaborski printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
42*24881c06SMariusz Zaborski ntest++; \
43*24881c06SMariusz Zaborski } while (0)
44*24881c06SMariusz Zaborski
45*24881c06SMariusz Zaborski int
main(void)46*24881c06SMariusz Zaborski main(void)
47*24881c06SMariusz Zaborski {
48*24881c06SMariusz Zaborski const bool *bool_result;
49*24881c06SMariusz Zaborski const char * const *string_result;
50*24881c06SMariusz Zaborski const nvlist_t * const *nvl_result;
51*24881c06SMariusz Zaborski nvlist_t *nvl, *nvl1, *nvl2, **items;
52*24881c06SMariusz Zaborski unsigned int i;
53*24881c06SMariusz Zaborski size_t nitems;
54*24881c06SMariusz Zaborski
55*24881c06SMariusz Zaborski printf("1..32\n");
56*24881c06SMariusz Zaborski
57*24881c06SMariusz Zaborski nvl = nvlist_create(0);
58*24881c06SMariusz Zaborski
59*24881c06SMariusz Zaborski for (i = 0; i < 16; i++)
60*24881c06SMariusz Zaborski nvlist_append_bool_array(nvl, "nvl/bool", i % 2 == 0);
61*24881c06SMariusz Zaborski
62*24881c06SMariusz Zaborski CHECK(nvlist_error(nvl) == 0);
63*24881c06SMariusz Zaborski CHECK(!nvlist_empty(nvl));
64*24881c06SMariusz Zaborski CHECK(nvlist_exists_bool_array(nvl, "nvl/bool"));
65*24881c06SMariusz Zaborski
66*24881c06SMariusz Zaborski bool_result = nvlist_get_bool_array(nvl, "nvl/bool", &nitems);
67*24881c06SMariusz Zaborski CHECK(nitems == 16);
68*24881c06SMariusz Zaborski CHECK(bool_result != NULL);
69*24881c06SMariusz Zaborski for (i = 0; i < nitems; i++)
70*24881c06SMariusz Zaborski CHECK(bool_result[i] == (i % 2 == 0));
71*24881c06SMariusz Zaborski
72*24881c06SMariusz Zaborski
73*24881c06SMariusz Zaborski nvlist_append_string_array(nvl, "nvl/string", "a");
74*24881c06SMariusz Zaborski nvlist_append_string_array(nvl, "nvl/string", "abc");
75*24881c06SMariusz Zaborski string_result = nvlist_get_string_array(nvl, "nvl/string", &nitems);
76*24881c06SMariusz Zaborski CHECK(nitems == 2);
77*24881c06SMariusz Zaborski CHECK(strcmp(string_result[0], "a") == 0);
78*24881c06SMariusz Zaborski CHECK(strcmp(string_result[1], "abc") == 0);
79*24881c06SMariusz Zaborski
80*24881c06SMariusz Zaborski
81*24881c06SMariusz Zaborski nvl1 = nvlist_create(0);
82*24881c06SMariusz Zaborski nvlist_add_string(nvl1, "key1", "test1");
83*24881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl", nvl1);
84*24881c06SMariusz Zaborski nvlist_destroy(nvl1);
85*24881c06SMariusz Zaborski
86*24881c06SMariusz Zaborski nvl2 = nvlist_create(0);
87*24881c06SMariusz Zaborski nvlist_add_string(nvl2, "key2", "test2");
88*24881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl", nvl2);
89*24881c06SMariusz Zaborski nvlist_destroy(nvl2);
90*24881c06SMariusz Zaborski
91*24881c06SMariusz Zaborski nvl_result = nvlist_get_nvlist_array(nvl, "nvl/nvl", &nitems);
92*24881c06SMariusz Zaborski CHECK(nitems == 2);
93*24881c06SMariusz Zaborski CHECK(strcmp(nvlist_get_string(nvl_result[0], "key1"), "test1") == 0);
94*24881c06SMariusz Zaborski CHECK(strcmp(nvlist_get_string(nvl_result[1], "key2"), "test2") == 0);
95*24881c06SMariusz Zaborski
96*24881c06SMariusz Zaborski nvl1 = nvlist_create(0);
97*24881c06SMariusz Zaborski nvlist_add_number(nvl1, "key1", 10);
98*24881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl_array", nvl1);
99*24881c06SMariusz Zaborski nvlist_destroy(nvl1);
100*24881c06SMariusz Zaborski
101*24881c06SMariusz Zaborski nvl2 = nvlist_create(0);
102*24881c06SMariusz Zaborski nvlist_add_number(nvl2, "key1", 20);
103*24881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl_array", nvl2);
104*24881c06SMariusz Zaborski nvlist_destroy(nvl2);
105*24881c06SMariusz Zaborski
106*24881c06SMariusz Zaborski items = nvlist_take_nvlist_array(nvl, "nvl/nvl_array", &nitems);
107*24881c06SMariusz Zaborski CHECK(nvlist_get_number(items[0], "key1") == 10);
108*24881c06SMariusz Zaborski CHECK(nvlist_get_number(items[1], "key1") == 20);
109*24881c06SMariusz Zaborski CHECK(nvlist_error(items[0]) == 0);
110*24881c06SMariusz Zaborski CHECK(nvlist_error(items[1]) == 0);
111*24881c06SMariusz Zaborski
112*24881c06SMariusz Zaborski nvlist_move_nvlist_array(nvl, "nvl/nvl_new_array", items, nitems);
113*24881c06SMariusz Zaborski CHECK(nvlist_error(nvl) == 0);
114*24881c06SMariusz Zaborski
115*24881c06SMariusz Zaborski nvlist_destroy(nvl);
116*24881c06SMariusz Zaborski
117*24881c06SMariusz Zaborski return (0);
118*24881c06SMariusz Zaborski }
119