diff options
author | ngie <ngie@FreeBSD.org> | 2014-08-27 18:25:14 +0000 |
---|---|---|
committer | ngie <ngie@FreeBSD.org> | 2014-08-27 18:25:14 +0000 |
commit | 3d2bab33aa9bc3dde1dd57cf667e10eb89730df8 (patch) | |
tree | 4b996aa897962c40692fc76d3019b80f747456ec /tools/regression/lib | |
parent | 7901389ab7af88345b39d8f30df648bec2bcd2ac (diff) | |
download | FreeBSD-src-3d2bab33aa9bc3dde1dd57cf667e10eb89730df8.zip FreeBSD-src-3d2bab33aa9bc3dde1dd57cf667e10eb89730df8.tar.gz |
MFC r270180:
r269906:
Add missing BSD.tests.dist entry for lib/libutil to unbreak installworld with
MK_TESTS == no
Phabric: D555
Approved by: jmmv (mentor, implicit)
Pointyhat to: ngie
r269904:
Integrate lib/libutil into the build/kyua
Remove the .t wrappers
Rename all of the TAP test applications from test-<test> to
<test>_test to match the convention described in the TestSuite
wiki page
humanize_number_test.c:
- Fix -Wformat warnings with counter variables
- Fix minor style(9) issues:
-- Header sorting
-- Variable declaration alignment/sorting in main(..)
-- Fit the lines in <80 columns
- Fix an off by one index error in the testcase output [*]
- Remove unnecessary `extern char * optarg;` (this is already provided by
unistd.h)
Phabric: D555
Approved by: jmmv (mentor)
Obtained from: EMC / Isilon Storage Division [*]
Submitted by: Casey Peel <cpeel@isilon.com> [*]
Sponsored by: EMC / Isilon Storage Division
Diffstat (limited to 'tools/regression/lib')
-rw-r--r-- | tools/regression/lib/libutil/Makefile | 13 | ||||
-rw-r--r-- | tools/regression/lib/libutil/test-flopen.c | 210 | ||||
-rw-r--r-- | tools/regression/lib/libutil/test-flopen.t | 12 | ||||
-rw-r--r-- | tools/regression/lib/libutil/test-grp.c | 117 | ||||
-rw-r--r-- | tools/regression/lib/libutil/test-grp.t | 12 | ||||
-rw-r--r-- | tools/regression/lib/libutil/test-humanize_number.c | 592 | ||||
-rwxr-xr-x | tools/regression/lib/libutil/test-humanize_number.t | 10 | ||||
-rw-r--r-- | tools/regression/lib/libutil/test-pidfile.c | 280 | ||||
-rw-r--r-- | tools/regression/lib/libutil/test-trimdomain-nodomain.c | 91 | ||||
-rw-r--r-- | tools/regression/lib/libutil/test-trimdomain-nodomain.t | 10 | ||||
-rw-r--r-- | tools/regression/lib/libutil/test-trimdomain.c | 91 | ||||
-rw-r--r-- | tools/regression/lib/libutil/test-trimdomain.t | 10 |
12 files changed, 0 insertions, 1448 deletions
diff --git a/tools/regression/lib/libutil/Makefile b/tools/regression/lib/libutil/Makefile deleted file mode 100644 index 229b4d2..0000000 --- a/tools/regression/lib/libutil/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# $FreeBSD$ - -TESTS= test-trimdomain test-trimdomain-nodomain test-flopen test-grp \ - test-pidfile test-humanize_number -CFLAGS+= -g -Wall -Wextra -Werror -lutil - -.PHONY: tests -tests: ${TESTS} - for p in ${TESTS}; do ${.OBJDIR}/$$p; done - -.PHONY: clean -clean: - -rm -f ${TESTS} diff --git a/tools/regression/lib/libutil/test-flopen.c b/tools/regression/lib/libutil/test-flopen.c deleted file mode 100644 index 0471584..0000000 --- a/tools/regression/lib/libutil/test-flopen.c +++ /dev/null @@ -1,210 +0,0 @@ -/*- - * Copyright (c) 2007-2009 Dag-Erling Coïdan Smørgrav - * All rights reserved. - * - * 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 - * in this position and unchanged. - * 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 AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> -#include <sys/fcntl.h> - -#include <errno.h> -#include <signal.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <libutil.h> - -/* - * Test that flopen() can create a file. - */ -const char * -test_flopen_create(void) -{ - const char *fn = "test_flopen_create"; - const char *result = NULL; - int fd; - - unlink(fn); - fd = flopen(fn, O_RDWR|O_CREAT, 0640); - if (fd < 0) { - result = strerror(errno); - } else { - close(fd); - } - unlink(fn); - return (result); -} - -/* - * Test that flopen() can open an existing file. - */ -const char * -test_flopen_open(void) -{ - const char *fn = "test_flopen_open"; - const char *result = NULL; - int fd; - - fd = open(fn, O_RDWR|O_CREAT, 0640); - if (fd < 0) { - result = strerror(errno); - } else { - close(fd); - fd = flopen(fn, O_RDWR); - if (fd < 0) { - result = strerror(errno); - } else { - close(fd); - } - } - unlink(fn); - return (result); -} - -/* - * Test that flopen() can lock against itself - */ -const char * -test_flopen_lock_self(void) -{ - const char *fn = "test_flopen_lock_self"; - const char *result = NULL; - int fd1, fd2; - - unlink(fn); - fd1 = flopen(fn, O_RDWR|O_CREAT, 0640); - if (fd1 < 0) { - result = strerror(errno); - } else { - fd2 = flopen(fn, O_RDWR|O_NONBLOCK); - if (fd2 >= 0) { - result = "second open succeeded"; - close(fd2); - } - close(fd1); - } - unlink(fn); - return (result); -} - -/* - * Test that flopen() can lock against other processes - */ -const char * -test_flopen_lock_other(void) -{ - const char *fn = "test_flopen_lock_other"; - const char *result = NULL; - volatile int fd1, fd2; - - unlink(fn); - fd1 = flopen(fn, O_RDWR|O_CREAT, 0640); - if (fd1 < 0) { - result = strerror(errno); - } else { - fd2 = -42; - if (vfork() == 0) { - fd2 = flopen(fn, O_RDWR|O_NONBLOCK); - close(fd2); - _exit(0); - } - if (fd2 == -42) - result = "vfork() doesn't work as expected"; - if (fd2 >= 0) - result = "second open succeeded"; - close(fd1); - } - unlink(fn); - return (result); -} - -/* - * Test that child processes inherit the lock - */ -const char * -test_flopen_lock_child(void) -{ - const char *fn = "test_flopen_lock_child"; - const char *result = NULL; - pid_t pid; - volatile int fd1, fd2; - - unlink(fn); - fd1 = flopen(fn, O_RDWR|O_CREAT, 0640); - if (fd1 < 0) { - result = strerror(errno); - } else { - pid = fork(); - if (pid == -1) { - result = strerror(errno); - } else if (pid == 0) { - select(0, 0, 0, 0, 0); - _exit(0); - } - close(fd1); - if ((fd2 = flopen(fn, O_RDWR|O_NONBLOCK)) != -1) { - result = "second open succeeded"; - close(fd2); - } - kill(pid, SIGINT); - } - unlink(fn); - return (result); -} - -static struct test { - const char *name; - const char *(*func)(void); -} t[] = { - { "flopen_create", test_flopen_create }, - { "flopen_open", test_flopen_open }, - { "flopen_lock_self", test_flopen_lock_self }, - { "flopen_lock_other", test_flopen_lock_other }, - { "flopen_lock_child", test_flopen_lock_child }, -}; - -int -main(void) -{ - const char *result; - int i, nt; - - nt = sizeof(t) / sizeof(*t); - printf("1..%d\n", nt); - for (i = 0; i < nt; ++i) { - if ((result = t[i].func()) != NULL) - printf("not ok %d - %s # %s\n", i + 1, - t[i].name, result); - else - printf("ok %d - %s\n", i + 1, - t[i].name); - } - exit(0); -} diff --git a/tools/regression/lib/libutil/test-flopen.t b/tools/regression/lib/libutil/test-flopen.t deleted file mode 100644 index cbb7c8c..0000000 --- a/tools/regression/lib/libutil/test-flopen.t +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -# -# $FreeBSD$ -# - -base=$(realpath $(dirname $0)) -name=$(basename $0 .t) - -set -e -cd $base -make -s $name >/dev/null -exec $base/$name diff --git a/tools/regression/lib/libutil/test-grp.c b/tools/regression/lib/libutil/test-grp.c deleted file mode 100644 index ae7ce73..0000000 --- a/tools/regression/lib/libutil/test-grp.c +++ /dev/null @@ -1,117 +0,0 @@ -/*- - * Copyright (c) 2008 Sean C. Farley <scf@FreeBSD.org> - * All rights reserved. - * - * 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, - * without modification, immediately at the beginning of the file. - * 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 AUTHOR ``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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> -#include <errno.h> -#include <grp.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <libutil.h> - - -/* - * Static values for building and testing an artificial group. - */ -static char grpName[] = "groupName"; -static char grpPasswd[] = "groupPwd"; -static gid_t grpGID = 1234; -static char *grpMems[] = { "mem1", "mem2", "mem3", NULL }; -static const char *origStrGrp = "groupName:groupPwd:1234:mem1,mem2,mem3"; - - -/* - * Build a group to test against without depending on a real group to be found - * within /etc/group. - */ -static void -build_grp(struct group *grp) -{ - grp->gr_name = grpName; - grp->gr_passwd = grpPasswd; - grp->gr_gid = grpGID; - grp->gr_mem = grpMems; - - return; -} - - -int -main(void) -{ - char *strGrp; - int testNdx; - struct group *dupGrp; - struct group *scanGrp; - struct group origGrp; - - /* Setup. */ - printf("1..4\n"); - testNdx = 0; - - /* Manually build a group using static values. */ - build_grp(&origGrp); - - /* Copy the group. */ - testNdx++; - if ((dupGrp = gr_dup(&origGrp)) == NULL) - printf("not "); - printf("ok %d - %s\n", testNdx, "gr_dup"); - - /* Compare the original and duplicate groups. */ - testNdx++; - if (! gr_equal(&origGrp, dupGrp)) - printf("not "); - printf("ok %d - %s\n", testNdx, "gr_equal"); - - /* Create group string from the duplicate group structure. */ - testNdx++; - strGrp = gr_make(dupGrp); - if (strcmp(strGrp, origStrGrp) != 0) - printf("not "); - printf("ok %d - %s\n", testNdx, "gr_make"); - - /* - * Create group structure from string and compare it to the original - * group structure. - */ - testNdx++; - if ((scanGrp = gr_scan(strGrp)) == NULL || ! gr_equal(&origGrp, - scanGrp)) - printf("not "); - printf("ok %d - %s\n", testNdx, "gr_scan"); - - /* Clean up. */ - free(scanGrp); - free(strGrp); - free(dupGrp); - - exit(EXIT_SUCCESS); -} diff --git a/tools/regression/lib/libutil/test-grp.t b/tools/regression/lib/libutil/test-grp.t deleted file mode 100644 index cbb7c8c..0000000 --- a/tools/regression/lib/libutil/test-grp.t +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -# -# $FreeBSD$ -# - -base=$(realpath $(dirname $0)) -name=$(basename $0 .t) - -set -e -cd $base -make -s $name >/dev/null -exec $base/$name diff --git a/tools/regression/lib/libutil/test-humanize_number.c b/tools/regression/lib/libutil/test-humanize_number.c deleted file mode 100644 index 24f197d..0000000 --- a/tools/regression/lib/libutil/test-humanize_number.c +++ /dev/null @@ -1,592 +0,0 @@ -/*- - * Copyright 2012 Clifton Royston - * Copyright 2013 John-Mark Gurney - * All rights reserved. - * - * 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 AUTHOR 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 AUTHOR 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 <sys/types.h> -#include <stdlib.h> -#include <libutil.h> -#include <stdio.h> -#include <string.h> -#include <inttypes.h> -#include <math.h> -#include <unistd.h> -#include <limits.h> - -extern char * optarg; - -#define MAX_STR_FLAGS_RESULT 80 -#define MAX_INT_STR_DIGITS 12 - -static const int64_t halfExabyte = (int64_t)500*1000*1000*1000*1000*1000L; - -static struct { - int retval; - const char *res; - int64_t num; - int flags; - int scale; -} test_args[] = { - /* tests 0-13 test 1000 suffixes */ - { 2, "0 ", (int64_t)0L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "1 k", (int64_t)500L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "1 M", (int64_t)500*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "1 G", (int64_t)500*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "1 T", (int64_t)500*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "1 P", (int64_t)500*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "1 E", (int64_t)500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 2, "1 ", (int64_t)1L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "2 k", (int64_t)1500L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "2 M", (int64_t)1500*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "2 G", (int64_t)1500*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "2 T", (int64_t)1500*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "2 P", (int64_t)1500*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "2 E", (int64_t)1500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - - /* tests 14-27 test 1024 suffixes */ - { 2, "0 ", (int64_t)0L, 0, HN_AUTOSCALE }, - { 3, "1 K", (int64_t)512L, 0, HN_AUTOSCALE }, - { 3, "1 M", (int64_t)512*1024L, 0, HN_AUTOSCALE }, - { 3, "1 G", (int64_t)512*1024*1024L, 0, HN_AUTOSCALE }, - { 3, "1 T", (int64_t)512*1024*1024*1024L, 0, HN_AUTOSCALE }, - { 3, "1 P", (int64_t)512*1024*1024*1024*1024L, 0, HN_AUTOSCALE }, - { 3, "1 E", (int64_t)512*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE }, - { 2, "1 ", (int64_t)1L, 0, HN_AUTOSCALE }, - { 3, "2 K", (int64_t)1536L, 0, HN_AUTOSCALE }, - { 3, "2 M", (int64_t)1536*1024L, 0, HN_AUTOSCALE }, - { 3, "2 G", (int64_t)1536*1024*1024L, 0, HN_AUTOSCALE }, - { 3, "2 T", (int64_t)1536*1024*1024*1024L, 0, HN_AUTOSCALE }, - { 3, "2 P", (int64_t)1536*1024*1024*1024*1024L, 0, HN_AUTOSCALE }, - { 3, "2 E", (int64_t)1536*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE }, - - /* tests 28-37 test rounding */ - { 3, "0 M", (int64_t)500*1000L-1, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "1 M", (int64_t)500*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "1 M", (int64_t)1000*1000L + 500*1000L-1, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "2 M", (int64_t)1000*1000L + 500*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 3, "0 K", (int64_t)512L-1, 0, HN_AUTOSCALE }, - { 3, "1 K", (int64_t)512L, 0, HN_AUTOSCALE }, - { 3, "0 M", (int64_t)512*1024L-1, 0, HN_AUTOSCALE }, - { 3, "1 M", (int64_t)512*1024L, 0, HN_AUTOSCALE }, - { 3, "1 M", (int64_t)1024*1024L + 512*1024L-1, 0, HN_AUTOSCALE }, - { 3, "2 M", (int64_t)1024*1024L + 512*1024L, 0, HN_AUTOSCALE }, - - /* tests 38-61 test specific scale factors with 1000 divisor */ - { 3, "0 k", (int64_t)0L, HN_DIVISOR_1000, 1 }, - { 3, "1 k", (int64_t)500L, HN_DIVISOR_1000, 1 }, - { 3, "0 M", (int64_t)500L, HN_DIVISOR_1000, 2 }, - { 3, "1 M", (int64_t)500*1000L, HN_DIVISOR_1000, 2 }, - { 3, "0 G", (int64_t)500*1000L, HN_DIVISOR_1000, 3 }, - { 3, "1 G", (int64_t)500*1000*1000L, HN_DIVISOR_1000, 3 }, - { 3, "0 T", (int64_t)500*1000*1000L, HN_DIVISOR_1000, 4 }, - { 3, "1 T", (int64_t)500*1000*1000*1000L, HN_DIVISOR_1000, 4 }, - { 3, "0 P", (int64_t)500*1000*1000*1000L, HN_DIVISOR_1000, 5 }, - { 3, "1 P", (int64_t)500*1000*1000*1000*1000L, HN_DIVISOR_1000, 5 }, - { 3, "0 E", (int64_t)500*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 }, - { 3, "1 E", (int64_t)500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 }, - { 3, "0 k", (int64_t)1L, HN_DIVISOR_1000, 1 }, - { 3, "2 k", (int64_t)1500L, HN_DIVISOR_1000, 1 }, - { 3, "0 M", (int64_t)1500L, HN_DIVISOR_1000, 2 }, - { 3, "2 M", (int64_t)1500*1000L, HN_DIVISOR_1000, 2 }, - { 3, "0 G", (int64_t)1500*1000L, HN_DIVISOR_1000, 3 }, - { 3, "2 G", (int64_t)1500*1000*1000L, HN_DIVISOR_1000, 3 }, - { 3, "0 T", (int64_t)1500*1000*1000L, HN_DIVISOR_1000, 4 }, - { 3, "2 T", (int64_t)1500*1000*1000*1000L, HN_DIVISOR_1000, 4 }, - { 3, "0 P", (int64_t)1500*1000*1000*1000L, HN_DIVISOR_1000, 5 }, - { 3, "2 P", (int64_t)1500*1000*1000*1000*1000L, HN_DIVISOR_1000, 5 }, - { 3, "0 E", (int64_t)1500*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 }, - { 3, "2 E", (int64_t)1500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 }, - - /* tests 62-85 test specific scale factors with 1024 divisor */ - { 3, "0 K", (int64_t)0L, 0, 1 }, - { 3, "1 K", (int64_t)512L, 0, 1 }, - { 3, "0 M", (int64_t)512L, 0, 2 }, - { 3, "1 M", (int64_t)512*1024L, 0, 2 }, - { 3, "0 G", (int64_t)512*1024L, 0, 3 }, - { 3, "1 G", (int64_t)512*1024*1024L, 0, 3 }, - { 3, "0 T", (int64_t)512*1024*1024L, 0, 4 }, - { 3, "1 T", (int64_t)512*1024*1024*1024L, 0, 4 }, - { 3, "0 P", (int64_t)512*1024*1024*1024L, 0, 5 }, - { 3, "1 P", (int64_t)512*1024*1024*1024*1024L, 0, 5 }, - { 3, "0 E", (int64_t)512*1024*1024*1024*1024L, 0, 6 }, - { 3, "1 E", (int64_t)512*1024*1024*1024*1024*1024L, 0, 6 }, - { 3, "0 K", (int64_t)1L, 0, 1 }, - { 3, "2 K", (int64_t)1536L, 0, 1 }, - { 3, "0 M", (int64_t)1536L, 0, 2 }, - { 3, "2 M", (int64_t)1536*1024L, 0, 2 }, - { 3, "0 G", (int64_t)1536*1024L, 0, 3 }, - { 3, "2 G", (int64_t)1536*1024*1024L, 0, 3 }, - { 3, "0 T", (int64_t)1536*1024*1024L, 0, 4 }, - { 3, "2 T", (int64_t)1536*1024*1024*1024L, 0, 4 }, - { 3, "0 P", (int64_t)1536*1024*1024*1024L, 0, 5 }, - { 3, "2 P", (int64_t)1536*1024*1024*1024*1024L, 0, 5 }, - { 3, "0 E", (int64_t)1536*1024*1024*1024*1024L, 0, 6 }, - { 3, "2 E", (int64_t)1536*1024*1024*1024*1024*1024L, 0, 6 }, - - /* tests 86-99 test invalid specific scale values of < 0 or >= 7 with - and without HN_DIVISOR_1000 set */ - /* all should return errors with new code; with old, the latter 3 - are instead processed as if having AUTOSCALE and/or GETSCALE set */ - { -1, "", (int64_t)1L, 0, 7 }, - { -1, "", (int64_t)1L, HN_DIVISOR_1000, 7 }, - { -1, "", (int64_t)1L, 0, 1000 }, - { -1, "", (int64_t)1L, HN_DIVISOR_1000, 1000 }, - { -1, "", (int64_t)0L, 0, 1000*1000 }, - { -1, "", (int64_t)0L, HN_DIVISOR_1000, 1000*1000 }, - { -1, "", (int64_t)0L, 0, INT_MAX }, - { -1, "", (int64_t)0L, HN_DIVISOR_1000, INT_MAX }, - - /* Negative scale values are not handled well - by the existing library routine - should report as error */ - /* all should return errors with new code, fail assertion with old */ - - { -1, "", (int64_t)1L, 0, -1 }, - { -1, "", (int64_t)1L, HN_DIVISOR_1000, -1 }, - { -1, "", (int64_t)1L, 0, -1000 }, - { -1, "", (int64_t)1L, HN_DIVISOR_1000, -1000 }, - - /* __INT_MIN doesn't print properly, skipped. */ - - { -1, "", (int64_t)1L, 0, -__INT_MAX }, - { -1, "", (int64_t)1L, HN_DIVISOR_1000, -__INT_MAX }, - - - /* tests for scale == 0, without autoscale */ - /* tests 100-114 test scale 0 with 1000 divisor - print first N digits */ - { 2, "0 ", (int64_t)0L, HN_DIVISOR_1000, 0 }, - { 2, "1 ", (int64_t)1L, HN_DIVISOR_1000, 0 }, - { 3, "10 ", (int64_t)10L, HN_DIVISOR_1000, 0 }, - { 3, "0 M", (int64_t)150L, HN_DIVISOR_1000, HN_NOSPACE }, - { 3, "0 M", (int64_t)500L, HN_DIVISOR_1000, HN_NOSPACE }, - { 3, "0 M", (int64_t)999L, HN_DIVISOR_1000, HN_NOSPACE }, - { 4, "150", (int64_t)150L, HN_DIVISOR_1000, 0 }, - { 4, "500", (int64_t)500L, HN_DIVISOR_1000, 0 }, - { 4, "999", (int64_t)999L, HN_DIVISOR_1000, 0 }, - { 5, "100", (int64_t)1000L, HN_DIVISOR_1000, 0 }, - { 5, "150", (int64_t)1500L, HN_DIVISOR_1000, 0 }, - { 7, "500", (int64_t)500*1000L, HN_DIVISOR_1000, 0 }, - { 8, "150", (int64_t)1500*1000L, HN_DIVISOR_1000, 0 }, - { 10, "500", (int64_t)500*1000*1000L, HN_DIVISOR_1000, 0 }, - { 11, "150", (int64_t)1500*1000*1000L, HN_DIVISOR_1000, 0 }, - - /* tests 115-126 test scale 0 with 1024 divisor - print first N digits */ - { 2, "0 ", (int64_t)0L, 0, 0 }, - { 2, "1 ", (int64_t)1L, 0, 0 }, - { 3, "10 ", (int64_t)10L, 0, 0 }, - { 4, "150", (int64_t)150L, 0, 0 }, - { 4, "500", (int64_t)500L, 0, 0 }, - { 4, "999", (int64_t)999L, 0, 0 }, - { 5, "100", (int64_t)1000L, 0, 0 }, - { 5, "150", (int64_t)1500L, 0, 0 }, - { 7, "500", (int64_t)500*1000L, 0, 0 }, - { 8, "150", (int64_t)1500*1000L, 0, 0 }, - { 10, "500", (int64_t)500*1000*1000L, 0, 0 }, - { 11, "150", (int64_t)1500*1000*1000L, 0, 0 }, - - /* Test boundary cases for very large positive/negative number formatting */ - /* Explicit scale, divisor 1024 */ - - /* XXX = requires length 5 (buflen 6) for some cases*/ - /* KLUDGE - test loop below will bump length 5 up to 5 */ - { 3, "8 E", INT64_MAX, 0, 6 }, - { 4, "-8 E", -INT64_MAX, 0, 6 }, - { 3, "0 E", (int64_t)92*1024*1024*1024*1024*1024L, 0, 6 }, - { 3, "0 E", -(int64_t)92*1024*1024*1024*1024*1024L, 0, 6 }, - { 3, "0 E", (int64_t)82*1024*1024*1024*1024*1024L, 0, 6 }, - { 3, "0 E", -(int64_t)82*1024*1024*1024*1024*1024L, 0, 6 }, - { 3, "0 E", (int64_t)81*1024*1024*1024*1024*1024L, 0, 6 }, - { 3, "0 E", -(int64_t)81*1024*1024*1024*1024*1024L, 0, 6 }, - { 4, "92 P", (int64_t)92*1024*1024*1024*1024*1024L, 0, 5 }, - { 5, "-92 P", -(int64_t)92*1024*1024*1024*1024*1024L, 0, 5 }, - { 4, "82 P", (int64_t)82*1024*1024*1024*1024*1024L, 0, 5 }, - { 5, "-82 P", -(int64_t)82*1024*1024*1024*1024*1024L, 0, 5 }, - { 4, "81 P", (int64_t)81*1024*1024*1024*1024*1024L, 0, 5 }, - { 5, "-81 P", -(int64_t)81*1024*1024*1024*1024*1024L, 0, 5 }, - - /* Explicit scale, divisor 1000 */ - { 3, "9 E", INT64_MAX, HN_DIVISOR_1000, 6 }, - { 4, "-9 E", -INT64_MAX, HN_DIVISOR_1000, 6 }, - { 3, "0 E", (int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 6 }, - { 3, "0 E", -(int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 6 }, - { 3, "0 E", (int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 6 }, - { 3, "0 E", -(int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 6 }, - { 4, "92 P", (int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 5 }, - { 5, "-92 P", -(int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 5 }, - { 4, "91 P", (int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 5 }, - { 5, "-91 P", -(int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 5 }, - - /* Autoscale, divisor 1024 */ - { 3, "8 E", INT64_MAX, 0, HN_AUTOSCALE }, - { 4, "-8 E", -INT64_MAX, 0, HN_AUTOSCALE }, - { 4, "92 P", (int64_t)92*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE }, - { 5, "-92 P", -(int64_t)92*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE }, - { 4, "82 P", (int64_t)82*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE }, - { 5, "-82 P", -(int64_t)82*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE }, - { 4, "81 P", (int64_t)81*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE }, - { 5, "-81 P", -(int64_t)81*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE }, - /* Autoscale, divisor 1000 */ - { 3, "9 E", INT64_MAX, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 4, "-9 E", -INT64_MAX, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 4, "92 P", (int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "-92 P", -(int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 4, "91 P", (int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "-91 P", -(int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, HN_AUTOSCALE }, - - /* 0 scale, divisor 1024 */ - { 12, "skdj", INT64_MAX, 0, 0 }, - { 21, "-9223", -INT64_MAX, 0, 0 }, - { 19, "10358", (int64_t)92*1024*1024*1024*1024*1024L, 0, 0 }, - { 20, "-1035", -(int64_t)92*1024*1024*1024*1024*1024L, 0, 0 }, - { 18, "92323", (int64_t)82*1024*1024*1024*1024*1024L, 0, 0 }, - { 19, "-9232", -(int64_t)82*1024*1024*1024*1024*1024L, 0, 0 }, - { 18, "91197", (int64_t)81*1024*1024*1024*1024*1024L, 0, 0 }, - { 19, "-9119", -(int64_t)81*1024*1024*1024*1024*1024L, 0, 0 }, - - /* 0 scale, divisor 1000 */ - /* XXX - why does this fail? */ - { -1, "", INT64_MAX, HN_DIVISOR_1000, 0 }, - { 21, "-9223", -INT64_MAX, HN_DIVISOR_1000, 0 }, - { 19, "10358", (int64_t)92*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 }, - { 20, "-1035", -(int64_t)92*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 }, - { 18, "92323", (int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 }, - { 19, "-9232", -(int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 }, - /* Expected to pass */ - { 18, "91197", (int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 }, - { 19, "-9119", -(int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 }, - - - - /* Need to implement tests for GETSCALE */ -/* { ?, "", (int64_t)0L, HN_DIVISOR_1000, HN_GETSCALE }, - ... -*/ - /* Tests for HN_DECIMAL */ - /* Positive, Autoscale */ - { 5, "500 k", (int64_t)500*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "994 k", (int64_t)994*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "995 k", (int64_t)995*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "999 k", (int64_t)999*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "1.0 M", (int64_t)1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "1.5 M", (int64_t)1500*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "1.9 M", (int64_t)1949*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "2.0 M", (int64_t)1950*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "9.9 M", (int64_t)9949*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 4, "10 M", (int64_t)9950*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "500 M", (int64_t)500*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "994 M", (int64_t)994*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "995 M", (int64_t)995*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "999 M", (int64_t)999*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - - { 5, "500 K", (int64_t)500*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "994 K", (int64_t)994*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "995 K", (int64_t)995*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "999 K", (int64_t)999*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "1.0 M", (int64_t)1000*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "1.0 M", (int64_t)1018*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "1.0 M", (int64_t)1019*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "1.5 M", (int64_t)1536*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "1.9 M", (int64_t)1996*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "2.0 M", (int64_t)1997*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "2.0 M", (int64_t)2047*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "2.0 M", (int64_t)2048*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "2.0 M", (int64_t)2099*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "2.1 M", (int64_t)2100*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "9.9 M", (int64_t)10188*1024L, HN_DECIMAL, HN_AUTOSCALE }, - /* XXX - shouldn't the following two be "10. M"? */ - { 4, "10 M", (int64_t)10189*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 4, "10 M", (int64_t)10240*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "500 M", (int64_t)500*1024*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "994 M", (int64_t)994*1024*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "995 M", (int64_t)995*1024*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "999 M", (int64_t)999*1024*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "1.0 G", (int64_t)1000*1024*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "1.0 G", (int64_t)1023*1024*1024L, HN_DECIMAL, HN_AUTOSCALE }, - - /* Negative, Autoscale - should pass */ - { 6, "-1.5 ", -(int64_t)1500*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 6, "-1.9 ", -(int64_t)1949*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 6, "-9.9 ", -(int64_t)9949*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - - { 6, "-1.5 ", -(int64_t)1536*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 6, "-1.9 ", -(int64_t)1949*1024L, HN_DECIMAL, HN_AUTOSCALE }, - { 6, "-9.7 ", -(int64_t)9949*1024L, HN_DECIMAL, HN_AUTOSCALE }, - - /* Positive/negative, at maximum scale */ - { 5, "500 P", (int64_t)500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "1.9 E", (int64_t)1949*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "8.9 E", (int64_t)8949*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE }, - { 5, "9.2 E", INT64_MAX, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - /* Negatives work with latest rev only: */ - { 6, "-9.2 ", -INT64_MAX, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - { 6, "-8.9 ", -(int64_t)8949*1000*1000*1000*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE }, - - { 5, "8.0 E", INT64_MAX, HN_DECIMAL, HN_AUTOSCALE }, - { 5, "7.9 E", INT64_MAX-(int64_t)100*1024*1024*1024*1024*1024LL, HN_DECIMAL, HN_AUTOSCALE }, - { 6, "-8.0 ", -INT64_MAX, HN_DECIMAL, HN_AUTOSCALE }, - { 6, "-7.9 ", -INT64_MAX+(int64_t)100*1024*1024*1024*1024*1024LL, HN_DECIMAL, HN_AUTOSCALE }, - - /* Positive, Fixed scales */ - { 5, "500 k", (int64_t)500*1000L, HN_DECIMAL|HN_DIVISOR_1000, 1 }, - { 5, "0.5 M", (int64_t)500*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 }, - { 5, "949 k", (int64_t)949*1000L, HN_DECIMAL|HN_DIVISOR_1000, 1 }, - { 5, "0.9 M", (int64_t)949*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 }, - { 5, "950 k", (int64_t)950*1000L, HN_DECIMAL|HN_DIVISOR_1000, 1 }, - { 5, "1.0 M", (int64_t)950*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 }, - { 5, "999 k", (int64_t)999*1000L, HN_DECIMAL|HN_DIVISOR_1000, 1 }, - { 5, "1.0 M", (int64_t)999*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 }, - { 5, "1.5 M", (int64_t)1500*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 }, - { 5, "1.9 M", (int64_t)1949*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 }, - { 5, "2.0 M", (int64_t)1950*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 }, - { 5, "9.9 M", (int64_t)9949*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 }, - { 4, "10 M", (int64_t)9950*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 }, - { 5, "500 M", (int64_t)500*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 }, - { 5, "0.5 G", (int64_t)500*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, 3 }, - { 5, "999 M", (int64_t)999*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 }, - { 5, "1.0 G", (int64_t)999*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, 3 }, - /* Positive/negative, at maximum scale */ - { 5, "500 P", (int64_t)500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 5 }, - { 5, "1.0 E", (int64_t)500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 }, - { 5, "1.9 E", (int64_t)1949*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 }, - { 5, "8.9 E", (int64_t)8949*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 }, - { 5, "9.2 E", INT64_MAX, HN_DECIMAL|HN_DIVISOR_1000, 6 }, - - /* HN_DECIMAL + binary + fixed scale cases not completed */ - { 5, "512 K", (int64_t)512*1024L, HN_DECIMAL, 1 }, - { 5, "0.5 M", (int64_t)512*1024L, HN_DECIMAL, 2 }, - - /* Negative, Fixed scales */ - /* Not yet added, but should work with latest rev */ - -}; - - -/* Command line options usage */ -static void -usage(char * progname) { - printf("%s: tests libutil humanize_number function\n", progname); - printf("Usage: %s [-nE] [-l num] [-v]\n\n", progname); - printf("Options:\n"); - printf("\t-l num\tSet max length for result; buflen = num + 1\n"); - printf("\t\t (NOTE: does not change expected result strings.)\n"); - printf("\t-n\tInclude negative scale tests, which cause older libutil\n"); - printf("\t\t version of function to coredump with assertion failure\n"); - printf("\t-E\tInclude numbers > 1/2 Exa[byte] which currently fail\n"); - printf("\t-v\tVerbose - always print summary results\n"); - printf("\t-h, -?\tShow options\n"); -} - -/* Parse command line options */ -static void -read_options(int argc, char * const argv[], size_t *bufLength, - int *includeNegativeScale, int *includeExabytes, int *verbose) { - int ch; - size_t temp; - - while ((ch = getopt(argc, argv, "nEh?vl:")) != -1) { - switch (ch) { - default: - usage(argv[0]); - exit(1); - break; /* UNREACHABLE */ - case 'h' : - case '?' : - usage(argv[0]); - exit(0); - break; /* UNREACHABLE */ - case 'l' : - sscanf(optarg, "%zu", &temp); - *bufLength = temp + 1; - break; - case 'n' : - *includeNegativeScale = 1; - break; - case 'E' : - *includeExabytes = 1; - break; - case 'v' : - *verbose = 1; - break; - } - } -} - -static struct { - int value; - const char *name; - } flags[] = { - { HN_AUTOSCALE, "HN_AUTOSCALE" }, - { HN_GETSCALE, "HN_GETSCALE" }, - { HN_DIVISOR_1000, "HN_DIVISOR_1000"}, - { HN_B, "HN_B"}, - { HN_DECIMAL, "HN_DECIMAL"}, -}; - -static const char *separator = "|"; - -/* Format flags parameter for meaningful display */ -static char * -str_flags(int hn_flags, char *noFlags) { - size_t i; - char * result; - - result = malloc(MAX_STR_FLAGS_RESULT); - result[0] = '\0'; - - for (i = 0; i < sizeof flags / sizeof *flags; i++) { - if (hn_flags & flags[i].value) { - if (*result != 0) - strlcat(result, separator, - MAX_STR_FLAGS_RESULT); - strlcat(result, flags[i].name, MAX_STR_FLAGS_RESULT); - } - } - - if (strlen(result) == 0) - strlcat(result, noFlags, MAX_STR_FLAGS_RESULT); - return result; -} - - -/* Format scale parameter for meaningful display */ -static char * -str_scale(int scale) { - char *result; - - if (scale == HN_AUTOSCALE || scale == HN_GETSCALE) - return str_flags(scale, ""); - - result = malloc(MAX_INT_STR_DIGITS); - result[0] = '\0'; - snprintf(result, MAX_INT_STR_DIGITS, "%d", scale); - return result; -} - -static void -testskipped(size_t i) -{ - - printf("ok %lu # skip - not turned on\n", i); -} - -int -main(int argc, char * const argv[]) -{ - char *buf; - char *flag_str, *scale_str; - size_t i; - size_t errcnt, tested, skipped; - int r; - size_t buflen; - int includeNegScale; - int includeExabyteTests; - int verbose; - - buflen = 4; - includeNegScale = 0; - includeExabyteTests = 0; - verbose = 0; - - read_options(argc, argv, &buflen, &includeNegScale, - &includeExabyteTests, &verbose); - - buf = malloc(buflen); - errcnt = 0; - tested = 0; - skipped = 0; - - if (buflen != 4) - printf("Warning: buffer size %zu != 4, expect some results to differ.\n", buflen); - - printf("1..%lu\n", sizeof test_args / sizeof *test_args); - for (i = 0; i < sizeof test_args / sizeof *test_args; i++) { - /* KLUDGE */ - if (test_args[i].num == INT64_MAX && buflen == 4) { - /* Start final tests which require buffer of 6 */ - free(buf); - buflen = 6; - buf = malloc(buflen); - if (verbose) - printf("Buffer length increased to %zu\n", - buflen); - } - - if (test_args[i].scale < 0 && ! includeNegScale) { - skipped++; - testskipped(i); - continue; - } - if (test_args[i].num >= halfExabyte && ! includeExabyteTests) { - skipped++; - testskipped(i); - continue; - } - - r = humanize_number(buf, buflen, test_args[i].num, "", - test_args[i].scale, test_args[i].flags); - flag_str = str_flags(test_args[i].flags, "[no flags]"); - scale_str = str_scale(test_args[i].scale); - - if (r != test_args[i].retval) { - if (verbose) - printf("wrong return value on index %lu, buflen: %zu, got: %d + \"%s\", expected %d + \"%s\"; num = %" PRId64 ", scale = %s, flags= %s.\n", - i, buflen, r, buf, test_args[i].retval, - test_args[i].res, test_args[i].num, - scale_str, flag_str); - else - printf("not ok %lu # return %d != %d\n", i, r, - test_args[i].retval); - errcnt++; - } else if (strcmp(buf, test_args[i].res) != 0) { - if (verbose) - printf("result mismatch on index %lu, got: \"%s\", expected \"%s\"; num = %" PRId64 ", scale = %s, flags= %s.\n", - i, buf, test_args[i].res, test_args[i].num, - scale_str, flag_str); - else - printf("not ok %lu # buf \"%s\" != \"%s\"\n", i, - buf, test_args[i].res); - errcnt++; - } else { - if (verbose) - printf("successful result on index %lu, returned %d, got: \"%s\"; num = %" PRId64 ", scale = %s, flags= %s.\n", - i, r, buf, test_args[i].num, scale_str, - flag_str); - else - printf("ok %lu\n", i); - } - tested++; - } - - if (verbose) - printf("total errors: %lu/%lu tests, %lu skipped\n", errcnt, - tested, skipped); - - if (errcnt) - return 1; - - return 0; -} diff --git a/tools/regression/lib/libutil/test-humanize_number.t b/tools/regression/lib/libutil/test-humanize_number.t deleted file mode 100755 index 516bc4c..0000000 --- a/tools/regression/lib/libutil/test-humanize_number.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable && echo humanize_numbers ok diff --git a/tools/regression/lib/libutil/test-pidfile.c b/tools/regression/lib/libutil/test-pidfile.c deleted file mode 100644 index 0b70bc8..0000000 --- a/tools/regression/lib/libutil/test-pidfile.c +++ /dev/null @@ -1,280 +0,0 @@ -/*- - * Copyright (c) 2007-2009 Dag-Erling Coïdan Smørgrav - * All rights reserved. - * - * 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 - * in this position and unchanged. - * 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 AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/wait.h> - -#include <fcntl.h> -#include <errno.h> -#include <signal.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <libutil.h> - -/* - * We need a signal handler so kill(2) will interrupt our child's - * select(2) instead of killing it. - */ -static void -signal_handler(int sig) -{ - (void)sig; -} - -/* - * Test that pidfile_open() can create a pidfile and that pidfile_write() - * can write to it. - */ -static const char * -test_pidfile_uncontested(void) -{ - const char *fn = "test_pidfile_uncontested"; - struct pidfh *pf; - pid_t other = 0; - - unlink(fn); - pf = pidfile_open(fn, 0600, &other); - if (pf == NULL && other != 0) - return ("pidfile exists and is locked"); - if (pf == NULL) - return (strerror(errno)); - if (pidfile_write(pf) != 0) { - pidfile_close(pf); - unlink(fn); - return ("failed to write PID"); - } - pidfile_close(pf); - unlink(fn); - return (NULL); -} - -/* - * Test that pidfile_open() locks against self. - */ -static const char * -test_pidfile_self(void) -{ - const char *fn = "test_pidfile_self"; - struct pidfh *pf1, *pf2; - pid_t other = 0; - int serrno; - - unlink(fn); - pf1 = pidfile_open(fn, 0600, &other); - if (pf1 == NULL && other != 0) - return ("pidfile exists and is locked"); - if (pf1 == NULL) - return (strerror(errno)); - if (pidfile_write(pf1) != 0) { - serrno = errno; - pidfile_close(pf1); - unlink(fn); - return (strerror(serrno)); - } - // second open should fail - pf2 = pidfile_open(fn, 0600, &other); - if (pf2 != NULL) { - pidfile_close(pf1); - pidfile_close(pf2); - unlink(fn); - return ("managed to opened pidfile twice"); - } - if (other != getpid()) { - pidfile_close(pf1); - unlink(fn); - return ("pidfile contained wrong PID"); - } - pidfile_close(pf1); - unlink(fn); - return (NULL); -} - -/* - * Common code for test_pidfile_{contested,inherited}. - */ -static const char * -common_test_pidfile_child(const char *fn, int parent_open) -{ - struct pidfh *pf = NULL; - pid_t other = 0, pid = 0; - int fd[2], serrno, status; - char ch; - - unlink(fn); - if (pipe(fd) != 0) - return (strerror(errno)); - - if (parent_open) { - pf = pidfile_open(fn, 0600, &other); - if (pf == NULL && other != 0) - return ("pidfile exists and is locked"); - if (pf == NULL) - return (strerror(errno)); - } - - pid = fork(); - if (pid == -1) - return (strerror(errno)); - if (pid == 0) { - // child - close(fd[0]); - signal(SIGINT, signal_handler); - if (!parent_open) { - pf = pidfile_open(fn, 0600, &other); - if (pf == NULL && other != 0) - return ("pidfile exists and is locked"); - if (pf == NULL) - return (strerror(errno)); - } - if (pidfile_write(pf) != 0) { - serrno = errno; - pidfile_close(pf); - unlink(fn); - return (strerror(serrno)); - } - if (pf == NULL) - _exit(1); - if (pidfile_write(pf) != 0) - _exit(1); - if (write(fd[1], "*", 1) != 1) - _exit(1); - select(0, 0, 0, 0, 0); - _exit(0); - } - // parent - close(fd[1]); - if (pf) - pidfile_close(pf); - - // wait for the child to signal us - if (read(fd[0], &ch, 1) != 1) { - serrno = errno; - unlink(fn); - kill(pid, SIGTERM); - errno = serrno; - return (strerror(errno)); - } - - // We shouldn't be able to lock the same pidfile as our child - pf = pidfile_open(fn, 0600, &other); - if (pf != NULL) { - pidfile_close(pf); - unlink(fn); - return ("managed to lock contested pidfile"); - } - - // Failed to lock, but not because it was contested - if (other == 0) { - unlink(fn); - return (strerror(errno)); - } - - // Locked by the wrong process - if (other != pid) { - unlink(fn); - return ("pidfile contained wrong PID"); - } - - // check our child's fate - if (pf) - pidfile_close(pf); - unlink(fn); - if (kill(pid, SIGINT) != 0) - return (strerror(errno)); - if (waitpid(pid, &status, 0) == -1) - return (strerror(errno)); - if (WIFSIGNALED(status)) - return ("child caught signal"); - if (WEXITSTATUS(status) != 0) - return ("child returned non-zero status"); - - // success - return (NULL); -} - -/* - * Test that pidfile_open() fails when attempting to open a pidfile that - * is already locked, and that it returns the correct PID. - */ -static const char * -test_pidfile_contested(void) -{ - const char *fn = "test_pidfile_contested"; - const char *result; - - result = common_test_pidfile_child(fn, 0); - return (result); -} - -/* - * Test that the pidfile lock is inherited. - */ -static const char * -test_pidfile_inherited(void) -{ - const char *fn = "test_pidfile_inherited"; - const char *result; - - result = common_test_pidfile_child(fn, 1); - return (result); -} - -static struct test { - const char *name; - const char *(*func)(void); -} t[] = { - { "pidfile_uncontested", test_pidfile_uncontested }, - { "pidfile_self", test_pidfile_self }, - { "pidfile_contested", test_pidfile_contested }, - { "pidfile_inherited", test_pidfile_inherited }, -}; - -int -main(void) -{ - const char *result; - int i, nt; - - nt = sizeof(t) / sizeof(*t); - printf("1..%d\n", nt); - for (i = 0; i < nt; ++i) { - if ((result = t[i].func()) != NULL) - printf("not ok %d - %s # %s\n", i + 1, - t[i].name, result); - else - printf("ok %d - %s\n", i + 1, - t[i].name); - } - exit(0); -} diff --git a/tools/regression/lib/libutil/test-trimdomain-nodomain.c b/tools/regression/lib/libutil/test-trimdomain-nodomain.c deleted file mode 100644 index c02ccdb..0000000 --- a/tools/regression/lib/libutil/test-trimdomain-nodomain.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2005 Brooks Davis. All rights reserved. - * - * 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 AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> -#include <sys/param.h> -#include <errno.h> -#include <libutil.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#define TESTDOMAIN "" -#define TESTHOST "testhost" -#define TESTFQDN "testhost" TESTDOMAIN - -int failures = 0; -int tests = 0; - -/* - * Evily override gethostname(3) so trimdomain always gets the same result. - * This makes the tests much easier to write and less likely to fail on - * oddly configured systems. - */ -int -gethostname(char *name, size_t namelen) -{ - if (strlcpy(name, TESTFQDN, namelen) > namelen) { - errno = ENAMETOOLONG; - return (-1); - } - return (0); -} - -void -testit(const char *input, int hostsize, const char *output, const char *test) -{ - char *testhost; - const char *expected = (output == NULL) ? input : output; - - testhost = strdup(input); - trimdomain(testhost, hostsize < 0 ? (int)strlen(testhost) : hostsize); - tests++; - if (strcmp(testhost, expected) != 0) { - printf("not ok %d - %s\n", tests, test); - printf("# %s -> %s (expected %s)\n", input, testhost, expected); - } else - printf("ok %d - %s\n", tests, test); - free(testhost); - return; -} - -int -main(void) -{ - - printf("1..5\n"); - - testit(TESTFQDN, -1, TESTHOST, "self"); - testit("XXX" TESTDOMAIN, -1, "XXX", "different host, same domain"); - testit("XXX" TESTDOMAIN, 1, NULL, "short hostsize"); - testit("bogus.example.net", -1, NULL, "arbitrary host"); - testit("XXX." TESTFQDN, -1, NULL, "domain is local hostname"); - - return (0); -} diff --git a/tools/regression/lib/libutil/test-trimdomain-nodomain.t b/tools/regression/lib/libutil/test-trimdomain-nodomain.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/libutil/test-trimdomain-nodomain.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/libutil/test-trimdomain.c b/tools/regression/lib/libutil/test-trimdomain.c deleted file mode 100644 index 08fcfc0..0000000 --- a/tools/regression/lib/libutil/test-trimdomain.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2005 Brooks Davis. All rights reserved. - * - * 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 AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> -#include <sys/param.h> -#include <errno.h> -#include <libutil.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#define TESTDOMAIN ".domain.example.com" -#define TESTHOST "testhost" -#define TESTFQDN "testhost" TESTDOMAIN - -int failures = 0; -int tests = 0; - -/* - * Evily override gethostname(3) so trimdomain always gets the same result. - * This makes the tests much easier to write and less likely to fail on - * oddly configured systems. - */ -int -gethostname(char *name, size_t namelen) -{ - if (strlcpy(name, TESTFQDN, namelen) > namelen) { - errno = ENAMETOOLONG; - return (-1); - } - return (0); -} - -void -testit(const char *input, int hostsize, const char *output, const char *test) -{ - char *testhost; - const char *expected = (output == NULL) ? input : output; - - testhost = strdup(input); - trimdomain(testhost, hostsize < 0 ? (int)strlen(testhost) : hostsize); - tests++; - if (strcmp(testhost, expected) != 0) { - printf("not ok %d - %s\n", tests, test); - printf("# %s -> %s (expected %s)\n", input, testhost, expected); - } else - printf("ok %d - %s\n", tests, test); - free(testhost); - return; -} - -int -main(void) -{ - - printf("1..5\n"); - - testit(TESTFQDN, -1, TESTHOST, "self"); - testit("XXX" TESTDOMAIN, -1, "XXX", "different host, same domain"); - testit("XXX" TESTDOMAIN, 1, NULL, "short hostsize"); - testit("bogus.example.net", -1, NULL, "arbitrary host"); - testit("XXX." TESTFQDN, -1, NULL, "domain is local hostname"); - - return (0); -} diff --git a/tools/regression/lib/libutil/test-trimdomain.t b/tools/regression/lib/libutil/test-trimdomain.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/libutil/test-trimdomain.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable |