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 * $FreeBSD$ 2724881c06SMariusz Zaborski */ 2824881c06SMariusz Zaborski 2924881c06SMariusz Zaborski #include <sys/nv.h> 3024881c06SMariusz Zaborski 3124881c06SMariusz Zaborski #include <errno.h> 3224881c06SMariusz Zaborski #include <stdio.h> 3324881c06SMariusz Zaborski #include <stdlib.h> 3424881c06SMariusz Zaborski #include <string.h> 3524881c06SMariusz Zaborski #include <unistd.h> 3624881c06SMariusz Zaborski 3724881c06SMariusz Zaborski static int ntest = 1; 3824881c06SMariusz Zaborski 3924881c06SMariusz Zaborski #define CHECK(expr) do { \ 4024881c06SMariusz Zaborski if ((expr)) \ 4124881c06SMariusz Zaborski printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \ 4224881c06SMariusz Zaborski else \ 4324881c06SMariusz Zaborski printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\ 4424881c06SMariusz Zaborski ntest++; \ 4524881c06SMariusz Zaborski } while (0) 4624881c06SMariusz Zaborski 4724881c06SMariusz Zaborski int 4824881c06SMariusz Zaborski main(void) 4924881c06SMariusz Zaborski { 5024881c06SMariusz Zaborski const bool *bool_result; 5124881c06SMariusz Zaborski const char * const *string_result; 5224881c06SMariusz Zaborski const nvlist_t * const *nvl_result; 5324881c06SMariusz Zaborski nvlist_t *nvl, *nvl1, *nvl2, **items; 5424881c06SMariusz Zaborski unsigned int i; 5524881c06SMariusz Zaborski size_t nitems; 5624881c06SMariusz Zaborski 5724881c06SMariusz Zaborski printf("1..32\n"); 5824881c06SMariusz Zaborski 5924881c06SMariusz Zaborski nvl = nvlist_create(0); 6024881c06SMariusz Zaborski 6124881c06SMariusz Zaborski for (i = 0; i < 16; i++) 6224881c06SMariusz Zaborski nvlist_append_bool_array(nvl, "nvl/bool", i % 2 == 0); 6324881c06SMariusz Zaborski 6424881c06SMariusz Zaborski CHECK(nvlist_error(nvl) == 0); 6524881c06SMariusz Zaborski CHECK(!nvlist_empty(nvl)); 6624881c06SMariusz Zaborski CHECK(nvlist_exists_bool_array(nvl, "nvl/bool")); 6724881c06SMariusz Zaborski 6824881c06SMariusz Zaborski bool_result = nvlist_get_bool_array(nvl, "nvl/bool", &nitems); 6924881c06SMariusz Zaborski CHECK(nitems == 16); 7024881c06SMariusz Zaborski CHECK(bool_result != NULL); 7124881c06SMariusz Zaborski for (i = 0; i < nitems; i++) 7224881c06SMariusz Zaborski CHECK(bool_result[i] == (i % 2 == 0)); 7324881c06SMariusz Zaborski 7424881c06SMariusz Zaborski 7524881c06SMariusz Zaborski nvlist_append_string_array(nvl, "nvl/string", "a"); 7624881c06SMariusz Zaborski nvlist_append_string_array(nvl, "nvl/string", "abc"); 7724881c06SMariusz Zaborski string_result = nvlist_get_string_array(nvl, "nvl/string", &nitems); 7824881c06SMariusz Zaborski CHECK(nitems == 2); 7924881c06SMariusz Zaborski CHECK(strcmp(string_result[0], "a") == 0); 8024881c06SMariusz Zaborski CHECK(strcmp(string_result[1], "abc") == 0); 8124881c06SMariusz Zaborski 8224881c06SMariusz Zaborski 8324881c06SMariusz Zaborski nvl1 = nvlist_create(0); 8424881c06SMariusz Zaborski nvlist_add_string(nvl1, "key1", "test1"); 8524881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl", nvl1); 8624881c06SMariusz Zaborski nvlist_destroy(nvl1); 8724881c06SMariusz Zaborski 8824881c06SMariusz Zaborski nvl2 = nvlist_create(0); 8924881c06SMariusz Zaborski nvlist_add_string(nvl2, "key2", "test2"); 9024881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl", nvl2); 9124881c06SMariusz Zaborski nvlist_destroy(nvl2); 9224881c06SMariusz Zaborski 9324881c06SMariusz Zaborski nvl_result = nvlist_get_nvlist_array(nvl, "nvl/nvl", &nitems); 9424881c06SMariusz Zaborski CHECK(nitems == 2); 9524881c06SMariusz Zaborski CHECK(strcmp(nvlist_get_string(nvl_result[0], "key1"), "test1") == 0); 9624881c06SMariusz Zaborski CHECK(strcmp(nvlist_get_string(nvl_result[1], "key2"), "test2") == 0); 9724881c06SMariusz Zaborski 9824881c06SMariusz Zaborski nvl1 = nvlist_create(0); 9924881c06SMariusz Zaborski nvlist_add_number(nvl1, "key1", 10); 10024881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl_array", nvl1); 10124881c06SMariusz Zaborski nvlist_destroy(nvl1); 10224881c06SMariusz Zaborski 10324881c06SMariusz Zaborski nvl2 = nvlist_create(0); 10424881c06SMariusz Zaborski nvlist_add_number(nvl2, "key1", 20); 10524881c06SMariusz Zaborski nvlist_append_nvlist_array(nvl, "nvl/nvl_array", nvl2); 10624881c06SMariusz Zaborski nvlist_destroy(nvl2); 10724881c06SMariusz Zaborski 10824881c06SMariusz Zaborski items = nvlist_take_nvlist_array(nvl, "nvl/nvl_array", &nitems); 10924881c06SMariusz Zaborski CHECK(nvlist_get_number(items[0], "key1") == 10); 11024881c06SMariusz Zaborski CHECK(nvlist_get_number(items[1], "key1") == 20); 11124881c06SMariusz Zaborski CHECK(nvlist_error(items[0]) == 0); 11224881c06SMariusz Zaborski CHECK(nvlist_error(items[1]) == 0); 11324881c06SMariusz Zaborski 11424881c06SMariusz Zaborski nvlist_move_nvlist_array(nvl, "nvl/nvl_new_array", items, nitems); 11524881c06SMariusz Zaborski CHECK(nvlist_error(nvl) == 0); 11624881c06SMariusz Zaborski 11724881c06SMariusz Zaborski nvlist_destroy(nvl); 11824881c06SMariusz Zaborski 11924881c06SMariusz Zaborski return (0); 12024881c06SMariusz Zaborski } 121