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