92 lines
2 KiB
Bash
92 lines
2 KiB
Bash
|
#!/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"
|