diff options
author | dds <dds@FreeBSD.org> | 2007-05-22 05:52:04 +0000 |
---|---|---|
committer | dds <dds@FreeBSD.org> | 2007-05-22 05:52:04 +0000 |
commit | 3fe54a38365ecc8c9db5e7cc3f8acc74c94c344b (patch) | |
tree | 26273dd99d221c1e98383dcdc48be78a8b891660 /tools/regression | |
parent | 50945671cb9d2a10612f439bcfe767f7c443ea1d (diff) | |
download | FreeBSD-src-3fe54a38365ecc8c9db5e7cc3f8acc74c94c344b.zip FreeBSD-src-3fe54a38365ecc8c9db5e7cc3f8acc74c94c344b.tar.gz |
Test the integer-arithmetic float conversions encode_timeval and encode_long
in kern_acct.c.
Diffstat (limited to 'tools/regression')
-rw-r--r-- | tools/regression/acct/Makefile | 22 | ||||
-rw-r--r-- | tools/regression/acct/pack.c | 105 | ||||
-rw-r--r-- | tools/regression/acct/regress.t | 30 |
3 files changed, 157 insertions, 0 deletions
diff --git a/tools/regression/acct/Makefile b/tools/regression/acct/Makefile new file mode 100644 index 0000000..6834fcb --- /dev/null +++ b/tools/regression/acct/Makefile @@ -0,0 +1,22 @@ +# +# $FreeBSD$ +# +# "make" will compile what is needed and run the regression tests. +# +PROG= pack +NO_MAN= + +all: regress + +pack: pack.c convert.c + +convert.c: ../../../sys/kern/kern_acct.c + sed -n '/FLOAT_CONVERSION_START/,/FLOAT_CONVERSION_END/p' $? >$@ + +regress: pack regress.t + ./regress.t + +clean: + rm -f $(PROG) convert.c + +.include <bsd.prog.mk> diff --git a/tools/regression/acct/pack.c b/tools/regression/acct/pack.c new file mode 100644 index 0000000..122b623 --- /dev/null +++ b/tools/regression/acct/pack.c @@ -0,0 +1,105 @@ +/*- + * 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 <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <assert.h> +#include <float.h> +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <strings.h> + +#include <sys/time.h> +#include <sys/types.h> + +#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 new file mode 100644 index 0000000..c078caa --- /dev/null +++ b/tools/regression/acct/regress.t @@ -0,0 +1,30 @@ +#!/bin/sh +# +# $FreeBSD$ +# + +DIR=`dirname $0` + +check() +{ + NUM=$1 + shift + if $DIR/pack $* + then + echo "ok $NUM" + else + echo "not ok $NUM" + fi +} + +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 + +exit 0 |