dwarf-synthesis/csmith/csmith_test_generated.sh

91 lines
2 KiB
Bash
Executable file

#!/bin/bash
USAGE="$0 nb_tests kept_directory"
if [ "$#" -lt 1 ] ; then
>&2 echo -e "Missing argument(s). Usage:\n$USAGE"
exit 1
fi
NB_TESTS=$1
KEPT_DIRECTORY=$2
RUN_TIMEOUT=2
tmpdir="$(mktemp -d)"
error_count=0
function statusline {
echo -ne "\r\e[1m[\e[32m$(printf "%03d/%03d" "$1" "$NB_TESTS")\e[39m] >>>\e[0m $2 "
}
function reporterror {
echo -e "\n\e[1;31m[$(printf "%03d" $1)] Error: \e[0m $2"
}
function mkpath {
echo "$tmpdir/$1"
}
function failed_test {
path=$(mkpath $1)
cp "$path."* "$KEPT_DIRECTORY"
reporterror "$1" "$2"
error_count=$((error_count + 1))
}
function test_empty_dwarf {
path="$2"
statusline $1 "test DWARF emptyness"
if [ -z "$(readelf -wF "$path.eh.bin")" ]; then
return 1
else
return 0
fi
}
function test_run {
path="$2"
statusline $1 "running binaries"
orig="$(timeout $RUN_TIMEOUT "$path.orig.bin")"
orig_status=$?
synth="$(timeout $RUN_TIMEOUT "$path.eh.bin")"
synth_status=$?
if [ "$orig_status" -ne "$synth_status" ] || [ "$orig" != "$synth" ] ; then
return 1
else
return 0
fi
}
mkdir -p "$KEPT_DIRECTORY"
statusline "" ""
for num in $(seq 1 $NB_TESTS); do
## Generation, compilation, synthesis
statusline $num "csmith"
path=$(mkpath $num)
csmith > "$path.c"
statusline $num "compiling"
gcc -O2 -I/usr/include/csmith-2.3.0/ -w "$path.c" -o "$path.orig.bin"
objcopy --remove-section '.eh_frame' --remove-section '.eh_frame_hdr' \
"$path.orig.bin" "$path.bin"
statusline $num "generating dwarf"
../synthesize_dwarf.sh "$path.bin" "$path.eh.bin"
## Testing
if ! test_empty_dwarf "$num" "$path"; then
failed_test "$num" "empty generated DWARF"
elif ! test_run "$num" "$path"; then
failed_test "$num" "different execution behaviour"
fi
done
echo ""
if [ "$error_count" -eq "0" ] ; then
echo -e "\n== ALL TESTS PASSED =="
else
echo -e "\n== FAILED TESTS: $error_count/$NB_TESTS =="
fi
rm -rf "$tmpdir"