diff options
author | Mattias Andrée <maandree@kth.se> | 2023-12-05 20:10:48 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2023-12-05 20:10:48 +0100 |
commit | 6d77b155bcd4725e09837604e6ea86f5f124ba9c (patch) | |
tree | 7cfdf466bb94bbbe3e7929432bc048da5eaa2349 /tests | |
parent | Second commit (diff) | |
download | libsyscalls-6d77b155bcd4725e09837604e6ea86f5f124ba9c.tar.gz libsyscalls-6d77b155bcd4725e09837604e6ea86f5f124ba9c.tar.bz2 libsyscalls-6d77b155bcd4725e09837604e6ea86f5f124ba9c.tar.xz |
Third commit
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/archinfo | 22 | ||||
-rw-r--r-- | tests/array-types | 33 | ||||
-rw-r--r-- | tests/enums | 24 | ||||
-rw-r--r-- | tests/errors | 59 | ||||
-rw-r--r-- | tests/fixed-array-types | 33 | ||||
-rw-r--r-- | tests/fundamental-primitives | 161 | ||||
-rw-r--r-- | tests/is-struct | 20 | ||||
-rw-r--r-- | tests/load-archinfo | 41 | ||||
-rw-r--r-- | tests/load-functions | 60 | ||||
-rw-r--r-- | tests/load-types | 4 | ||||
-rw-r--r-- | tests/os-dependent-arrays | 9 | ||||
-rw-r--r-- | tests/os-dependent-primitives | 15 | ||||
-rw-r--r-- | tests/signals | 43 | ||||
-rw-r--r-- | tests/split-register-classes | 22 | ||||
-rw-r--r-- | tests/split-register-types | 70 | ||||
-rw-r--r-- | tests/syscall-errors | 46 | ||||
-rw-r--r-- | tests/syscall-ranges | 38 | ||||
-rw-r--r-- | tests/test-self-check | 47 |
18 files changed, 747 insertions, 0 deletions
diff --git a/tests/archinfo b/tests/archinfo new file mode 100644 index 0000000..5034766 --- /dev/null +++ b/tests/archinfo @@ -0,0 +1,22 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +printf '%s\n' "$archinfo" | grep '^AMD64 8 64 64 Little TWOS_COMPLEMENT' >/dev/null +printf '%s\n' "$archinfo" | grep '^AMD64_X32 8 32 32 Little TWOS_COMPLEMENT' >/dev/null +printf '%s\n' "$archinfo" | grep '^M68K 8 32 32 Big TWOS_COMPLEMENT' >/dev/null +printf '%s\n' "$archinfo" | grep '^PARISC_32 8 32 32 Big TWOS_COMPLEMENT' >/dev/null +printf '%s\n' "$archinfo" | grep '^PARISC_64 8 64 64 Big TWOS_COMPLEMENT' >/dev/null +printf '%s\n' "$archinfo" | grep '^SPARC_32 8 32 32 Big TWOS_COMPLEMENT' >/dev/null +printf '%s\n' "$archinfo" | grep '^I386 8 32 32 Little TWOS_COMPLEMENT' >/dev/null +test $(getbytesize AMD64) = 8 +test $(getbytesize I386) = 8 +test $(getaddrsize I386) = 32 +test $(getaddrsize AMD64) = 64 +test $(getsizesize AMD64) = 64 +test $(getsizesize I386) = 32 +test $(getendian I386) = Little +test $(getendian AMD64) = Little +test $(getendian M68K) = Big +test $(getsign I386) = TWOS_COMPLEMENT +test $(getsign AMD64) = TWOS_COMPLEMENT +test $(getsign M68K) = TWOS_COMPLEMENT diff --git a/tests/array-types b/tests/array-types new file mode 100644 index 0000000..5bb0429 --- /dev/null +++ b/tests/array-types @@ -0,0 +1,33 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +patypes="$(printf '%s\n' "$types" | cut -d ' ' -f 2 | grep -v '\(STRUCT\|UNION\)' | sed -n 's/_ARRAY$//p')" +test -n "$patypes" +for os in $(getnamelist OS); do + osn=$(getnum OS $os) + for arch in $(getnamelist ARCH); do + archn=$(getnum ARCH $arch) + if ! issupported $os $arch; then + continue + fi + + for ptype in $patypes CHAR; do + atype="${ptype}_ARRAY" + if test $atype = CHAR_ARRAY; then + atype=BUFFER + fi + auftype="${atype}_UNKNOWN_FILL" + + get-datatype-description.tu $osn $archn $(lookupnum "$types" $ptype) $os $arch $ptype \ + | sed 's/^\(array_size\) = 1$/\1 = 0/' \ + | sed 's/^\(fill_is_known\) = .*$/\1 = 1/' \ + | sed 's/^\(relative_position_of_array_size\) = .*$/\1 = 1/' \ + | sed 's/^\(absolute_position_of_array_size\) = .*$/\1 = -1/' > $a + get-datatype-description.tu $osn $archn $(lookupnum "$types" $atype) $os $arch $atype > $b + diff -u $a $b + + get-datatype-description.tu $osn $archn $(lookupnum "$types" $auftype) $os $arch $auftype > $b + sed 's/^\(fill_is_known\) = .*$/\1 = 0/' < $a | diff -u - $b + done + done +done diff --git a/tests/enums b/tests/enums new file mode 100644 index 0000000..43afe3d --- /dev/null +++ b/tests/enums @@ -0,0 +1,24 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +check_enum_good () { + test -n "$(getnamelist "$@")" + test -n "$(getnumlist "$@")" + test -z "$(getnamelist "$@" | sort | uniq -d)" + test -z "$(getnumlist "$@" | sort | uniq -d)" + (( "$(getnumlist "$@" | sort -n | sed -n \$p)" <= 0xFFFF )) +} +check_enum_good OS +check_enum_good ARCH +check_enum_good CAT +for cat in $(getnamelist CAT); do + if test "$cat" = SUPPORT_PENDING || test "$cat" = NOT_IMPLEMENTED; then + continue + fi + check_enum_good ${cat}_SUBCAT + grep -i "enum.libsyscalls_${cat}_syscall_subcategory"'\s\+'"$cat"\\b < libsyscalls.h >/dev/null +done +check_enum_good SIGN +check_enum_good ANNOTATION +check_enum_good SECTION +check_enum_good TYPE cpp_enum_clean diff --git a/tests/errors b/tests/errors new file mode 100644 index 0000000..f14ddfc --- /dev/null +++ b/tests/errors @@ -0,0 +1,59 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +strerror-all.tu > $a +stderr perror-all.tu > $b +diff -u $a $b +test $(wc -l < $a) -ge 10 + +strerror-bad.tu > $a +stderr perror-bad.tu > $b +diff -u $a $b +test $(wc -l < $a) = 2 +grep -i '\(un\|not \)recogni[sz]ed' > /dev/null < $a +test "$(sed 1q < $a)" = "$(sed 1d < $a)" + +for t in perror-bad.tu perror-all.tu; do + stderr $t "" > $a + stderr $t > $b + diff -u $a $b + + stderr $t "test" > $a + stderr $t > $b + (! diff -u $a $b >/dev/null) + + stderr $t "test" > $a + stderr $t | sed 's/^/test: /' > $b + diff -u $a $b +done + +strerror-all.tu > $a +list-errors.tu > $b +(! grep '^-' >/dev/null < $b) +grep '^[0-9]\+ ' >/dev/null < $b +grep '^[0-9]\+ LIBSYSCALLS_E_[A-Z]\+ ' >/dev/null < $b +grep '^[0-9]\+ LIBSYSCALLS_E_[A-Z]\+ [A-Z].*[^.]$' >/dev/null < $b +cut -d ' ' -f 3- < $b | diff -u $a - +sed 1q < $b | grep '^0 LIBSYSCALLS_E_OK Success$' >/dev/null +test -z "$(cut -d ' ' -f 1 < $b | sort | uniq -d)" +test -z "$(cut -d ' ' -f 2 < $b | sort | uniq -d)" +test -z "$(cut -d ' ' -f 3- < $b | sort | uniq -d)" + +test "$(get-error.tu LIBSYSCALLS_E_OK)" = 'Success' +test "$(get-error.tu LIBSYSCALLS_E_OSNOSUP)" = 'Operating system not supported' +test "$(get-error.tu LIBSYSCALLS_E_NOSUCHSYSCALL)" = 'No such system call' + +# This can be updated, its just to check that nothing is accidentally changed in LIBSYSCALLS_LIST_ERRORS +cat > $a <<. +0 LIBSYSCALLS_E_OK Success +1 LIBSYSCALLS_E_OSNOSUP Operating system not supported +2 LIBSYSCALLS_E_ARCHNOSUP Architecture not supported for selected operating system +3 LIBSYSCALLS_E_NOSUCHSYSCALL No such system call +4 LIBSYSCALLS_E_NOERRORS There is no error listing for selected operating system +5 LIBSYSCALLS_E_NOSIGNALS There is no signal listing for selected operating system +6 LIBSYSCALLS_E_NOMEM Failed to allocate required memory +7 LIBSYSCALLS_E_INVAL Invalid arguments passed to function +8 LIBSYSCALLS_E_NOSUCHTYPE Type does not exist on the selected operating system or architecture +9 LIBSYSCALLS_E_ISSTRUCT Type is a structure or union +. +list-errors.tu | diff -u $a - diff --git a/tests/fixed-array-types b/tests/fixed-array-types new file mode 100644 index 0000000..070920e --- /dev/null +++ b/tests/fixed-array-types @@ -0,0 +1,33 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +for os in $(getnamelist OS); do + osn=$(getnum OS $os) + for arch in $(getnamelist ARCH); do + archn=$(getnum ARCH $arch) + if ! issupported $os $arch; then + continue + fi + + ptype=INT + atype=2_INTS + get-datatype-description.tu $osn $archn $(lookupnum "$types" $ptype) $os $arch $ptype \ + | sed 's/^\(array_size\) = 1$/\1 = 2/' > $a + get-datatype-description.tu $osn $archn $(lookupnum "$types" $atype) $os $arch $atype > $b + diff -u $a $b + + ptype=INT_FD + atype=2_INTS_FD + get-datatype-description.tu $osn $archn $(lookupnum "$types" $ptype) $os $arch $ptype \ + | sed 's/^\(array_size\) = 1$/\1 = 2/' > $a + get-datatype-description.tu $osn $archn $(lookupnum "$types" $atype) $os $arch $atype > $b + diff -u $a $b + + ptype=UINT32 + atype=2_UINT32S + get-datatype-description.tu $osn $archn $(lookupnum "$types" $ptype) $os $arch $ptype \ + | sed 's/^\(array_size\) = 1$/\1 = 2/' > $a + get-datatype-description.tu $osn $archn $(lookupnum "$types" $atype) $os $arch $atype > $b + diff -u $a $b + done +done diff --git a/tests/fundamental-primitives b/tests/fundamental-primitives new file mode 100644 index 0000000..4068934 --- /dev/null +++ b/tests/fundamental-primitives @@ -0,0 +1,161 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +whole=$(getnum SECTION WHOLE) +noannotation=$(getnum ANNOTATION NONE) +for os in $(getnamelist OS); do + osn=$(getnum OS $os) + for arch in $(getnamelist ARCH); do + archn=$(getnum ARCH $arch) + if ! issupported $os $arch; then + continue + fi + + endian=$(getendian $arch) + + sign_representation=$(getsign $arch) + if test ${sign_representation} = TWOS_COMPLEMENT; then + min_is_minus_max=0 + elif test ${sign_representation} = ONES_COMPLEMENT; then + min_is_minus_max=1 + elif test ${sign_representation} = SIGN_MAGNITUDE; then + min_is_minus_max=1 + elif test ${sign_representation} = EXCESS_HALF; then + min_is_minus_max=0 + else + false # that's all we have for now + fi + sign_representation=$(getnum SIGN ${sign_representation}) + + for n in $intsizes; do + type=INT$n + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $a + grep "^width_in_bits = ${n}"\$ < $a >/dev/null + grep "^array_size = 1"\$ < $a >/dev/null + grep "^relative_position_of_array_size = 0"\$ < $a >/dev/null + grep "^absolute_position_of_array_size = -1"\$ < $a >/dev/null + grep "^is_signed = 1"\$ < $a >/dev/null + grep "^is_unsigned = 0"\$ < $a >/dev/null + grep "^min_is_minus_max = ${min_is_minus_max}"\$ < $a >/dev/null + grep "^sign_representation = ${sign_representation}"\$ < $a >/dev/null + grep "^annotation = ${noannotation}"\$ < $a >/dev/null + grep "^section = ${whole}"\$ < $a >/dev/null + grep "^byteorder = $(getbyteorder $n $endian)"\$ < $a >/dev/null + + type=UINT$n + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $a + grep "^width_in_bits = ${n}"\$ < $a >/dev/null + grep "^array_size = 1"\$ < $a >/dev/null + grep "^relative_position_of_array_size = 0"\$ < $a >/dev/null + grep "^absolute_position_of_array_size = -1"\$ < $a >/dev/null + grep "^is_signed = 0"\$ < $a >/dev/null + grep "^is_unsigned = 1"\$ < $a >/dev/null + grep "^annotation = ${noannotation}"\$ < $a >/dev/null + grep "^section = ${whole}"\$ < $a >/dev/null + grep "^byteorder = $(getbyteorder $n $endian)"\$ < $a >/dev/null + done + + type=INT$(getaddrsize $arch) + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $a + type=INTPTR + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $b + diff -u $a $b + + type=INT$(getsizesize $arch) + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $a + type=SSIZE + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $b + diff -u $a $b + + type=VOID + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $a + grep "^width_in_bits = 0"\$ < $a >/dev/null + grep "^array_size = 1"\$ < $a >/dev/null + grep "^relative_position_of_array_size = 0"\$ < $a >/dev/null + grep "^absolute_position_of_array_size = -1"\$ < $a >/dev/null + grep "^is_signed = 0"\$ < $a >/dev/null + grep "^is_unsigned = 0"\$ < $a >/dev/null + grep "^annotation = ${noannotation}"\$ < $a >/dev/null + grep "^section = ${whole}"\$ < $a >/dev/null + grep "^byteorder =\s*"\$ < $a >/dev/null + type=NO_RETURN + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type | diff -u $a - + + type=INT + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $a + type=INT_SIGNAL + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $b + sed 's/^\(annotation\) .*$/\1 = '"$(getnum ANNOTATION SIGNAL)"'/' < $a | diff -u - $b + type=INT_FD + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $b + sed 's/^\(annotation\) .*$/\1 = '"$(getnum ANNOTATION FD)"'/' < $a | diff -u - $b + type=INT_ATFD + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $b + sed 's/^\(annotation\) .*$/\1 = '"$(getnum ANNOTATION ATFD)"'/' < $a | diff -u - $b + + type=LONG + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $a + type=LONG_FD + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $b + sed 's/^\(annotation\) .*$/\1 = '"$(getnum ANNOTATION FD)"'/' < $a | diff -u - $b + type=LONG_ATFD + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $b + sed 's/^\(annotation\) .*$/\1 = '"$(getnum ANNOTATION ATFD)"'/' < $a | diff -u - $b + + for type in SCHAR SHORT INT LONG LLONG PTRDIFF INTPTR SSIZE; do + if test $type = SCHAR; then + utype=UCHAR + elif test $type = SSIZE; then + utype=SIZE + else + utype=U$type + fi + + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $a + grep "^width_in_bits = ." < $a >/dev/null + grep "^array_size = 1"\$ < $a >/dev/null + grep "^relative_position_of_array_size = 0"\$ < $a >/dev/null + grep "^absolute_position_of_array_size = -1"\$ < $a >/dev/null + grep "^is_signed = 1"\$ < $a >/dev/null + grep "^is_unsigned = 0"\$ < $a >/dev/null + grep "^min_is_minus_max = ${min_is_minus_max}"\$ < $a >/dev/null + grep "^sign_representation = ${sign_representation}"\$ < $a >/dev/null + grep "^annotation = ${noannotation}"\$ < $a >/dev/null + grep "^section = ${whole}"\$ < $a >/dev/null + n="$(grep "^width_in_bits = ." < $a | cut -d ' ' -f 3)" + grep "^byteorder = $(getbyteorder $n $endian)"\$ < $a >/dev/null + + sed -e 's/^\(is_signed =\) .$/\1 0/' -e 's/^\(is_unsigned =\) .$/\1 1/' < $a > $b + ( ! diff -u $b $a > /dev/null) + grep -v '^\(min_is_minus_max\|sign_representation\) = ' < $b > $a + ( ! diff -u $a $b > /dev/null) + get-datatype-description.tu $osn $archn $(lookupnum "$types" $utype) $os $arch $utype > $b + grep -v '^\(min_is_minus_max\|sign_representation\) = ' < $b | diff -u $a - + + if test $type = SCHAR; then + xtypes=CHAR + elif test $type = INTPTR; then + xtypes="MEMORY_ADDRESS STRING STRINGS_THEN_NULL" + else + xtypes= + fi + for xtype in $xtypes; do + get-datatype-description.tu $osn $archn $(lookupnum "$types" $xtype) $os $arch $xtype \ + | grep -v '^\(min_is_minus_max\|sign_representation\) = ' > $b + sed 's/^\(is_\(un\)signed =\) .$/\1 0/' < $a | diff -u - $b + done + done + + type=INTPTR + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $a + type=PTRDIFF + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $b + diff -u $a $b + + type=DYNAMIC + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $a + type=UNKNOWN + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type > $b + diff -u $a $b + done +done diff --git a/tests/is-struct b/tests/is-struct new file mode 100644 index 0000000..310e615 --- /dev/null +++ b/tests/is-struct @@ -0,0 +1,20 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +printf '%s\n' "$types" | grep STRUCT >/dev/null +printf '%s\n' "$types" | grep UNION >/dev/null +structs="$(printf '%s\n' "$types" | grep '\(STRUCT\|UNION\)' | cut -d ' ' -f 1)" +int=$(lookupnum "$types" INT) +for os in $(getnamelist OS); do + osn=$(getnum OS $os) + for arch in $(getnamelist ARCH); do + archn=$(getnum ARCH $arch) + if ! issupported $os $arch; then + continue + fi + ( ! is-datatype-struct.tu $osn $archn $int $os $arch INT ) + for type in $structs; do + is-datatype-struct.tu $osn $archn $type $os $arch 'some struct or union' + done + done +done diff --git a/tests/load-archinfo b/tests/load-archinfo new file mode 100644 index 0000000..4c38f6b --- /dev/null +++ b/tests/load-archinfo @@ -0,0 +1,41 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +#in this test, we are assuming that char is 8 bits +intsizes="8 16 32 64" +cat > $b <<. +8Little 0 +16Little 0 8 +32Little 0 8 16 24 +64Little 0 8 16 24 32 40 48 56 +8Big 0 +16Big 8 0 +32Big 24 16 8 0 +64Big 56 48 40 32 24 16 8 0 +. +byteorders="$(cat $b)" +getbyteorder () { + printf '%s\n' "$byteorders" | grep "^$1$2 " | cut -d ' ' -f 2- +} + +sed '1,/LIST_ARCH_SPECS/d' < libsyscalls_get_datatype_description.c \ +| sed '/#include/q' \ +| sed 's/\(TO''DO\)\s*([^)]*)/\1/g' \ +| sed -n 's/^\s*[A-Z_]\+(LIBSYSCALLS_ARCH_\([^)]*\)).*$/\1/p' \ +| sed 's/,\s*/ /g' > $b +archinfo="$(cat $b)" +getbytesize () { + printf '%s\n' "$archinfo" | grep "^$1 " | cut -d ' ' -f 2 +} +getaddrsize () { + printf '%s\n' "$archinfo" | grep "^$1 " | cut -d ' ' -f 3 +} +getsizesize () { + printf '%s\n' "$archinfo" | grep "^$1 " | cut -d ' ' -f 4 +} +getendian () { + printf '%s\n' "$archinfo" | grep "^$1 " | cut -d ' ' -f 5 +} +getsign () { + printf '%s\n' "$archinfo" | grep "^$1 " | cut -d ' ' -f 6 +} diff --git a/tests/load-functions b/tests/load-functions new file mode 100644 index 0000000..f0c5311 --- /dev/null +++ b/tests/load-functions @@ -0,0 +1,60 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +stderr () { + ("$@") 2>&1 >/dev/null +} + +getlist () { + getlist_list="$1" + shift 1 + if test $# = 0; then set cat; fi + "$@" < libsyscalls.h \ + | tr , '\n' \ + | sed -n 's/^\s*LIBSYSCALLS_'"${getlist_list}"'_\([A-Z0-9_]\+\(\s*=\s*[ 0-9A-Fa-fxXULul()^&|!*/<>~+-]\+\)\?\)\b.*$/\1/p' \ + | tr = ' ' \ + | (i=0; while read name value; do + if test -n "$value"; then + i=$(( $(printf '%s\n' "$value" | tr -d 'ULul') )) + i=$(printf '%s\n' "$i" | cut -d . -f 1) + fi + printf '%i %s\n' $(( i++ )) $name; + done) +} + +getnamelist () { + getlist "$@" | cut -d ' ' -f 2 +} + +getnumlist () { + getlist "$@" | cut -d ' ' -f 1 +} + +getname () { + (getlist "$1" | grep "^$2 " | cut -d ' ' -f 2 | tee /dev/stderr | grep . >/dev/null) 2>&1 +} + +getnum () { + (getlist "$1" | grep " $2"\$ | cut -d ' ' -f 1 | tee /dev/stderr | grep . >/dev/null) 2>&1 +} + +lookupname () { + (printf '%s\n' "$1" | grep "^$2 " | cut -d ' ' -f 2 | tee /dev/stderr | grep . >/dev/null) 2>&1 +} + +lookupnum () { + (printf '%s\n' "$1" | grep " $2"\$ | cut -d ' ' -f 1 | tee /dev/stderr | grep . >/dev/null) 2>&1 +} + +issupported () { + if test $# = 1; then + printf '%s\n' ${SUPPORTED_OSES} | grep -i "^$1"\$ > /dev/null + else + printf '%s\n' ${SUPPORTED_OSES} | grep -i "^$1"\$ > /dev/null && + env | sed -n 's/^SUPPORTED_'"$1"'_ARCHES=//p' | xargs printf '%s\n' | grep -i "^$2"\$ > /dev/null + fi +} + +cpp_enum_clean () { + $CPP < libsyscalls.h 2>/dev/null | grep -v '#' | tr '\n,{}' ' \n\n\n' +} diff --git a/tests/load-types b/tests/load-types new file mode 100644 index 0000000..1113609 --- /dev/null +++ b/tests/load-types @@ -0,0 +1,4 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +types="$(getlist TYPE cpp_enum_clean)" diff --git a/tests/os-dependent-arrays b/tests/os-dependent-arrays new file mode 100644 index 0000000..13c119b --- /dev/null +++ b/tests/os-dependent-arrays @@ -0,0 +1,9 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +for os in $(getnamelist OS); do + osn=$(getnum OS $os) + if issupported $os; then + . $(printf '%s\n' $os | tr '[A-Z]' '[a-z]')/tests/os-dependent-arrays + fi +done diff --git a/tests/os-dependent-primitives b/tests/os-dependent-primitives new file mode 100644 index 0000000..c0438af --- /dev/null +++ b/tests/os-dependent-primitives @@ -0,0 +1,15 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +typeisas () { + get-datatype-description.tu $osn $archn $(lookupnum "$types" $1) $os $arch $1 > $a + get-datatype-description.tu $osn $archn $(lookupnum "$types" $2) $os $arch $2 > $b + diff -u $a $b +} + +for os in $(getnamelist OS); do + osn=$(getnum OS $os) + if issupported $os; then + . $(printf '%s\n' $os | tr '[A-Z]' '[a-z]')/tests/os-dependent-primitives + fi +done diff --git a/tests/signals b/tests/signals new file mode 100644 index 0000000..7e58621 --- /dev/null +++ b/tests/signals @@ -0,0 +1,43 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +for os in $(getnamelist OS); do + osn=$(getnum OS $os) + for arch in $(getnamelist ARCH); do + archn=$(getnum ARCH $arch) + get-signals.tu $osn $archn $os $arch > $a + grep -v '^[0-9]\+ -' >/dev/null < $a + grep -v '^-' < $a > $b + grep '^\([0-9]\+\) \1 ' < $a | diff -u $a - + if issupported $os $arch; then + (! test "$(cat $a)" = x) + if test "$os" = LINUX; then + signed=1 + grep '^[0-9]\+ [0-9]\+ [A-Z0-9_+]\+$' >/dev/null < $a + test -z "$(grep -v '^[0-9]\+ [0-9]\+ [A-Z0-9_+]\+$' < $a)" + required="SIGKILL SIGTERM SIGCONT SIGSTOP SIGHUP _SIGRTMIN _SIGRTMIN+8" + else + continue; + fi + for req in $required; do + grep '^-\?[0-9]\+ [0-9]\+ '"$req"\$ >/dev/null < $a + done + cut -d ' ' -f $(( 2 - signed )) < $a > $b && sort -n < $b | diff -u $b - + if test -f testcases/signals-$os-$arch; then + if ! diff -u testcases/signals-$os-$arch $a; then + printf '\x1b[33m%s\x1b[m\n' "Maybe new signals have been added for $os on $arch" + exit 1 + fi + fi + else + # Can still be successful because it may be hardcorded to + # use the same table as another architecture that is supported, + # however it cannot be successful if the OS is not supported + issupported $os + fi + test -z "$(cut -d ' ' -f 1 < $a | sort | uniq -d)" + test -z "$(cut -d ' ' -f 2 < $a | sort | uniq -d)" + test -z "$(cut -d ' ' -f 3 < $a | sort | uniq -d)" + done +done +test -f testcases/signals-LINUX-AMD64 diff --git a/tests/split-register-classes b/tests/split-register-classes new file mode 100644 index 0000000..71622bb --- /dev/null +++ b/tests/split-register-classes @@ -0,0 +1,22 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +test $(getnamelist SECTION | grep '_HALF$' | wc -l) -ge 8 +for sec in $(getnamelist SECTION | grep '_HALF$'); do + secn=$(getnum SECTION $sec) + is-section-half.tu $secn + (! is-section-quarter.tu $secn) + test $(get-section-fraction.tu $secn) = 2 +done + +test $(getnamelist SECTION | grep '_QUARTER$' | wc -l) -ge 4 +for sec in $(getnamelist SECTION | grep '_QUARTER$'); do + secn=$(getnum SECTION $sec) + is-section-quarter.tu $secn + (! is-section-half.tu $secn) + test $(get-section-fraction.tu $secn) = 4 +done + +secn="$(getnum SECTION WHOLE)" +test -n "$secn" +test $(get-section-fraction.tu $secn) = 1 diff --git a/tests/split-register-types b/tests/split-register-types new file mode 100644 index 0000000..3b3070b --- /dev/null +++ b/tests/split-register-types @@ -0,0 +1,70 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +upper_half=$(getnum SECTION UPPER_HALF) +lower_half=$(getnum SECTION LOWER_HALF) +for os in $(getnamelist OS); do + osn=$(getnum OS $os) + for arch in $(getnamelist ARCH); do + archn=$(getnum ARCH $arch) + if ! issupported $os $arch; then + continue + fi + + for stype in INT64_HIGH_32 INT64_LOW_32 INT64_FRONT_32 INT64_BACK_32; do + utype=U$stype + rtype="$(printf '%s\n' "$stype" | sed 's/^\(INT\)[0-9]\+_[A-Z]\+_\([0-9]\+\)$/\1\2/')" + test ! "$rtype" = "$stype" + rtypen=$(lookupnum "$types" $rtype) + stypen=$(lookupnum "$types" $stype) + utypen=$(lookupnum "$types" $utype) + test -n "$rtypen" + test -n "$stypen" + test -n "$utypen" + + get-datatype-description.tu $osn $archn $rtypen $os $arch $rtype \ + | grep -v "^section = " > $a + get-datatype-description.tu $osn $archn $stypen $os $arch $stype \ + | grep -v "^section = " > $b + diff -u $a $b + + get-datatype-description.tu $osn $archn $stypen $os $arch $stype \ + | sed -e 's/^\(is_signed =\) .$/\1 0/' -e 's/^\(is_unsigned =\) .$/\1 1/' > $a + get-datatype-description.tu $osn $archn $utypen $os $arch $utype > $b + diff -u $a $b + done + + type=INT64_HIGH_32 + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type \ + | grep "^section = ${upper_half}"\$ >/dev/null + + type=INT64_LOW_32 + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type \ + | grep "^section = ${lower_half}"\$ >/dev/null + + endian=$(getendian $arch) + if test $endian = Little; then + + type=INT64_FRONT_32 + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type \ + | grep "^section = ${lower_half}"\$ >/dev/null + + type=INT64_BACK_32 + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type \ + | grep "^section = ${upper_half}"\$ >/dev/null + + elif test $endian = Big; then + + type=INT64_FRONT_32 + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type \ + | grep "^section = ${upper_half}"\$ >/dev/null + + type=INT64_BACK_32 + get-datatype-description.tu $osn $archn $(lookupnum "$types" $type) $os $arch $type \ + | grep "^section = ${lower_half}"\$ >/dev/null + + else + false # that's all we have for now + fi + done +done diff --git a/tests/syscall-errors b/tests/syscall-errors new file mode 100644 index 0000000..0d36428 --- /dev/null +++ b/tests/syscall-errors @@ -0,0 +1,46 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +for os in $(getnamelist OS); do + osn=$(getnum OS $os) + for arch in $(getnamelist ARCH); do + archn=$(getnum ARCH $arch) + get-syscall-errors.tu $osn $archn $os $arch > $a + grep -v '^[0-9]\+ -' >/dev/null < $a + grep -v '^-' < $a > $b + grep '^\([0-9]\+\) \1 ' < $a | diff -u $a - + if issupported $os $arch; then + (! test "$(cat $a)" = x) + if test "$os" = LINUX; then + signed=1 + grep '^[0-9]\+ [0-9]\+ [A-Z0-9_]\+$' >/dev/null < $a + test -z "$(grep -v '^[0-9]\+ [0-9]\+ [A-Z0-9_]\+$' < $a)" + required="ERESTARTSYS ERESTARTNOINTR ERESTARTNOHAND ERESTART_RESTARTBLOCK EPERM ENOENT EDOM ELOOP" + else + continue; + fi + for req in $required; do + grep '^-\?[0-9]\+ [0-9]\+ '"$req"\$ >/dev/null < $a + done + cut -d ' ' -f $(( 2 - signed )) < $a > $b && sort -n < $b | diff -u $b - + if test -f testcases/errors-$os-$arch; then + if ! diff -u testcases/errors-$os-$arch $a; then + printf '\x1b[33m%s\x1b[m\n' "Maybe new errors have been added for $os on $arch" + exit 1 + fi + fi + else + # Can still be successful because it may be hardcorded to + # use the same table as another architecture that is supported, + # however it cannot be successful if the OS is not supported + issupported $os + fi + test -z "$(cut -d ' ' -f 1 < $a | sort | uniq -d)" + test -z "$(cut -d ' ' -f 2 < $a | sort | uniq -d)" + test -z "$(cut -d ' ' -f 3 < $a | sort | uniq -d)" + done +done +test -f testcases/errors-LINUX-AMD64 +test -f testcases/errors-LINUX-PARISC_32 +test -f testcases/errors-LINUX-PARISC_64 +(! diff -u testcases/errors-LINUX-AMD64 testcases/errors-LINUX-PARISC_32 >/dev/null) diff --git a/tests/syscall-ranges b/tests/syscall-ranges new file mode 100644 index 0000000..e42679a --- /dev/null +++ b/tests/syscall-ranges @@ -0,0 +1,38 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +for os in $(getnamelist OS); do + osn=$(getnum OS $os) + for arch in $(getnamelist ARCH); do + archn=$(getnum ARCH $arch) + get-syscall-range.tu $osn $archn $os $arch > $a + min="$(sed -n 's/min: //p' < $a)" + max="$(sed -n 's/max: //p' < $a)" + test -n "$min" + test -n "$max" + if test $min = x || test $max = x; then + (! issupported $os $arch) + continue + fi + issupported $os $arch + done +done +check_range () { + if issupported $1 $2; then + osn=$(getnum OS $1) + archn=$(getnum ARCH $2) + get-syscall-range.tu $osn $archn $1 $2 > $a + min="$(sed -n 's/min: //p' < $a)" + max="$(sed -n 's/max: //p' < $a)" + test $min -le $3 + test $max -ge $4 + test -z "$5" || test $min -ge $5 + fi +} +check_range LINUX AMD64 0 453 0 +check_range LINUX AMD64_X32 0 547 0 +check_range LINUX M68K 0 452 0 +check_range LINUX PARISC_32 0 452 0 +check_range LINUX PARISC_64 0 452 0 +check_range LINUX SPARC_32 0 452 0 +check_range LINUX I386 0 452 0 diff --git a/tests/test-self-check b/tests/test-self-check new file mode 100644 index 0000000..8e42f18 --- /dev/null +++ b/tests/test-self-check @@ -0,0 +1,47 @@ +# -*- sh -*- +# See LICENSE file for copyright and license details. + +set -e + +stderr_printf () { + printf "$@" >&2 +} +test "$(stderr_printf 'hello\n')" = '' +test "$(stderr stderr_printf 'hello\n' 2>&1)" = 'hello' + +(! (false > $a) ) + +getname OS 0 +(! getname OS) +getnum OS LINUX +(! getnum OS 0) + +getnamelist OS | grep LINUX +getnamelist ARCH | grep AMD64_X32 + +getnumlist OS | grep '^0$' +getnumlist ARCH | grep 10 + +getnumlist OS ${CPP} | grep '^0$' +test -n "${CPP}" + +test "$(getname OS 0)" = LINUX +test "$(getnum OS LINUX)" = 0 + +test "$(lookupnum "$(getlist OS)" LINUX)" = 0 +test "$(lookupname "$(getlist OS)" 0)" = LINUX + +printf 'a\n' > $a +printf 'b\n' > $b +(! diff -u $a $b) + +printf 'a\n' > $a +printf 'a\n' > $b +diff -u $a $b + +for os in ${SUPPORTED_OSES}; do + issupported $os + for arch in $(env | sed -n 's/^SUPPORTED_'"$os"'_ARCHES=//p' | xargs printf '%s\n'); do + issupported $os $arch + done +done |