summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--tests/archinfo22
-rw-r--r--tests/array-types33
-rw-r--r--tests/enums24
-rw-r--r--tests/errors59
-rw-r--r--tests/fixed-array-types33
-rw-r--r--tests/fundamental-primitives161
-rw-r--r--tests/is-struct20
-rw-r--r--tests/load-archinfo41
-rw-r--r--tests/load-functions60
-rw-r--r--tests/load-types4
-rw-r--r--tests/os-dependent-arrays9
-rw-r--r--tests/os-dependent-primitives15
-rw-r--r--tests/signals43
-rw-r--r--tests/split-register-classes22
-rw-r--r--tests/split-register-types70
-rw-r--r--tests/syscall-errors46
-rw-r--r--tests/syscall-ranges38
-rw-r--r--tests/test-self-check47
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