Author: pjd
Date: Tue Nov 12 20:31:16 2013
New Revision: 258070
URL: http://svnweb.freebsd.org/changeset/base/258070

Log:
  Regression tests for the libnv library.
  
  Sponsored by: The FreeBSD Foundation

Added:
  head/tools/regression/lib/libnv/
  head/tools/regression/lib/libnv/Makefile   (contents, props changed)
  head/tools/regression/lib/libnv/nvlist_add.c   (contents, props changed)
  head/tools/regression/lib/libnv/nvlist_exists.c   (contents, props changed)
  head/tools/regression/lib/libnv/nvlist_free.c   (contents, props changed)
  head/tools/regression/lib/libnv/nvlist_get.c   (contents, props changed)
  head/tools/regression/lib/libnv/nvlist_move.c   (contents, props changed)
  head/tools/regression/lib/libnv/nvlist_send_recv.c   (contents, props changed)

Added: head/tools/regression/lib/libnv/Makefile
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/tools/regression/lib/libnv/Makefile    Tue Nov 12 20:31:16 2013        
(r258070)
@@ -0,0 +1,35 @@
+# $FreeBSD$
+
+TESTS= nvlist_add
+TESTS+=        nvlist_exists
+TESTS+=        nvlist_free
+TESTS+=        nvlist_get
+TESTS+=        nvlist_move
+TESTS+=        nvlist_send_recv
+
+CFLAGS=        -O2 -pipe -fstack-protector
+CFLAGS+=-Wsystem-headers -Werror -Wall -Wno-format-y2k -W -Wno-unused-parameter
+CFLAGS+=-Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wreturn-type
+CFLAGS+=-Wcast-qual -Wwrite-strings -Wswitch -Wshadow -Wunused-parameter
+CFLAGS+=-Wcast-align -Wchar-subscripts -Winline -Wnested-externs 
-Wredundant-decls
+CFLAGS+=-Wold-style-definition -Wno-pointer-sign -Wextra
+
+LDFLAGS+=-lnv
+
+all:   ${TESTS} ${TESTS:=.t}
+
+.for TEST in ${TESTS}
+
+${TEST}:       ${TEST}.c
+       ${CC} ${CFLAGS} ${LDFLAGS} ${@}.c -o $@
+
+${TEST}.t:   ${TEST}
+       @printf "#!/bin/sh\n\n%s/%s\n" ${.CURDIR} ${@:.t=} > $@
+
+.endfor
+
+test:   all
+       @prove -r ${.CURDIR}
+
+clean:
+       rm -f ${TESTS} ${TESTS:=.t}

