124881c06SMariusz Zaborski /*-
224881c06SMariusz Zaborski * Copyright (c) 2018 The NetBSD Foundation, Inc.
324881c06SMariusz Zaborski * All rights reserved.
424881c06SMariusz Zaborski *
524881c06SMariusz Zaborski * Redistribution and use in source and binary forms, with or without
624881c06SMariusz Zaborski * modification, are permitted provided that the following conditions
724881c06SMariusz Zaborski * are met:
824881c06SMariusz Zaborski * 1. Redistributions of source code must retain the above copyright
924881c06SMariusz Zaborski * notice, this list of conditions and the following disclaimer.
1024881c06SMariusz Zaborski * 2. Redistributions in binary form must reproduce the above copyright
1124881c06SMariusz Zaborski * notice, this list of conditions and the following disclaimer in the
1224881c06SMariusz Zaborski * documentation and/or other materials provided with the distribution.
1324881c06SMariusz Zaborski *
1424881c06SMariusz Zaborski * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1524881c06SMariusz Zaborski * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1624881c06SMariusz Zaborski * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1724881c06SMariusz Zaborski * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
1824881c06SMariusz Zaborski * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1924881c06SMariusz Zaborski * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2024881c06SMariusz Zaborski * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2124881c06SMariusz Zaborski * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2224881c06SMariusz Zaborski * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2324881c06SMariusz Zaborski * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2424881c06SMariusz Zaborski * POSSIBILITY OF SUCH DAMAGE.
2524881c06SMariusz Zaborski */
2624881c06SMariusz Zaborski
2724881c06SMariusz Zaborski #include <sys/nv.h>
2824881c06SMariusz Zaborski
2924881c06SMariusz Zaborski #include <errno.h>
3024881c06SMariusz Zaborski #include <stdio.h>
3124881c06SMariusz Zaborski #include <stdlib.h>
3224881c06SMariusz Zaborski #include <string.h>
3324881c06SMariusz Zaborski #include <unistd.h>
3424881c06SMariusz Zaborski
3524881c06SMariusz Zaborski static int ntest = 1;
3624881c06SMariusz Zaborski
3724881c06SMariusz Zaborski #define CHECK(expr) do { \
3824881c06SMariusz Zaborski if ((expr)) \
3924881c06SMariusz Zaborski printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \
4024881c06SMariusz Zaborski else \
4124881c06SMariusz Zaborski printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
4224881c06SMariusz Zaborski ntest++; \
4324881c06SMariusz Zaborski } while (0)
4424881c06SMariusz Zaborski
4524881c06SMariusz Zaborski int
main(void)4624881c06SMariusz Zaborski main(void)
4724881c06SMariusz Zaborski {
4824881c06SMariusz Zaborski const bool *bool_result;
4924881c06SMariusz Zaborski const char * const *string_result;
5024881c06SMariusz Zaborski const nvlist_t * const *nvl_result;
5124881c06SMariusz Zaborski nvlist_t *nvl, *nvl1, *nvl2, **items;
5224881c06SMariusz Zaborski unsigned int i;
5324881c06SMariusz Zaborski size_t nitems;
5424881c06SMariusz Zaborski
5524881c06SMariusz Zaborski printf("1..32\n");
5624881c06SMariusz Zaborski
5724881c06SMariusz Zaborski nvl = nvlist_create(0);
5824881c06SMariusz Zaborski
5924881c06SMariusz Zaborski for (i = 0; i < 16; i++)
6024881c06SMariusz Zaborski nvlist_append_bool_array(nvl, "nvl/bool", i % 2 == 0);
6124881c06SMariusz Zaborski
6224881c06SMariusz Zaborski CHECK(nvlist_error(nvl) == 0);
6324881c06SMariusz Zaborski CHECK(!nvlist_empty(nvl));
6424881c06SMariusz Zaborski CHECK(nvlist_exists_bool_array(nvl, "nvl/bool"));
6524881c06SMariusz Zaborski
6624881c06SMariusz Zaborski bool_result = nvlist_get_bool_array(nvl, "nvl/bool", &nitems);
6724881c06SMariusz Zaborski CHECK(nitems == 16);
6824881c06SMariusz Zaborski CHECK(bool_result != NULL);
6924881c06SMariusz Zaborski for (i = 0; i < nitems; i++)
7024881c06SMariusz Zaborski CHECK(bool_result[i] == (i % 2 == 0));
7124881c06SMariusz Zaborski
7224881c06SMariusz Zaborski
7324881c06SMariusz Zaborski nvlist_append_string_array(nvl, "nvl/string", "a");
7424881c06SMariusz Zaborski nvlist_append_string_array(nvl, "nvl/string", "abc");
7524881c06SMariusz Zaborski string_result = nvlist_get_string_array(nvl, "nvl/string", &nitems);
7624881c06SMariusz Zaborski CHECK(nitems == 2);
7724881c06SMariusz Zaborski CHECK(strcmp(string_result[0], "a") == 0);
7824881c06SMariusz Zaborski CHECK(strcmp(string_result[1], "abc") == 0);
7924881c06SMariusz Zaborski
8024881c06SMariusz Zaborski
8124881c06SMariusz Zaborski nvl1 = nvlist_create(0);
8224881c06SMariusz Zaborski nvlist_add_string(nvl1, "key1", "test1");
8324881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl", nvl1);
8424881c06SMariusz Zaborski nvlist_destroy(nvl1);
8524881c06SMariusz Zaborski
8624881c06SMariusz Zaborski nvl2 = nvlist_create(0);
8724881c06SMariusz Zaborski nvlist_add_string(nvl2, "key2", "test2");
8824881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl", nvl2);
8924881c06SMariusz Zaborski nvlist_destroy(nvl2);
9024881c06SMariusz Zaborski
9124881c06SMariusz Zaborski nvl_result = nvlist_get_nvlist_array(nvl, "nvl/nvl", &nitems);
9224881c06SMariusz Zaborski CHECK(nitems == 2);
9324881c06SMariusz Zaborski CHECK(strcmp(nvlist_get_string(nvl_result[0], "key1"), "test1") == 0);
9424881c06SMariusz Zaborski CHECK(strcmp(nvlist_get_string(nvl_result[1], "key2"), "test2") == 0);
9524881c06SMariusz Zaborski
9624881c06SMariusz Zaborski nvl1 = nvlist_create(0);
9724881c06SMariusz Zaborski nvlist_add_number(nvl1, "key1", 10);
9824881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl_array", nvl1);
9924881c06SMariusz Zaborski nvlist_destroy(nvl1);
10024881c06SMariusz Zaborski
10124881c06SMariusz Zaborski nvl2 = nvlist_create(0);
10224881c06SMariusz Zaborski nvlist_add_number(nvl2, "key1", 20);
10324881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl_array", nvl2);
10424881c06SMariusz Zaborski nvlist_destroy(nvl2);
10524881c06SMariusz Zaborski
10624881c06SMariusz Zaborski items = nvlist_take_nvlist_array(nvl, "nvl/nvl_array", &nitems);
10724881c06SMariusz Zaborski CHECK(nvlist_get_number(items[0], "key1") == 10);
10824881c06SMariusz Zaborski CHECK(nvlist_get_number(items[1], "key1") == 20);
10924881c06SMariusz Zaborski CHECK(nvlist_error(items[0]) == 0);
11024881c06SMariusz Zaborski CHECK(nvlist_error(items[1]) == 0);
11124881c06SMariusz Zaborski
11224881c06SMariusz Zaborski nvlist_move_nvlist_array(nvl, "nvl/nvl_new_array", items, nitems);
11324881c06SMariusz Zaborski CHECK(nvlist_error(nvl) == 0);
11424881c06SMariusz Zaborski
11524881c06SMariusz Zaborski nvlist_destroy(nvl);
11624881c06SMariusz Zaborski
11724881c06SMariusz Zaborski return (0);
11824881c06SMariusz Zaborski }
119