diff --git a/tests.aconversion.sh b/tests.aconversion.sh index e32ddafe2f4a14803f6f0591c3ecc0d2c41c5fef..d2bd8dc192c34ad4120c3a6823fe4c05dceb010c 100755 --- a/tests.aconversion.sh +++ b/tests.aconversion.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash +set -o pipefail + TESTCASE_ITERATIONS=200 TESTCASE_TIMEOUT=5 LOGFILE="log_tests.txt" @@ -40,82 +42,90 @@ function compare { return $RET } +# $1 = file to store nfa +function generateNFA { + ./arand -d $RAND_DENSITY -n $(( $RANDOM % $RAND_STATES + 1 )) -a $(( $RANDOM % $RAND_ALPHABET + 1 )) > $1 2>/dev/null +} + # $1 = command for conversion. Output of such command must be (eps-)NFA !! function runTest2 { TMPNFA="nfa.xml" - ./arand -d $RAND_DENSITY -n $(( $RANDOM % $RAND_STATES + 1 )) -a $(( $RANDOM % $RAND_ALPHABET + 1 )) > $TMPNFA + $(generateNFA $TMPNFA) + if [ $? -eq 139 ]; then + return 3 + fi - TMP=$(timeout $TESTCASE_TIMEOUT bash -c "cat $TMPNFA | $1") + TMP=$(timeout $TESTCASE_TIMEOUT bash -c "cat $TMPNFA | $1" 2>/dev/null) RETTMP=$? + + # segfault + if [ $RETTMP -eq 139 ]; then + return 3 + fi + + # timeout if [ $RETTMP -ge 123 ]; then return 2 fi - + mDFA1=$(mDFA "$(cat $TMPNFA)") mDFA2=$(mDFA "$TMP") + # as pipefail bash option is turned on, first non-zero exit value of any program in pipe sequence is return code of whole sequence CMP=$(compare "$mDFA1" "$mDFA2") - if [ $? == 0 ]; then - rm nfa.xml + if [ $? == 0 ]; then + rm $TMPNFA return 0 else echo "-----------------------------------------" >> $LOGFILE echo "$1" >> $LOGFILE echo "$CMP" >> $LOGFILE - echo $(cat nfa.xml) >> $LOGFILE - rm nfa.xml + echo $(cat $TMPNFA) >> $LOGFILE + rm $TMPNFA return 1 fi } +# $1 - aconversion sequence function runTest { - ITERS=$TESTCASE_ITERATIONS RES_GOOD=0 - RES_BAD=0 + RES_FAIL=0 RES_TIMEOUT=0 - - if [ $# == 0 ] || [ $# -gt 2 ]; then - echo "Invalid runTest call." - exit - elif [ $# == 2 ]; then - ITERS=$2 - fi - + RES_SIGSEGV=0 echo $1 echo -ne "\t" - for i in $(seq 1 $ITERS ); + for i in $(seq 1 $TESTCASE_ITERATIONS ); do - runTest2 "$1" - RETTEST=$? + TEST_EXITVALUE=$? - if [ $RETTEST == 0 ]; then + if [ $TEST_EXITVALUE == 0 ]; then echo -n "." RES_GOOD=$((RES_GOOD + 1)) - elif [ $RETTEST == 1 ]; then + elif [ $TEST_EXITVALUE == 1 ]; then echo -n "x" - RES_BAD=$((RES_BAD + 1)) - elif [ $RETTEST == 2 ]; then + RES_FAIL=$((RES_FAIL + 1)) + elif [ $TEST_EXITVALUE == 2 ]; then echo -n "T" RES_TIMEOUT=$((RES_TIMEOUT + 1)) - elif [ $RETTEST == 3 ]; then + elif [ $TEST_EXITVALUE == 3 ]; then echo -n "F" - RES_BAD=$((RES_BAD + 1)) + RES_SIGSEGV=$((RES_SIGSEGV + 1)) else echo -n "?" fi done echo -ne "\n\t" - echo "RES: GOOD:" $RES_GOOD ", BAD:" $RES_BAD ", TIMEOUT:" $RES_TIMEOUT + echo "RES: GOOD:" $RES_GOOD ", BAD:" $RES_FAIL ", TIMEOUT:" $RES_TIMEOUT ", SIGSEGV:" $RES_SIGSEGV echo "" } # FA -> RG -> FA # covers: FA -> LRG, FA -> RRG, RRG <-> LRG, RRG -> FA, LRG -> FA -runTest "./aconversion -t RRG | ./aconversion -t LRG | ./aconversion -t FA" +runTest "./aconversion -t RRG | ./aconversion -t LRG | ./aconversion -t FA" runTest "./aconversion -t LRG | ./aconversion -t RRG | ./aconversion -t FA" # FA -> RE -> FA