From 09e012a1a37cb973eb92b399548c98ee8c23a944 Mon Sep 17 00:00:00 2001 From: ngie Date: Mon, 23 Nov 2015 08:17:32 +0000 Subject: [PATCH] MFC r290905,r290922: r290905: Integrate acct(2) testcase in as tests/sys/kern/acct/acct_test The :encode_tv_random_million testcase fails the epsilon tests a few thousand times out of one million, so expect the testcase to fail Submitted by: keramida Sponsored by: EMC / Isilon Storage Division r290922: Remove directory made obsolete by r290905 X-MFC note: stable/10 only Sponsored by: EMC / Isilon Storage Division git-svn-id: svn://svn.freebsd.org/base/stable/10@291173 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- etc/mtree/BSD.tests.dist | 2 + tests/sys/kern/Makefile | 1 + tests/sys/kern/acct/Makefile | 17 +++ tests/sys/kern/acct/acct_test.c | 237 ++++++++++++++++++++++++++++++++ tools/regression/acct/Makefile | 22 --- tools/regression/acct/pack.c | 108 --------------- tools/regression/acct/regress.t | 39 ------ 7 files changed, 257 insertions(+), 169 deletions(-) create mode 100644 tests/sys/kern/acct/Makefile create mode 100644 tests/sys/kern/acct/acct_test.c delete mode 100644 tools/regression/acct/Makefile delete mode 100644 tools/regression/acct/pack.c delete mode 100755 tools/regression/acct/regress.t diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist index 01d87ba64..105c6f195 100644 --- a/etc/mtree/BSD.tests.dist +++ b/etc/mtree/BSD.tests.dist @@ -197,6 +197,8 @@ file .. kern + acct + .. execve .. .. diff --git a/tests/sys/kern/Makefile b/tests/sys/kern/Makefile index c345e5d71..04d2fffbe 100644 --- a/tests/sys/kern/Makefile +++ b/tests/sys/kern/Makefile @@ -12,6 +12,7 @@ LDADD.unix_seqpacket_test+= -lpthread WARNS?= 5 +TESTS_SUBDIRS+= acct TESTS_SUBDIRS+= execve .include diff --git a/tests/sys/kern/acct/Makefile b/tests/sys/kern/acct/Makefile new file mode 100644 index 000000000..966fe9aa8 --- /dev/null +++ b/tests/sys/kern/acct/Makefile @@ -0,0 +1,17 @@ +# $FreeBSD$ + +TESTSDIR= ${TESTSBASE}/sys/kern/acct + +ATF_TESTS_C= acct_test + +CFLAGS+= -I${.OBJDIR} + +CLEANFILES+= convert.c + +DPSRCS.acct_test= convert.c + +convert.c: ${SRCTOP}/sys/kern/kern_acct.c + sed -n -e 's/log(/syslog(/g' \ + -e '/FLOAT_CONVERSION_START/,/FLOAT_CONVERSION_END/p' ${.ALLSRC} >>${.TARGET} + +.include diff --git a/tests/sys/kern/acct/acct_test.c b/tests/sys/kern/acct/acct_test.c new file mode 100644 index 000000000..2bf221cdd --- /dev/null +++ b/tests/sys/kern/acct/acct_test.c @@ -0,0 +1,237 @@ +/*- + * Copyright (c) 2011 Giorgos Keramidas. All rights reserved. + * Copyright (c) 2007 Diomidis Spinellis. 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 +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define KASSERT(val, msg) assert(val) + +typedef u_int32_t comp_t; + +#define AHZ 1000000 + +#include "convert.c" + +union cf { + comp_t c; + float f; +}; + +static void +check_result(const char *name, float expected, union cf v) +{ + double eps; + + eps = fabs(expected - v.f) / expected; + ATF_CHECK(eps <= FLT_EPSILON); + if (eps > FLT_EPSILON) { + printf("Error in %s\n", name); + printf("Got 0x%08x %12g\n", v.c, v.f); + v.f = expected; + printf("Expected 0x%08x %12g (%.15lg)\n", v.c, v.f, expected); + printf("Epsilon=%lg, rather than %g\n", eps, FLT_EPSILON); + } +} + +/* + * Test case for encoding {0 sec, 0 usec} within a reasonable epsilon. + */ + +ATF_TC_WITHOUT_HEAD(encode_tv_zero); +ATF_TC_BODY(encode_tv_zero, tc) +{ + union cf v; + struct timeval tv; + + tv.tv_sec = 0; + tv.tv_usec = 0; + v.c = encode_timeval(tv); + ATF_CHECK(fabs(v.f - 0.0) < FLT_EPSILON); +} + +/* + * Test case for encoding a random long number. + */ + +ATF_TC_WITHOUT_HEAD(encode_long); +ATF_TC_BODY(encode_long, tc) +{ + union cf v; + long l; + + l = random(); + v.c = encode_long(l); + check_result(atf_tc_get_ident(tc), l, v); +} + +/* + * Test case for encoding a small number of seconds {1 sec, 0 usec}. + */ + +ATF_TC_WITHOUT_HEAD(encode_tv_only_sec); +ATF_TC_BODY(encode_tv_only_sec, tc) +{ + union cf v; + struct timeval tv; + + tv.tv_sec = 1; + tv.tv_usec = 0; + v.c = encode_timeval(tv); + check_result(atf_tc_get_ident(tc), + (float)tv.tv_sec * AHZ + tv.tv_usec, v); +} + +/* + * Test case for encoding a small number of usec {0 sec, 1 usec}. + */ + +ATF_TC_WITHOUT_HEAD(encode_tv_only_usec); +ATF_TC_BODY(encode_tv_only_usec, tc) +{ + union cf v; + struct timeval tv; + + tv.tv_sec = 0; + tv.tv_usec = 1; + v.c = encode_timeval(tv); + check_result(atf_tc_get_ident(tc), + (float)tv.tv_sec * AHZ + tv.tv_usec, v); +} + +/* + * Test case for encoding a large number of usec {1 sec, 999.999 usec}. + */ + +ATF_TC_WITHOUT_HEAD(encode_tv_many_usec); +ATF_TC_BODY(encode_tv_many_usec, tc) +{ + union cf v; + struct timeval tv; + + tv.tv_sec = 1; + tv.tv_usec = 999999L; + v.c = encode_timeval(tv); + check_result(atf_tc_get_ident(tc), + (float)tv.tv_sec * AHZ + tv.tv_usec, v); +} + +/* + * Test case for encoding a huge number of usec {1 sec, 1.000.000 usec} that + * overflows the usec counter and should show up as an increase in timeval's + * seconds instead. + */ + +ATF_TC_WITHOUT_HEAD(encode_tv_usec_overflow); +ATF_TC_BODY(encode_tv_usec_overflow, tc) +{ + union cf v; + struct timeval tv; + + tv.tv_sec = 1; + tv.tv_usec = 1000000L; + v.c = encode_timeval(tv); + check_result(atf_tc_get_ident(tc), + (float)tv.tv_sec * AHZ + tv.tv_usec, v); +} + +/* + * Test case for encoding a very large number of seconds, one that is very + * near to the limit of 32-bit signed values. With a usec value of 999.999 + * microseconds this should result in the largest value we can represent with + * a timeval struct. + */ + +ATF_TC_WITHOUT_HEAD(encode_tv_upper_limit); +ATF_TC_BODY(encode_tv_upper_limit, tc) +{ + union cf v; + struct timeval tv; + + tv.tv_sec = 2147483647L; + tv.tv_usec = 999999L; + v.c = encode_timeval(tv); + check_result(atf_tc_get_ident(tc), + (float)tv.tv_sec * AHZ + tv.tv_usec, v); +} + +/* + * Test case for encoding a million random timeval objects, and checking that + * the conversion does not diverge too much from the expected values. + */ + +ATF_TC_WITHOUT_HEAD(encode_tv_random_million); +ATF_TC_BODY(encode_tv_random_million, tc) +{ + union cf v; + struct timeval tv; + long k; + + atf_tc_expect_fail("the testcase violates FLT_EPSILON"); + + ATF_REQUIRE_MSG(unsetenv("TZ") == 0, "unsetting TZ failed; errno=%d", errno); + + for (k = 1; k < 1000000L; k++) { + tv.tv_sec = random(); + tv.tv_usec = (random() % 1000000L); + v.c = encode_timeval(tv); + check_result(atf_tc_get_ident(tc), + (float)tv.tv_sec * AHZ + tv.tv_usec, v); + } +} + +/* --------------------------------------------------------------------- + * Main. + * --------------------------------------------------------------------- */ + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp, encode_long); + ATF_TP_ADD_TC(tp, encode_tv_zero); + ATF_TP_ADD_TC(tp, encode_tv_only_sec); + ATF_TP_ADD_TC(tp, encode_tv_only_usec); + ATF_TP_ADD_TC(tp, encode_tv_many_usec); + ATF_TP_ADD_TC(tp, encode_tv_usec_overflow); + ATF_TP_ADD_TC(tp, encode_tv_upper_limit); + ATF_TP_ADD_TC(tp, encode_tv_random_million); + + return atf_no_error(); +} diff --git a/tools/regression/acct/Makefile b/tools/regression/acct/Makefile deleted file mode 100644 index 581cc5fbd..000000000 --- a/tools/regression/acct/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -# -# $FreeBSD$ -# -# "make" will compile the acct test programs -# - -PROG= pack -SRCS= pack.c -MAN= -CFLAGS+= -I${.OBJDIR} - -pack.o: convert.c - -CLEANFILES+= convert.c -convert.c: ../../../sys/kern/kern_acct.c - sed -n -e 's/log(/syslog(/g' \ - -e '/FLOAT_CONVERSION_START/,/FLOAT_CONVERSION_END/p' $? >$@ - -regress: pack regress.t - ${.CURDIR}/regress.t - -.include diff --git a/tools/regression/acct/pack.c b/tools/regression/acct/pack.c deleted file mode 100644 index d1d30856f..000000000 --- a/tools/regression/acct/pack.c +++ /dev/null @@ -1,108 +0,0 @@ -/*- - * Copyright (c) 2007 Diomidis Spinellis. 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 -__FBSDID("$FreeBSD$"); - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define KASSERT(val, msg) assert(val) - -typedef u_int32_t comp_t; - -#define AHZ 1000000 - -#include "convert.c" - -static int nerr; - -union cf { - comp_t c; - float f; -}; - -static void -check_result(const char *name, float expected, union cf v) -{ - double eps; - - eps = fabs(expected - v.f) / expected; - if (eps > FLT_EPSILON) { - printf("Error in %s\n", name); - printf("Got 0x%08x %12g\n", v.c, v.f); - v.f = expected; - printf("Expected 0x%08x %12g (%.15lg)\n", v.c, v.f, expected); - printf("Epsilon=%lg, rather than %g\n", eps, FLT_EPSILON); - nerr++; - } -} - -int -main(int argc, char *argv[]) -{ - union cf v; - long l; - int i, end; - struct timeval tv; - - if (argc == 2) { - /* Loop test */ - end = atoi(argv[1]); - for (i = 0; i < end; i++) { - tv.tv_sec = random(); - tv.tv_usec = (random() % 1000000); - v.c = encode_timeval(tv); - check_result("encode_timeval", - (float)tv.tv_sec * AHZ + tv.tv_usec, v); - l = random(); - v.c = encode_long(l); - check_result("encode_long", l, v); - } - } else if (argc == 3) { - /* Single-value timeval/long test */ - tv.tv_sec = atol(argv[1]); - tv.tv_usec = atol(argv[2]); - v.c = encode_timeval(tv); - check_result("encode_timeval", - (float)tv.tv_sec * AHZ + tv.tv_usec, v); - v.c = encode_long(tv.tv_sec); - check_result("encode_long", tv.tv_sec, v); - } else { - fprintf(stderr, "usage:\n%s repetitions\n%s sec usec\n", - argv[0], argv[0]); - return (1); - } - return (nerr); -} diff --git a/tools/regression/acct/regress.t b/tools/regression/acct/regress.t deleted file mode 100755 index 3f63c3ac3..000000000 --- a/tools/regression/acct/regress.t +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/sh -# -# $FreeBSD$ -# - -if test -z "${DIR}" ; then - DIR=$( make -V .OBJDIR ) -fi -if test -z "${DIR}" ; then - DIR=$( dirname $0 ) -fi - -check() -{ - NUM=$1 - shift - if $DIR/pack $* - then - echo "ok $NUM" - else - echo "not ok $NUM" - fi -} - -(cd $DIR ; make pack) >/dev/null 2>&1 - -echo 1..7 - -check 1 0 0 -check 2 0 1 -check 3 1 0 -check 4 1 999999 -check 5 1 1000000 -check 6 2147483647 999999 -check 7 10000000 - -(cd $DIR ; make clean) >/dev/null 2>&1 - -exit 0 -- 2.45.0