From f9eda7489b5afba9a0a5f9e1e623d61454b0e7e0 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sun, 13 Nov 2011 01:02:54 +0100 Subject: tests: Use GNU autotest to execute our tests and compare textual output The output of make check is looking like this now: Regression tests. 1: bits ok 2: msgfile ok 3: sms ok 4: smscb ok 5: timer FAILED (testsuite.at:38) 6: ussd FAILED (testsuite.at:44) --- .gitignore | 10 ++ configure.ac | 5 + tests/Makefile.am | 40 +++++ tests/bits/bitrev_test.ok | 24 +++ tests/missing | 376 ++++++++++++++++++++++++++++++++++++++++++ tests/msgfile/msgfile_test.ok | 1 + tests/osmo-test.in | 2 + tests/sms/sms_test.ok | 2 + tests/smscb/smscb_test.ok | 4 + tests/testsuite.at | 45 +++++ tests/timer/timer_test.ok | 19 +++ tests/ussd/ussd_test.ok | 1 + 12 files changed, 529 insertions(+) create mode 100644 tests/bits/bitrev_test.ok create mode 100755 tests/missing create mode 100644 tests/msgfile/msgfile_test.ok create mode 100644 tests/osmo-test.in create mode 100644 tests/sms/sms_test.ok create mode 100644 tests/smscb/smscb_test.ok create mode 100644 tests/testsuite.at create mode 100644 tests/timer/timer_test.ok create mode 100644 tests/ussd/ussd_test.ok diff --git a/.gitignore b/.gitignore index 4a709a73..a3bfdd2d 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,16 @@ Doxyfile.codec .tarball-version .version +#gnu autotest +tests/package.m4 +tests/atconfig +tests/atlocal +tests/osmo-test +tests/package.m4 +tests/testsuite +tests/testsuite.dir/ +tests/testsuite.log + tests/sms/sms_test tests/timer/timer_test tests/msgfile/msgfile_test diff --git a/configure.ac b/configure.ac index 7d8e6dda..dc435097 100644 --- a/configure.ac +++ b/configure.ac @@ -3,6 +3,7 @@ AC_INIT([libosmocore], [openbsc-devel@lists.openbsc.org]) AM_INIT_AUTOMAKE([dist-bzip2]) +AC_CONFIG_TESTDIR(tests) dnl kernel style compile messages m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) @@ -138,6 +139,10 @@ then AC_DEFINE([PANIC_INFLOOP],[1],[Use infinite loop on panic rather than fprintf/abort]) fi + +AC_CONFIG_FILES(tests/osmo-test, chmod +x tests/osmo-test) +dnl AC_CONFIG_FILES(tests/atlocal) + AC_OUTPUT( libosmocore.pc libosmocodec.pc diff --git a/tests/Makefile.am b/tests/Makefile.am index 6c3cb337..aed0f133 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -3,4 +3,44 @@ SUBDIRS = timer sms ussd smscb bits if ENABLE_MSGFILE SUBDIRS += msgfile endif + + +# The `:;' works around a Bash 3.2 bug when the output is not writeable. +$(srcdir)/package.m4: $(top_srcdir)/configure.ac + :;{ \ + echo '# Signature of the current package.' && \ + echo 'm4_define([AT_PACKAGE_NAME],' && \ + echo ' [$(PACKAGE_NAME)])' && \ + echo 'm4_define([AT_PACKAGE_TARNAME],' && \ + echo ' [$(PACKAGE_TARNAME)])' && \ + echo 'm4_define([AT_PACKAGE_VERSION],' && \ + echo ' [$(PACKAGE_VERSION)])' && \ + echo 'm4_define([AT_PACKAGE_STRING],' && \ + echo ' [$(PACKAGE_STRING)])' && \ + echo 'm4_define([AT_PACKAGE_BUGREPORT],' && \ + echo ' [$(PACKAGE_BUGREPORT)])'; \ + echo 'm4_define([AT_PACKAGE_URL],' && \ + echo ' [$(PACKAGE_URL)])'; \ + } >'$(srcdir)/package.m4' + +EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) missing +TESTSUITE = $(srcdir)/testsuite + +check-local: atconfig $(TESTSUITE) + $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS) + +installcheck-local: atconfig $(TESTSUITE) + $(SHELL) '$(TESTSUITE)' AUTOTEST_PATH='$(bindir)' \ + $(TESTSUITEFLAGS) + +clean-local: + test ! -f '$(TESTSUITE)' || \ + $(SHELL) '$(TESTSUITE)' --clean + +AUTOM4TE = $(SHELL) $(srcdir)/missing --run autom4te +AUTOTEST = $(AUTOM4TE) --language=autotest +$(TESTSUITE): $(srcdir)/testsuite.at $(srcdir)/package.m4 + $(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at + mv $@.tmp $@ + endif diff --git a/tests/bits/bitrev_test.ok b/tests/bits/bitrev_test.ok new file mode 100644 index 00000000..47f402f4 --- /dev/null +++ b/tests/bits/bitrev_test.ok @@ -0,0 +1,24 @@ +INORDER: 01 02 04 08 10 20 40 80 +REVERSED: 80 40 20 10 08 04 02 01 + +INORDER: 02 04 08 10 20 40 80 +REVERSED: 40 20 10 08 04 02 01 + +INORDER: 04 08 10 20 40 80 +REVERSED: 20 10 08 04 02 01 + +INORDER: 08 10 20 40 80 +REVERSED: 10 08 04 02 01 + +INORDER: 10 20 40 80 +REVERSED: 08 04 02 01 + +INORDER: 20 40 80 +REVERSED: 04 02 01 + +INORDER: 40 80 +REVERSED: 02 01 + +INORDER: 80 +REVERSED: 01 + diff --git a/tests/missing b/tests/missing new file mode 100755 index 00000000..28055d2a --- /dev/null +++ b/tests/missing @@ -0,0 +1,376 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + tar*) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar*) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/tests/msgfile/msgfile_test.ok b/tests/msgfile/msgfile_test.ok new file mode 100644 index 00000000..c47cd747 --- /dev/null +++ b/tests/msgfile/msgfile_test.ok @@ -0,0 +1 @@ +Entry '*:*::Hello Welt' diff --git a/tests/osmo-test.in b/tests/osmo-test.in new file mode 100644 index 00000000..c2dc912d --- /dev/null +++ b/tests/osmo-test.in @@ -0,0 +1,2 @@ +abs_top_builddir=@abs_top_builddir@ +: ${LIBTOOL=$abs_top_builddir/libtool diff --git a/tests/sms/sms_test.ok b/tests/sms/sms_test.ok new file mode 100644 index 00000000..d0e09838 --- /dev/null +++ b/tests/sms/sms_test.ok @@ -0,0 +1,2 @@ +SMS testing +OK diff --git a/tests/smscb/smscb_test.ok b/tests/smscb/smscb_test.ok new file mode 100644 index 00000000..347037f8 --- /dev/null +++ b/tests/smscb/smscb_test.ok @@ -0,0 +1,4 @@ +(srl) GS: 1 MSG_CODE: 1 UPDATE: 0 +(msg) msg_id: 1293 +(dcs) group: 1 language: 0 +(pge) page total: 1 current: 1 diff --git a/tests/testsuite.at b/tests/testsuite.at new file mode 100644 index 00000000..df5a5e83 --- /dev/null +++ b/tests/testsuite.at @@ -0,0 +1,45 @@ +AT_INIT +AT_TESTED(osmo-test) + +AT_BANNER([Regression tests.]) + + +# todo.. create one macro for it +AT_SETUP([bits]) +AT_KEYWORDS([bits]) +cat $abs_srcdir/bits/bitrev_test.ok > expout +AT_CHECK([$abs_top_builddir/tests/bits/bitrev_test], [], [expout]) +AT_CLEANUP + +if ENABLE_MSGFILE +AT_SETUP([msgfile]) +AT_KEYWORDS([msgfile]) +cp $abs_srcdir/msgfile/msgconfig.cfg . +cat $abs_srcdir/msgfile/msgfile_test.ok > expout +AT_CHECK([$abs_top_builddir/tests/msgfile/msgfile_test], [], [expout]) +AT_CLEANUP +endif + +AT_SETUP([sms]) +AT_KEYWORDS([sms]) +cat $abs_srcdir/sms/sms_test.ok > expout +AT_CHECK([$abs_top_builddir/tests/sms/sms_test], [], [expout]) +AT_CLEANUP + +AT_SETUP([smscb]) +AT_KEYWORDS([smscb]) +cat $abs_srcdir/smscb/smscb_test.ok > expout +AT_CHECK([$abs_top_builddir/tests/smscb/smscb_test], [], [expout]) +AT_CLEANUP + +AT_SETUP([timer]) +AT_KEYWORDS([timer]) +cat $abs_srcdir/timer/timer_test.ok > expout +AT_CHECK([$abs_top_builddir/tests/timer/timer_test], [], [expout]) +AT_CLEANUP + +AT_SETUP([ussd]) +AT_KEYWORDS([ussd]) +cat $abs_srcdir/ussd/ussd_test.ok > expout +AT_CHECK([$abs_top_builddir/tests/ussd/ussd_test], [], [expout]) +AT_CLEANUP diff --git a/tests/timer/timer_test.ok b/tests/timer/timer_test.ok new file mode 100644 index 00000000..b1792f18 --- /dev/null +++ b/tests/timer/timer_test.ok @@ -0,0 +1,19 @@ +Running timer test for 16 steps, accepting imprecision of 0.010000 seconds +added 1 timers in step 0 (expired=0) +added 2 timers in step 1 (expired=0) +added 4 timers in step 2 (expired=0) +added 8 timers in step 3 (expired=0) +added 16 timers in step 4 (expired=1) +added 32 timers in step 5 (expired=4) +added 64 timers in step 6 (expired=33) +added 128 timers in step 7 (expired=87) +added 256 timers in step 8 (expired=183) +added 512 timers in step 9 (expired=466) +added 1024 timers in step 10 (expired=970) +added 2048 timers in step 11 (expired=1968) +added 4096 timers in step 12 (expired=3994) +added 8192 timers in step 13 (expired=8035) +added 16384 timers in step 14 (expired=16324) +added 32768 timers in step 15 (expired=32641) +Main timer has finished, please, wait a bit for the final report. +test over: added=65535 expired=65535 too_late=0 diff --git a/tests/ussd/ussd_test.ok b/tests/ussd/ussd_test.ok new file mode 100644 index 00000000..e4bfabc1 --- /dev/null +++ b/tests/ussd/ussd_test.ok @@ -0,0 +1 @@ +TODO: test is crashing inside the log handling -- cgit v1.2.3 From f141837ea8f9bf2b1526fa77cefb6d15af8de774 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Sun, 13 Nov 2011 02:02:12 +0100 Subject: tests: timer: add parameter to select the number of steps Holger likes having a parameter to set the number of steps in this test. Now you can set it via `-s' option. Signed-off-by: Pablo Neira Ayuso --- tests/timer/timer_test.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/tests/timer/timer_test.c b/tests/timer/timer_test.c index bcaafdb2..a01a9e5c 100644 --- a/tests/timer/timer_test.c +++ b/tests/timer/timer_test.c @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -60,6 +61,7 @@ struct test_timer { #define TIMER_PRES_SECS 0 #define TIMER_PRES_USECS 10000 +static int timer_nsteps = MAIN_TIMER_NSTEPS; static unsigned int expired_timers = 0; static unsigned int total_timers = 0; static unsigned int too_late = 0; @@ -70,7 +72,7 @@ static void main_timer_fired(void *data) unsigned int add_in_this_step; int i; - if (*step == MAIN_TIMER_NSTEPS) { + if (*step == timer_nsteps) { printf("Main timer has finished, please, wait a bit for the " "final report.\n"); return; @@ -134,11 +136,28 @@ static void secondary_timer_fired(void *data) } } -int main(int argc, char** argv) +int main(int argc, char *argv[]) { + int c; + + while ((c = getopt_long(argc, argv, "s:", NULL, NULL)) != -1) { + switch(c) { + case 's': + timer_nsteps = atoi(optarg); + if (timer_nsteps <= 0) { + fprintf(stderr, "%s: steps must be > 0\n", + argv[0]); + exit(EXIT_FAILURE); + } + break; + default: + exit(EXIT_FAILURE); + } + } + printf("Running timer test for %u steps, accepting imprecision " "of %u.%.6u seconds\n", - MAIN_TIMER_NSTEPS, TIMER_PRES_SECS, TIMER_PRES_USECS); + timer_nsteps, TIMER_PRES_SECS, TIMER_PRES_USECS); osmo_timer_schedule(&main_timer, 1, 0); -- cgit v1.2.3 From ad0e8859c296bbcceea3df6330fca5a59d83162d Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sun, 13 Nov 2011 09:00:55 +0100 Subject: tests: Reduce the iterations for the timertest, ignore stderr Use one of the magic commands for the stderr, in this case we want to log the output but ignore it for processing. http://www.gnu.org/s/hello/manual/autoconf/Writing-Testsuites.html#Writing-Testsuites --- tests/testsuite.at | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testsuite.at b/tests/testsuite.at index df5a5e83..0e917f17 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -35,7 +35,7 @@ AT_CLEANUP AT_SETUP([timer]) AT_KEYWORDS([timer]) cat $abs_srcdir/timer/timer_test.ok > expout -AT_CHECK([$abs_top_builddir/tests/timer/timer_test], [], [expout]) +AT_CHECK([$abs_top_builddir/tests/timer/timer_test -s 5], [], [expout], [ignore]) AT_CLEANUP AT_SETUP([ussd]) -- cgit v1.2.3 From 7a0ca16eec9e5215fcb8ba931adac00e57648455 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Sun, 13 Nov 2011 17:22:33 +0100 Subject: tests: timer: use stderr for non-repeatable output This makes happy gnu-autotest for the timer test. We may still may fail if we run the test on a very heavy loaded system, but given the amount of timers that we using for the automatic test (only 32), this seems very unlikely to me. --- tests/timer/timer_test.c | 17 +++++++++-------- tests/timer/timer_test.ok | 21 ++------------------- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/tests/timer/timer_test.c b/tests/timer/timer_test.c index a01a9e5c..72c07a9a 100644 --- a/tests/timer/timer_test.c +++ b/tests/timer/timer_test.c @@ -73,8 +73,8 @@ static void main_timer_fired(void *data) int i; if (*step == timer_nsteps) { - printf("Main timer has finished, please, wait a bit for the " - "final report.\n"); + fprintf(stderr, "Main timer has finished, please, " + "wait a bit for the final report.\n"); return; } /* add 2^step pair of timers per step. */ @@ -96,7 +96,7 @@ static void main_timer_fired(void *data) osmo_timer_schedule(&v->timer, seconds, 0); llist_add(&v->head, &timer_test_list); } - printf("added %d timers in step %u (expired=%u)\n", + fprintf(stderr, "added %d timers in step %u (expired=%u)\n", add_in_this_step, *step, expired_timers); total_timers += add_in_this_step; osmo_timer_schedule(&main_timer, TIME_BETWEEN_STEPS, 0); @@ -112,7 +112,8 @@ static void secondary_timer_fired(void *data) timersub(¤t, &v->stop, &res); if (timercmp(&res, &precision, >)) { - printf("ERROR: timer %p has expired too late!\n", v->timer); + fprintf(stderr, "ERROR: timer %p has expired too late!\n", + v->timer); too_late++; } @@ -120,7 +121,7 @@ static void secondary_timer_fired(void *data) talloc_free(data); expired_timers++; if (expired_timers == total_timers) { - printf("test over: added=%u expired=%u too_late=%u \n", + fprintf(stdout, "test over: added=%u expired=%u too_late=%u \n", total_timers, expired_timers, too_late); exit(EXIT_SUCCESS); } @@ -155,8 +156,8 @@ int main(int argc, char *argv[]) } } - printf("Running timer test for %u steps, accepting imprecision " - "of %u.%.6u seconds\n", + fprintf(stdout, "Running timer test for %u steps, accepting " + "imprecision of %u.%.6u seconds\n", timer_nsteps, TIMER_PRES_SECS, TIMER_PRES_USECS); osmo_timer_schedule(&main_timer, 1, 0); @@ -166,6 +167,6 @@ int main(int argc, char *argv[]) osmo_select_main(0); } #else - printf("Select not supported on this platform!\n"); + fprintf(stdout, "Select not supported on this platform!\n"); #endif } diff --git a/tests/timer/timer_test.ok b/tests/timer/timer_test.ok index b1792f18..b4e0e118 100644 --- a/tests/timer/timer_test.ok +++ b/tests/timer/timer_test.ok @@ -1,19 +1,2 @@ -Running timer test for 16 steps, accepting imprecision of 0.010000 seconds -added 1 timers in step 0 (expired=0) -added 2 timers in step 1 (expired=0) -added 4 timers in step 2 (expired=0) -added 8 timers in step 3 (expired=0) -added 16 timers in step 4 (expired=1) -added 32 timers in step 5 (expired=4) -added 64 timers in step 6 (expired=33) -added 128 timers in step 7 (expired=87) -added 256 timers in step 8 (expired=183) -added 512 timers in step 9 (expired=466) -added 1024 timers in step 10 (expired=970) -added 2048 timers in step 11 (expired=1968) -added 4096 timers in step 12 (expired=3994) -added 8192 timers in step 13 (expired=8035) -added 16384 timers in step 14 (expired=16324) -added 32768 timers in step 15 (expired=32641) -Main timer has finished, please, wait a bit for the final report. -test over: added=65535 expired=65535 too_late=0 +Running timer test for 5 steps, accepting imprecision of 0.010000 seconds +test over: added=31 expired=31 too_late=0 -- cgit v1.2.3 From 72eb44cc51c2172a0880c8cef46f5873af180836 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Sun, 13 Nov 2011 17:40:09 +0100 Subject: tests: timer: set maximum wait time to obtain test results If the timer test takes more than 2 * (number of steps + 10), we abort the test. This calculation is based on the maximum timeout randomly set (10 seconds) plus the number of steps (some existing timers may be reset in each step). We double this to have some extra grace time to finish. --- tests/timer/timer_test.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/timer/timer_test.c b/tests/timer/timer_test.c index 72c07a9a..3775151c 100644 --- a/tests/timer/timer_test.c +++ b/tests/timer/timer_test.c @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -137,10 +138,22 @@ static void secondary_timer_fired(void *data) } } +static void alarm_handler(int signum) +{ + fprintf(stderr, "ERROR: We took too long to run the timer test, " + "something seems broken, aborting.\n"); + exit(EXIT_FAILURE); +} + int main(int argc, char *argv[]) { int c; + if (signal(SIGALRM, alarm_handler) == SIG_ERR) { + perror("cannot register signal handler"); + exit(EXIT_FAILURE); + } + while ((c = getopt_long(argc, argv, "s:", NULL, NULL)) != -1) { switch(c) { case 's': @@ -162,6 +175,12 @@ int main(int argc, char *argv[]) osmo_timer_schedule(&main_timer, 1, 0); + /* if the test takes too long, we may consider that the timer scheduler + * has hung. We set some maximum wait time which is the double of the + * maximum timeout randomly set (10 seconds, worst case) plus the + * number of steps (since some of them are reset each step). */ + alarm(2 * (10 + timer_nsteps)); + #ifdef HAVE_SYS_SELECT_H while (1) { osmo_select_main(0); -- cgit v1.2.3 From bf12800c51e3b470851a42272e083120f649a96b Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sun, 13 Nov 2011 22:48:37 +0100 Subject: tests: Initialize log system to fix crash, update test result Use osmo_init_logging to initialize the log system to fix crashes when we attempt to parse broken ASN1 messages. Ignore stderr with parse errors, update the test result. make check is now passing. --- tests/testsuite.at | 2 +- tests/ussd/ussd_test.c | 6 ++++++ tests/ussd/ussd_test.ok | 54 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/tests/testsuite.at b/tests/testsuite.at index 0e917f17..b33b04a5 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -41,5 +41,5 @@ AT_CLEANUP AT_SETUP([ussd]) AT_KEYWORDS([ussd]) cat $abs_srcdir/ussd/ussd_test.ok > expout -AT_CHECK([$abs_top_builddir/tests/ussd/ussd_test], [], [expout]) +AT_CHECK([$abs_top_builddir/tests/ussd/ussd_test], [], [expout], [ignore]) AT_CLEANUP diff --git a/tests/ussd/ussd_test.c b/tests/ussd/ussd_test.c index 6d2a8c9b..55384f10 100644 --- a/tests/ussd/ussd_test.c +++ b/tests/ussd/ussd_test.c @@ -19,6 +19,8 @@ * */ +#include +#include #include #include #include @@ -64,12 +66,16 @@ static int parse_mangle_ussd(const uint8_t *_data, int len) return rc; } +struct log_info info = {}; + int main(int argc, char **argv) { struct ussd_request req; const int size = sizeof(ussd_request); int i; + osmo_init_logging(&info); + gsm0480_decode_ussd_request((struct gsm48_hdr *) ussd_request, size, &req); printf("Tested if it still works. Text was: %s\n", req.text); diff --git a/tests/ussd/ussd_test.ok b/tests/ussd/ussd_test.ok index e4bfabc1..1b6316e8 100644 --- a/tests/ussd/ussd_test.ok +++ b/tests/ussd/ussd_test.ok @@ -1 +1,53 @@ -TODO: test is crashing inside the log handling +Tested if it still works. Text was: **321# +Testing parsing a USSD request and truncated versions +Result for 1 is 28 +Result for 1 is 27 +Result for 1 is 26 +Result for 1 is 25 +Result for 0 is 24 +Result for 0 is 23 +Result for 0 is 22 +Result for 0 is 21 +Result for 0 is 20 +Result for 0 is 19 +Result for 0 is 18 +Result for 0 is 17 +Result for 0 is 16 +Result for 0 is 15 +Result for 0 is 14 +Result for 0 is 13 +Result for 0 is 12 +Result for 0 is 11 +Result for 0 is 10 +Result for 0 is 9 +Result for 0 is 8 +Result for 0 is 7 +Result for 0 is 6 +Result for 0 is 5 +Result for 0 is 4 +Result for 0 is 3 +Mangling the container now +Result for 0 is 28 +Result for 0 is 27 +Result for 1 is 26 +Result for 1 is 25 +Result for 0 is 24 +Result for 0 is 23 +Result for 0 is 22 +Result for 0 is 21 +Result for 0 is 20 +Result for 0 is 19 +Result for 0 is 18 +Result for 0 is 17 +Result for 0 is 16 +Result for 0 is 15 +Result for 0 is 14 +Result for 0 is 13 +Result for 0 is 12 +Result for 0 is 11 +Result for 0 is 10 +Result for 0 is 9 +Result for 0 is 8 +Result for 0 is 7 +Result for 0 is 6 +Result for 1 is 5 -- cgit v1.2.3