From 92009746ef66e8a9a9dc6643845e839e0debaf18 Mon Sep 17 00:00:00 2001 From: markus schnalke Date: Fri, 28 Nov 2014 00:07:13 +0100 Subject: [PATCH] Fixed the test framework by adjusting it to mmh. In the same go: Cleaned up its code a bit and added a summary to test/runalltests. Adjusting the individual tests to mmh still needs to be done. ... and afterwards we can ;dd a lot more of them. :-) (But before we write our own tests, we first incorporate all the ones they've added to nmh in the meanwhile. ;-) ) --- test/README | 23 +++++++--------- test/common.sh | 72 +++++++++++++++++++++++++------------------------- test/runalltests | 30 ++++++++++++++++++++- test/runtest | 74 ++++++++++++++++++++++++++++++---------------------- test/setup-test | 30 ++++++++++++--------- test/teardown-test | 2 +- 6 files changed, 136 insertions(+), 95 deletions(-) diff --git a/test/README b/test/README index 94b5ab1..e37a4ee 100644 --- a/test/README +++ b/test/README @@ -1,30 +1,25 @@ -nmh unit test suite. +Mmh test suite. - - The testcases are not maintained in mmh, currently. - Thus, they likely are broken. --meillo 2012-04 - - -The purpose of these tests is to verify the functionality of the nmh +The purpose of these tests is to verify the functionality of the mmh commands. The goal of the suite is to create an environment where testing -nmh commands is easy and useful. Each test is a shell script, and is +mmh commands is easy and useful. Each test is a shell script, and is launched via the 'sh' command. The script should run the test and report the result by one of: * for a test pass: exit with status 0 * where a test has been skipped (perhaps because it depends on an - external program which can't be found): print "Test $0 SKIP (reason)" - and exit with status 120 + external program which can't be found) execute: `test_skip "reason"'. + (test_skip() is defined in common.sh; it exits with status 120) * for a test fail: exit with some status other than 0 or 120 The Suite is arranged as such: setup-test - Create the unit test framework. This will re-generate your configure + Create the test framework. This will re-generate your configure script and make files. teardown-test - Remove the temporary files created as part of the unit tests. + Remove the temporary files created as part of the tests. runtest Run a single test. @@ -34,8 +29,8 @@ runalltests tests Directory containing the tests. All files found in this and all - subsequent directories which have the name test-* will be treated as a - single test. + sub-directories which have the name test-* will be treated as one + test each. Complex tests may be given their own directory as long as there is a file named 'test-*' in the directory which will launch the test. diff --git a/test/common.sh b/test/common.sh index 5d46c8c..7f09867 100644 --- a/test/common.sh +++ b/test/common.sh @@ -1,52 +1,54 @@ -# Common helper routines for test shell scripts -- intended to be sourced by them -test_skip () +# Common helper routines for test shell scripts +# -- intended to be sourced by them + +test_skip() { - WHY="$1" - echo "$Test $0 SKIP ($WHY)" - exit 120 + WHY="$1" + echo "Test $0 SKIP ($WHY)" + exit 120 } # portable implementation of 'which' utility findprog() { - FOUND= - PROG="$1" - IFS_SAVE="$IFS" - IFS=: - for D in $PATH; do - if [ -z "$D" ]; then - D=. - fi - if [ -f "$D/$PROG" ] && [ -x "$D/$PROG" ]; then - printf '%s\n' "$D/$PROG" - break - fi - done - IFS="$IFS_SAVE" + FOUND= + PROG="$1" + IFS_SAVE="$IFS" + IFS=: + for D in $PATH; do + if [ -z "$D" ]; then + D=. + fi + if [ -f "$D/$PROG" ] && [ -x "$D/$PROG" ]; then + printf '%s\n' "$D/$PROG" + break + fi + done + IFS="$IFS_SAVE" } -require_prog () +require_prog() { - if [ -z "$(findprog $1)" ]; then - test_skip "missing $1" - fi + if [ -z "$(findprog $1)" ]; then + test_skip "missing $1" + fi } # Some stuff for doing silly progress indicators -progress_update () +progress_update() { - THIS="$1" - FIRST="$2" - LAST="$3" - RANGE="$(($LAST - $FIRST))" - PROG="$(($THIS - $FIRST))" - # this automatically rounds to nearest integer - PERC="$(((100 * $PROG) / $RANGE))" - # note \r so next update will overwrite - printf "%3d%%\r" $PERC + THIS="$1" + FIRST="$2" + LAST="$3" + RANGE="$(expr $LAST - $FIRST ||:)" + PROG="$(expr $THIS - $FIRST ||:)" + # this automatically rounds to nearest integer + PERC="$(expr 100 \* $PROG / $RANGE ||:)" + # note \r so next update will overwrite + printf "%3d%%\r" $PERC } -progress_done () +progress_done() { - printf "100%%\n" + printf "100%%\n" } diff --git a/test/runalltests b/test/runalltests index 0497c52..279ced5 100755 --- a/test/runalltests +++ b/test/runalltests @@ -1,7 +1,35 @@ #!/bin/sh +passed=0 +failed=0 +skipped=0 + # Note that we ignore *~ files as these are probably editor backups for i in `find tests -name 'test-*[!~]' -type f`; do - ./runtest $i + ./runtest "$i" + case $? in + 0) passed="`expr $passed + 1`" ;; + 1) failed="`expr $failed + 1`" ;; + 2) skipped="`expr $skipped + 1`" ;; + esac done + +awk -v passed="$passed" -v failed="$failed" -v skipped="$skipped" ' +BEGIN { + sum = passed + failed + skipped; + if (failed > 0) { + smilie = ":-(" + } else if (sum == passed) { + smilie = ":-)" + } else { + # we either passed the tests or managed to sneak around them + smilie = ";-)" + } + printf("\n%s %s\n", "SUMMARY", smilie); + printf("%-12s %4d = %d%%\n", "Passed", passed, passed/sum*100); + printf("%-12s %4d = %d%%\n", "Failed", failed, failed/sum*100); + printf("%-12s %4d = %d%%\n", "Skipped", skipped, skipped/sum*100); + printf("%-12s %4d\n", "Total", sum); +} +' diff --git a/test/runtest b/test/runtest index 0b18653..edab162 100755 --- a/test/runtest +++ b/test/runtest @@ -2,56 +2,68 @@ set -e -if [ ! -e test-temp-dir ]; then - echo "test-temp-dir not found: running setup-test" - ./setup-test +export MH_TEST_COMMON="$PWD/common.sh" + +if [ ! -f test-temp-dir ]; then + echo "test-temp-dir not found: running setup-test" + ./setup-test fi export MH_TEST_DIR=`cat test-temp-dir` -if [ ! -e "$MH_TEST_DIR/bld/Makefile" ]; then - echo "temporary directory missing or broken: running setup-test" - ./setup-test - export MH_TEST_DIR=`cat test-temp-dir` +if [ ! -f "$MH_TEST_DIR/build/Makefile" ]; then + echo "temporary directory missing or broken: running setup-test" + ./setup-test + export MH_TEST_DIR=`cat test-temp-dir` fi -export MH=$MH_TEST_DIR/Mail/.mh_profile -export PATH=$MH_TEST_DIR/bin:$PATH - -export MH_TEST_COMMON=$PWD/common.sh +unset MMHP MMHC +export PATH="$MH_TEST_DIR/bin:$PATH" +export MMH="$MH_TEST_DIR/.mmh" +MAILDIR="$MH_TEST_DIR/Mail" # clean old test data -rm -rf $MH_TEST_DIR/Mail -# setup test data -mkdir $MH_TEST_DIR/Mail -echo "Path: $MH_TEST_DIR/Mail" > $MH -folder -create +inbox > /dev/null +rm -rf "$MAILDIR" "$MMH" + +# setup mmh +mkdir "$MAILDIR" "$MMH" +cat >"$MMH/profile" <<-! + Path: $MAILDIR + Inbox: +inbox +! +folder -create `mhparam inbox` >/dev/null +folder -create `mhparam trashfolder` >/dev/null +folder -create `mhparam draftfolder` >/dev/null + # create 10 basic messages for i in `seq 1 10`; do - cat > $MH_TEST_DIR/Mail/inbox/$i < -To: Some User -Date: Fri, 29 Sep 2006 00:00:00 -Subject: Testing message $i - -This is message number $i -EOF + cat >"$MAILDIR/inbox/$i" <<-! + From: Test$i + To: Some User + Date: Fri, 29 Sep 2006 00:00:00 + Subject: Testing message $i + + This is message number $i + ! done # now run the test set +e -/bin/sh $1 +/bin/sh "$1" return_value=$? set -e if [ $return_value -eq 0 ] ; then - echo Test $1 PASS + printf "Test %s:\tPASS\n" "$1" + exit 0 elif [ $return_value -eq 120 ]; then - # indicates test was skipped (eg needed program not found) - # test itself should have printed a message about this, - # so print nothing here. - : + # indicates test was skipped (eg needed program not found) + # test itself should have printed a message about this, + # so print nothing here. + : + exit 2 else - echo Test $1 FAIL + printf "Test %s:\tFAIL\n" "$1" + exit 1 fi diff --git a/test/setup-test b/test/setup-test index fab26a0..ffd9e64 100755 --- a/test/setup-test +++ b/test/setup-test @@ -2,21 +2,25 @@ set -e -if TEMPDIR=`cat test-temp-dir 2> /dev/null` \ - && [ -e $TEMPDIR/bld/Makefile ]; then - (cd $TEMPDIR/bld && make all install) - exit +if TEMPDIR="`cat test-temp-dir 2>/dev/null`" \ + && [ -f "$TEMPDIR/build/Makefile" ]; then + (cd "$TEMPDIR/build" && make all install) + exit fi -TEMPDIR=`mktemp -d /tmp/nmh-test-XXXXXXXX` -echo $TEMPDIR > test-temp-dir +TEMPDIR="`mktemp -d /tmp/mmh-test-XXXXXXXX`" +echo "$TEMPDIR" >test-temp-dir cd .. -if ! [ -e configure ]; then - ./autogen.sh +srcdir="$PWD" +if [ ! -f configure ]; then + ./autogen.sh fi -srcdir=$PWD -mkdir $TEMPDIR/bld -cd $TEMPDIR/bld -$srcdir/configure --prefix=$TEMPDIR --with-locking=fcntl --enable-debug -make install +if [ -f Makefile ]; then + make -s clean +fi + +mkdir "$TEMPDIR/build" +cd "$TEMPDIR/build" +"$srcdir/configure" -q --prefix="$TEMPDIR" --enable-debug +make -s all install diff --git a/test/teardown-test b/test/teardown-test index 7e169e4..8c930b1 100755 --- a/test/teardown-test +++ b/test/teardown-test @@ -1,4 +1,4 @@ #!/bin/sh -rm -rf `cat test-temp-dir` +rm -rf "`cat test-temp-dir`" rm -f test-temp-dir -- 1.7.10.4