Added: head/tools/regression/lib/libnv/nvlist_add.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/tools/regression/lib/libnv/nvlist_add.c        Tue Nov 12 20:31:16 
2013        (r258070)
@@ -0,0 +1,196 @@
+/*-
+ * Copyright (c) 2013 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Pawel Jakub Dawidek under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <nv.h>
+
+static int ntest = 1;
+
+#define        CHECK(expr)     do {                                            
\
+       if ((expr))                                                     \
+               printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);   \
+       else                                                            \
+               printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
+       ntest++;                                                        \
+} while (0)
+
+int
+main(void)
+{
+       const nvlist_t *cnvl;
+       nvlist_t *nvl;
+
+       printf("1..94\n");
+
+       nvl = nvlist_create(0);
+
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       nvlist_add_null(nvl, "nvlist/null");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_null(nvl, "nvlist/null"));
+
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/true"));
+       nvlist_add_bool(nvl, "nvlist/bool/true", true);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_bool(nvl, "nvlist/bool/true"));
+
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/false"));
+       nvlist_add_bool(nvl, "nvlist/bool/false", false);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_bool(nvl, "nvlist/bool/false"));
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/0"));
+       nvlist_add_number(nvl, "nvlist/number/0", 0);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/0"));
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/1"));
+       nvlist_add_number(nvl, "nvlist/number/1", 1);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/1"));
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/-1"));
+       nvlist_add_number(nvl, "nvlist/number/-1", -1);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/-1"));
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
+       nvlist_add_number(nvl, "nvlist/number/UINT64_MAX", UINT64_MAX);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
+       nvlist_add_number(nvl, "nvlist/number/INT64_MIN", INT64_MIN);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
+       nvlist_add_number(nvl, "nvlist/number/INT64_MAX", INT64_MAX);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
+
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string/"));
+       nvlist_add_string(nvl, "nvlist/string/", "");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_string(nvl, "nvlist/string/"));
+
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string/x"));
+       nvlist_add_string(nvl, "nvlist/string/x", "x");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_string(nvl, "nvlist/string/x"));
+
+       CHECK(!nvlist_exists_string(nvl, 
"nvlist/string/abcdefghijklmnopqrstuvwxyz"));
+       nvlist_add_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz", 
"abcdefghijklmnopqrstuvwxyz");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_string(nvl, 
"nvlist/string/abcdefghijklmnopqrstuvwxyz"));
+
+       CHECK(!nvlist_exists_string(nvl, "nvlist/stringf/"));
+       nvlist_add_stringf(nvl, "nvlist/stringf/", "%s", "");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_string(nvl, "nvlist/stringf/"));
+
+       CHECK(!nvlist_exists_string(nvl, "nvlist/stringf/x"));
+       nvlist_add_stringf(nvl, "nvlist/stringf/x", "%s", "x");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_string(nvl, "nvlist/stringf/x"));
+
+       CHECK(!nvlist_exists_string(nvl, "nvlist/stringf/666Xabc"));
+       nvlist_add_stringf(nvl, "nvlist/stringf/666Xabc", "%d%c%s", 666, 'X', 
"abc");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_string(nvl, "nvlist/stringf/666Xabc"));
+
+       CHECK(!nvlist_exists_descriptor(nvl, 
"nvlist/descriptor/STDERR_FILENO"));
+       nvlist_add_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", 
STDERR_FILENO);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
+
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/x"));
+       nvlist_add_binary(nvl, "nvlist/binary/x", "x", 1);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x"));
+
+       CHECK(!nvlist_exists_binary(nvl, 
"nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
+       nvlist_add_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", 
"abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz"));
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_binary(nvl, 
"nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
+
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+
+       CHECK(nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(nvlist_exists_bool(nvl, "nvlist/bool/true"));
+       CHECK(nvlist_exists_bool(nvl, "nvlist/bool/false"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/0"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/1"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/-1"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string/"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string/x"));
+       CHECK(nvlist_exists_string(nvl, 
"nvlist/string/abcdefghijklmnopqrstuvwxyz"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/stringf/"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/stringf/x"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/stringf/666Xabc"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x"));
+       CHECK(nvlist_exists_binary(nvl, 
"nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+
+       cnvl = nvlist_get_nvlist(nvl, "nvlist/nvlist");
+       CHECK(nvlist_exists_null(cnvl, "nvlist/null"));
+       CHECK(nvlist_exists_bool(cnvl, "nvlist/bool/true"));
+       CHECK(nvlist_exists_bool(cnvl, "nvlist/bool/false"));
+       CHECK(nvlist_exists_number(cnvl, "nvlist/number/0"));
+       CHECK(nvlist_exists_number(cnvl, "nvlist/number/1"));
+       CHECK(nvlist_exists_number(cnvl, "nvlist/number/-1"));
+       CHECK(nvlist_exists_number(cnvl, "nvlist/number/UINT64_MAX"));
+       CHECK(nvlist_exists_number(cnvl, "nvlist/number/INT64_MIN"));
+       CHECK(nvlist_exists_number(cnvl, "nvlist/number/INT64_MAX"));
+       CHECK(nvlist_exists_string(cnvl, "nvlist/string/"));
+       CHECK(nvlist_exists_string(cnvl, "nvlist/string/x"));
+       CHECK(nvlist_exists_string(cnvl, 
"nvlist/string/abcdefghijklmnopqrstuvwxyz"));
+       CHECK(nvlist_exists_string(cnvl, "nvlist/stringf/"));
+       CHECK(nvlist_exists_string(cnvl, "nvlist/stringf/x"));
+       CHECK(nvlist_exists_string(cnvl, "nvlist/stringf/666Xabc"));
+       CHECK(nvlist_exists_descriptor(cnvl, 
"nvlist/descriptor/STDERR_FILENO"));
+       CHECK(nvlist_exists_binary(cnvl, "nvlist/binary/x"));
+       CHECK(nvlist_exists_binary(cnvl, 
"nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
+
+       nvlist_destroy(nvl);
+
+       return (0);
+}

Added: head/tools/regression/lib/libnv/nvlist_exists.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/tools/regression/lib/libnv/nvlist_exists.c     Tue Nov 12 20:31:16 
2013        (r258070)
@@ -0,0 +1,321 @@
+/*-
+ * Copyright (c) 2013 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Pawel Jakub Dawidek under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+
+#include <nv.h>
+
+static int ntest = 1;
+
+#define        CHECK(expr)     do {                                            
\
+       if ((expr))                                                     \
+               printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);   \
+       else                                                            \
+               printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
+       ntest++;                                                        \
+} while (0)
+
+int
+main(void)
+{
+       nvlist_t *nvl;
+
+       printf("1..232\n");
+
+       nvl = nvlist_create(0);
+
+       CHECK(!nvlist_exists(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/null"));
+       nvlist_add_null(nvl, "nvlist/null");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists(nvl, "nvlist/null"));
+       CHECK(nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/null"));
+
+       CHECK(!nvlist_exists(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/bool"));
+       nvlist_add_bool(nvl, "nvlist/bool", true);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/bool"));
+
+       CHECK(!nvlist_exists(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/number"));
+       nvlist_add_number(nvl, "nvlist/number", 0);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/number"));
+
+       CHECK(!nvlist_exists(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/string"));
+       nvlist_add_string(nvl, "nvlist/string", "test");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/string"));
+
+       CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/nvlist"));
+       nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/nvlist"));
+
+       CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/descriptor"));
+       nvlist_add_descriptor(nvl, "nvlist/descriptor", STDERR_FILENO);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/descriptor"));
+
+       CHECK(!nvlist_exists(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
+       nvlist_add_binary(nvl, "nvlist/binary", "test", 4);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_exists(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/binary"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       CHECK(nvlist_exists(nvl, "nvlist/null"));
+       CHECK(nvlist_exists(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists(nvl, "nvlist/number"));
+       CHECK(nvlist_exists(nvl, "nvlist/string"));
+       CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists(nvl, "nvlist/binary"));
+       CHECK(nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_null(nvl, "nvlist/null");
+       CHECK(!nvlist_exists(nvl, "nvlist/null"));
+       CHECK(nvlist_exists(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists(nvl, "nvlist/number"));
+       CHECK(nvlist_exists(nvl, "nvlist/string"));
+       CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_bool(nvl, "nvlist/bool");
+       CHECK(!nvlist_exists(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists(nvl, "nvlist/number"));
+       CHECK(nvlist_exists(nvl, "nvlist/string"));
+       CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_number(nvl, "nvlist/number");
+       CHECK(!nvlist_exists(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists(nvl, "nvlist/number"));
+       CHECK(nvlist_exists(nvl, "nvlist/string"));
+       CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_string(nvl, "nvlist/string");
+       CHECK(!nvlist_exists(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists(nvl, "nvlist/string"));
+       CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_nvlist(nvl, "nvlist/nvlist");
+       CHECK(!nvlist_exists(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_descriptor(nvl, "nvlist/descriptor");
+       CHECK(!nvlist_exists(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_binary(nvl, "nvlist/binary");
+       CHECK(!nvlist_exists(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists(nvl, "nvlist/binary"));
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       CHECK(nvlist_empty(nvl));
+
+       nvlist_destroy(nvl);
+
+       return (0);
+}

Added: head/tools/regression/lib/libnv/nvlist_free.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/tools/regression/lib/libnv/nvlist_free.c       Tue Nov 12 20:31:16 
2013        (r258070)
@@ -0,0 +1,221 @@
+/*-
+ * Copyright (c) 2013 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Pawel Jakub Dawidek under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+
+#include <nv.h>
+
+static int ntest = 1;
+
+#define        CHECK(expr)     do {                                            
\
+       if ((expr))                                                     \
+               printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);   \
+       else                                                            \
+               printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
+       ntest++;                                                        \
+} while (0)
+
+int
+main(void)
+{
+       nvlist_t *nvl;
+
+       printf("1..114\n");
+
+       nvl = nvlist_create(0);
+
+       nvlist_add_null(nvl, "nvlist/null");
+       nvlist_add_bool(nvl, "nvlist/bool", true);
+       nvlist_add_number(nvl, "nvlist/number", 0);
+       nvlist_add_string(nvl, "nvlist/string", "test");
+       nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
+       nvlist_add_descriptor(nvl, "nvlist/descriptor", STDERR_FILENO);
+       nvlist_add_binary(nvl, "nvlist/binary", "test", 4);
+
+       CHECK(nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_null(nvl, "nvlist/null");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_bool(nvl, "nvlist/bool");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_number(nvl, "nvlist/number");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_string(nvl, "nvlist/string");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_nvlist(nvl, "nvlist/nvlist");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_descriptor(nvl, "nvlist/descriptor");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free_binary(nvl, "nvlist/binary");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       CHECK(nvlist_empty(nvl));
+
+       nvlist_add_null(nvl, "nvlist/null");
+       nvlist_add_bool(nvl, "nvlist/bool", true);
+       nvlist_add_number(nvl, "nvlist/number", 0);
+       nvlist_add_string(nvl, "nvlist/string", "test");
+       nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
+       nvlist_add_descriptor(nvl, "nvlist/descriptor", STDERR_FILENO);
+       nvlist_add_binary(nvl, "nvlist/binary", "test", 4);
+
+       CHECK(nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free(nvl, "nvlist/null");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free(nvl, "nvlist/bool");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free(nvl, "nvlist/number");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free(nvl, "nvlist/string");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free(nvl, "nvlist/nvlist");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free(nvl, "nvlist/descriptor");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       nvlist_free(nvl, "nvlist/binary");
+       CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
+
+       CHECK(nvlist_empty(nvl));
+
+       nvlist_destroy(nvl);
+
+       return (0);
+}

Added: head/tools/regression/lib/libnv/nvlist_get.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/tools/regression/lib/libnv/nvlist_get.c        Tue Nov 12 20:31:16 
2013        (r258070)
@@ -0,0 +1,182 @@
+/*-
+ * Copyright (c) 2013 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Pawel Jakub Dawidek under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <nv.h>
+
+static int ntest = 1;
+
+#define        CHECK(expr)     do {                                            
\
+       if ((expr))                                                     \
+               printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__);   \
+       else                                                            \
+               printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
+       ntest++;                                                        \
+} while (0)
+
+#define        fd_is_valid(fd) (fcntl((fd), F_GETFL) != -1 || errno != EBADF)
+
+int
+main(void)
+{
+       const nvlist_t *cnvl;
+       nvlist_t *nvl;
+       size_t size;
+
+       printf("1..83\n");
+
+       nvl = nvlist_create(0);
+
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/true"));
+       nvlist_add_bool(nvl, "nvlist/bool/true", true);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_get_bool(nvl, "nvlist/bool/true") == true);
+
+       CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/false"));
+       nvlist_add_bool(nvl, "nvlist/bool/false", false);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_get_bool(nvl, "nvlist/bool/false") == false);
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/0"));
+       nvlist_add_number(nvl, "nvlist/number/0", 0);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_get_number(nvl, "nvlist/number/0") == 0);
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/1"));
+       nvlist_add_number(nvl, "nvlist/number/1", 1);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_get_number(nvl, "nvlist/number/1") == 1);
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/-1"));
+       nvlist_add_number(nvl, "nvlist/number/-1", -1);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK((int)nvlist_get_number(nvl, "nvlist/number/-1") == -1);
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
+       nvlist_add_number(nvl, "nvlist/number/UINT64_MAX", UINT64_MAX);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(nvlist_get_number(nvl, "nvlist/number/UINT64_MAX") == UINT64_MAX);
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
+       nvlist_add_number(nvl, "nvlist/number/INT64_MIN", INT64_MIN);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MIN") == 
INT64_MIN);
+
+       CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
+       nvlist_add_number(nvl, "nvlist/number/INT64_MAX", INT64_MAX);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MAX") == 
INT64_MAX);
+
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string/"));
+       nvlist_add_string(nvl, "nvlist/string/", "");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/"), "") == 0);
+
+       CHECK(!nvlist_exists_string(nvl, "nvlist/string/x"));
+       nvlist_add_string(nvl, "nvlist/string/x", "x");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/x"), "x") == 0);
+
+       CHECK(!nvlist_exists_string(nvl, 
"nvlist/string/abcdefghijklmnopqrstuvwxyz"));
+       nvlist_add_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz", 
"abcdefghijklmnopqrstuvwxyz");
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(strcmp(nvlist_get_string(nvl, 
"nvlist/string/abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz") == 
0);
+
+       CHECK(!nvlist_exists_descriptor(nvl, 
"nvlist/descriptor/STDERR_FILENO"));
+       nvlist_add_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", 
STDERR_FILENO);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(fd_is_valid(nvlist_get_descriptor(nvl, 
"nvlist/descriptor/STDERR_FILENO")));
+
+       CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/x"));
+       nvlist_add_binary(nvl, "nvlist/binary/x", "x", 1);
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", NULL), "x", 1) 
== 0);
+       CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", &size), "x", 1) 
== 0);
+       CHECK(size == 1);
+
+       CHECK(!nvlist_exists_binary(nvl, 
"nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
+       nvlist_add_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", 
"abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz"));
+       CHECK(nvlist_error(nvl) == 0);
+       CHECK(memcmp(nvlist_get_binary(nvl, 
"nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL), 
"abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
+       CHECK(memcmp(nvlist_get_binary(nvl, 
"nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size), 
"abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
+       CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
+
+       CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
+       nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
+       CHECK(nvlist_error(nvl) == 0);
+       cnvl = nvlist_get_nvlist(nvl, "nvlist/nvlist");
+       CHECK(nvlist_get_bool(cnvl, "nvlist/bool/true") == true);
+       CHECK(nvlist_get_bool(cnvl, "nvlist/bool/false") == false);
+       CHECK(nvlist_get_number(cnvl, "nvlist/number/0") == 0);
+       CHECK(nvlist_get_number(cnvl, "nvlist/number/1") == 1);
+       CHECK((int)nvlist_get_number(cnvl, "nvlist/number/-1") == -1);
+       CHECK(nvlist_get_number(cnvl, "nvlist/number/UINT64_MAX") == 
UINT64_MAX);
+       CHECK((int64_t)nvlist_get_number(cnvl, "nvlist/number/INT64_MIN") == 
INT64_MIN);
+       CHECK((int64_t)nvlist_get_number(cnvl, "nvlist/number/INT64_MAX") == 
INT64_MAX);
+       CHECK(strcmp(nvlist_get_string(cnvl, "nvlist/string/"), "") == 0);
+       CHECK(strcmp(nvlist_get_string(cnvl, "nvlist/string/x"), "x") == 0);
+       CHECK(strcmp(nvlist_get_string(cnvl, 
"nvlist/string/abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz") == 
0);
+       /* TODO */
+       CHECK(memcmp(nvlist_get_binary(cnvl, "nvlist/binary/x", NULL), "x", 1) 
== 0);
+       CHECK(memcmp(nvlist_get_binary(cnvl, "nvlist/binary/x", &size), "x", 1) 
== 0);
+       CHECK(size == 1);
+       CHECK(memcmp(nvlist_get_binary(cnvl, 
"nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL), 
"abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
+       CHECK(memcmp(nvlist_get_binary(cnvl, 
"nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size), 
"abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
+       CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
+
+       CHECK(nvlist_get_bool(nvl, "nvlist/bool/true") == true);
+       CHECK(nvlist_get_bool(nvl, "nvlist/bool/false") == false);
+       CHECK(nvlist_get_number(nvl, "nvlist/number/0") == 0);
+       CHECK(nvlist_get_number(nvl, "nvlist/number/1") == 1);
+       CHECK((int)nvlist_get_number(nvl, "nvlist/number/-1") == -1);
+       CHECK(nvlist_get_number(nvl, "nvlist/number/UINT64_MAX") == UINT64_MAX);
+       CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MIN") == 
INT64_MIN);
+       CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MAX") == 
INT64_MAX);
+       CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/"), "") == 0);
+       CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/x"), "x") == 0);
+       CHECK(strcmp(nvlist_get_string(nvl, 
"nvlist/string/abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz") == 
0);
+       CHECK(fd_is_valid(nvlist_get_descriptor(nvl, 
"nvlist/descriptor/STDERR_FILENO")));
+       CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", NULL), "x", 1) 
== 0);
+       CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", &size), "x", 1) 
== 0);
+       CHECK(size == 1);
+       CHECK(memcmp(nvlist_get_binary(nvl, 
"nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL), 
"abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
+       CHECK(memcmp(nvlist_get_binary(nvl, 
"nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size), 
"abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
+       CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
+
+       nvlist_destroy(nvl);
+
+       return (0);
+}

Added: head/tools/regression/lib/libnv/nvlist_move.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/tools/regression/lib/libnv/nvlist_move.c       Tue Nov 12 20:31:16 
2013        (r258070)
@@ -0,0 +1,161 @@
+/*-
+ * Copyright (c) 2013 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Pawel Jakub Dawidek under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to