diff --git a/.github/workflows/ci-alpine-linux.yml b/.github/workflows/ci-alpine-linux.yml index 40920751..3c5fb06d 100644 --- a/.github/workflows/ci-alpine-linux.yml +++ b/.github/workflows/ci-alpine-linux.yml @@ -23,6 +23,9 @@ jobs: - run: meson setup builddir/ env: CC: gcc - - run: ninja -C builddir + - run: meson compile -C builddir + env: + CC: gcc + - run: meson test --verbose -C builddir env: CC: gcc diff --git a/.github/workflows/ci-ubuntu.yml b/.github/workflows/ci-ubuntu.yml index 5a5c9ed7..1be9f0c5 100644 --- a/.github/workflows/ci-ubuntu.yml +++ b/.github/workflows/ci-ubuntu.yml @@ -16,6 +16,9 @@ jobs: - run: ninja -C builddir env: CC: gcc + - run: ninja test --verbose -C builddir + env: + CC: gcc clang-glibc: @@ -30,3 +33,6 @@ jobs: - run: ninja -C builddir env: CC: clang + - run: ninja test --verbose -C builddir + env: + CC: clang diff --git a/ci/cirrus.sh b/ci/cirrus.sh index 20adc9b7..49e0cbb3 100755 --- a/ci/cirrus.sh +++ b/ci/cirrus.sh @@ -18,4 +18,4 @@ set -x meson build meson compile -C build -# gmake test +meson test --verbose -C build diff --git a/meson.build b/meson.build index d37910c3..11d146a5 100644 --- a/meson.build +++ b/meson.build @@ -6,7 +6,7 @@ project('OpenRC', 'c', 'prefix=/usr', 'warning_level=3', ], - meson_version : '>=0.53.0') + meson_version : '>=0.53.2') cc = meson.get_compiler('c') fs = import('fs') @@ -205,6 +205,7 @@ subdir('sh') subdir('src') subdir('support') subdir('sysctl.d') +subdir('test') subdir('zsh-completion') meson.add_install_script('tools/meson_runlevels.sh', diff --git a/test/check-obsolete-functions.sh b/test/check-obsolete-functions.sh new file mode 100755 index 00000000..c9a200f1 --- /dev/null +++ b/test/check-obsolete-functions.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +top_srcdir=${SOURCE_ROOT:-..} +. ${top_srcdir}/test/setup_env.sh + +ebegin "Checking for obsolete functions" +out=$(cd ${top_srcdir}; find src -name '*.[ch]' \ + ! -name queue.h \ + -exec grep -n -E '\<(malloc|memory|sys/(errno|fcntl|signal|stropts|termios|unistd))\.h\>' {} +) +[ -z "${out}" ] +eend $? "Avoid these obsolete functions:"$'\n'"${out}" diff --git a/test/check-spacing-style.sh b/test/check-spacing-style.sh new file mode 100644 index 00000000..b8c1cd2a --- /dev/null +++ b/test/check-spacing-style.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +top_srcdir=${SOURCE_ROOT:-..} +. ${top_srcdir}/test/setup_env.sh + +ebegin "Checking spacing style" +out=$(cd ${top_srcdir}; find src -name '*.[ch]' \ + ! -name queue.h \ + -exec grep -n -E \ + -e '\<(for|if|switch|while)\(' \ + -e '\<(for|if|switch|while) \( ' \ + -e ' ;' \ + -e '[[:space:]]$' \ + -e '\){' \ + -e '(^|[^:])//' \ + {} +) +[ -z "${out}" ] +eend $? "These lines violate style rules:"$'\n'"${out}" diff --git a/test/check-trailing-newlines.sh b/test/check-trailing-newlines.sh new file mode 100755 index 00000000..4c99e761 --- /dev/null +++ b/test/check-trailing-newlines.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +top_srcdir=${SOURCE_ROOT:-..} +. ${top_srcdir}/test/setup_env.sh + +ebegin "Checking trailing newlines in code" +out=$(cd ${top_srcdir}; + for f in $(find */ -name '*.[ch]') ; do + while read -r line; do + if [ -n "${line}" ]; then + blankline= + else + blankline=1 + fi + done < "${f}" + [ -n "${blankline}" ] && printf "%s\n" "${f}" + done) +[ -z "${out}" ] +eend $? "Trailing newlines need to be deleted:"$'\n'"${out}" diff --git a/test/check-trailing-whitespace.sh b/test/check-trailing-whitespace.sh new file mode 100755 index 00000000..4aa4af9a --- /dev/null +++ b/test/check-trailing-whitespace.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +top_srcdir=${SOURCE_ROOT:-..} +. ${top_srcdir}/test/setup_env.sh + +ebegin "Checking trailing whitespace in code" +# XXX: Should we check man pages too ? +out=$(cd ${top_srcdir}; find */ \ + '(' -name '*.[ch]' -o -name '*.in' -o -name '*.sh' ')' \ + -exec grep -n -E '[[:space:]]+$' {} +) +[ -z "${out}" ] +eend $? "Trailing whitespace needs to be deleted:"$'\n'"${out}" diff --git a/test/check-xfunc-usage.sh b/test/check-xfunc-usage.sh new file mode 100755 index 00000000..1e35002a --- /dev/null +++ b/test/check-xfunc-usage.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +top_srcdir=${SOURCE_ROOT:-..} +. ${top_srcdir}/test/setup_env.sh + +ebegin "Checking for x* func usage" +out=$(cd ${top_srcdir}; find src -name '*.[ch]' \ + ! -name queue.h \ + -exec grep -n -E '\<(malloc|strdup)[[:space:]]*\(' {} + \ + | grep -v \ + -e src/shared/helpers.h \ + -e src/libeinfo/libeinfo.c) + +[ -z "${out}" ] +eend $? "These need to be using the x* variant:"$'\n'"${out}" diff --git a/test/meson.build b/test/meson.build new file mode 100644 index 00000000..5f1274df --- /dev/null +++ b/test/meson.build @@ -0,0 +1,26 @@ +if meson.version().version_compare('>=0.56.0') + build_root = meson.project_build_root() + source_root = meson.project_source_root() +else + build_root = meson.build_root() + source_root = meson.source_root() +endif + +test_env = [ + 'BUILD_ROOT=' + build_root, + 'SOURCE_ROOT=' + source_root + ] + +check_obsolete_functions = find_program('check-obsolete-functions.sh') +check_spacing_style = find_program('check-spacing-style.sh') +check_trailing_newlines = find_program('check-trailing-newlines.sh') +check_trailing_whitespace = find_program('check-trailing-whitespace.sh') +check_xfunc_usage = find_program('check-xfunc-usage.sh') + +test('check for obsolete functions', check_obsolete_functions, env : test_env) +test('check spacing style', check_spacing_style, env : test_env) +test('check trailing newlines', check_trailing_newlines, env : test_env) +test('check trailing whitespace', check_trailing_whitespace, env : test_env) +test('check xfunc usage', check_xfunc_usage, env : test_env) + +subdir('units') diff --git a/test/runtests.sh b/test/runtests.sh deleted file mode 100755 index 5e21d2ab..00000000 --- a/test/runtests.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/sh - -top_srcdir=${top_srcdir:-..} -. ${top_srcdir}/test/setup_env.sh - -libeinfo_srcdir="${srcdir}/../libeinfo" -libeinfo_builddir="${builddir}/../libeinfo" -librc_srcdir="${srcdir}/../librc" -librc_builddir="${builddir}/../librc" -rc_srcdir="${srcdir}/../rc" -rc_builddir="${builddir}/../rc" - -checkit() { - local base=$1; shift - echo "$@" | tr ' ' '\n' > ${base}.out - diff -u ${base}.list ${base}.out - eend $? - : $(( ret += $? )) -} - -ret=0 - -fail_on_out() { - if [ -n "${out}" ]; then - eerror "Last command failed; failing" - exit 1 - fi -} - -ebegin "Checking trailing whitespace in code" -# XXX: Should we check man pages too ? -out=$(cd ${top_srcdir}; find */ \ - '(' -name '*.[ch]' -o -name '*.in' -o -name '*.sh' ')' \ - -exec grep -n -E '[[:space:]]+$' {} +) -[ -z "${out}" ] -eend $? "Trailing whitespace needs to be deleted:"$'\n'"${out}" -fail_on_out - -ebegin "Checking trailing newlines in code" -out=$(cd ${top_srcdir}; - for f in `find */ -name '*.[ch]'` ; do - sed -n -e :a -e '/^\n*$/{$q1;N;ba' -e '}' $f || echo $f - done) -[ -z "${out}" ] -eend $? "Trailing newlines need to be deleted:"$'\n'"${out}" -fail_on_out - -ebegin "Checking for obsolete functions" -out=$(cd ${top_srcdir}; find src -name '*.[ch]' \ - ! -name queue.h \ - -exec grep -n -E '\<(malloc|memory|sys/(errno|fcntl|signal|stropts|termios|unistd))\.h\>' {} +) -[ -z "${out}" ] -eend $? "Avoid these obsolete functions:"$'\n'"${out}" -fail_on_out - -ebegin "Checking for x* func usage" -out=$(cd ${top_srcdir}; find src -name '*.[ch]' \ - ! -name queue.h \ - -exec grep -n -E '\<(malloc|strdup)[[:space:]]*\(' {} + \ - | grep -v \ - -e src/includes/helpers.h \ - -e src/libeinfo/libeinfo.c) -[ -z "${out}" ] -eend $? "These need to be using the x* variant:"$'\n'"${out}" -fail_on_out - -ebegin "Checking spacing style" -out=$(cd ${top_srcdir}; find src -name '*.[ch]' \ - ! -name queue.h \ - -exec grep -n -E \ - -e '\<(for|if|switch|while)\(' \ - -e '\<(for|if|switch|while) \( ' \ - -e ' ;' \ - -e '[[:space:]]$' \ - -e '\){' \ - -e '(^|[^:])//' \ - {} +) -[ -z "${out}" ] -eend $? "These lines violate style rules:"$'\n'"${out}" -fail_on_out - -einfo "Running unit tests" -eindent -for u in units/*; do - [ -x "${u}" -a -f "${u}" ] || continue - ebegin "$(basename "${u}")" - ./"${u}" - eend $? - : $(( ret += $? )) -done - -exit ${ret} diff --git a/test/setup_env.sh b/test/setup_env.sh index 881984f9..1dcd12d2 100755 --- a/test/setup_env.sh +++ b/test/setup_env.sh @@ -1,23 +1,21 @@ #!/bin/sh -if [ -z "${top_srcdir}" ] ; then - echo "You must set top_srcdir before sourcing this file" 1>&2 +if [ -z "${BUILD_ROOT}" ] ; then + printf "%s\n" "You must export BUILD_ROOT before sourcing this file" >&2 exit 1 fi -srcdir=${srcdir:-.} -top_builddir=${top_builddir:-${top_srcdir}} -builddir=${builddir:-${srcdir}} - -LD_LIBRARY_PATH=${top_builddir}/src/libeinfo:${top_builddir}/src/librc:${LD_LIBRARY_PATH} -PATH=${top_builddir}/src/rc:${PATH} -export LD_LIBRARY_PATH PATH - -if [ ! -f ${top_srcdir}/sh/functions.sh ] ; then - echo "functions.sh not yet created !?" 1>&2 - exit 1 -elif ! . ${top_srcdir}/sh/functions.sh; then - echo "Sourcing functions.sh failed !?" 1>&2 +if [ -z "${SOURCE_ROOT}" ] ; then + printf "%s\n" "You must export SOURCE_ROOT before sourcing this file" >&2 exit 1 fi +if [ ! -f ${BUILD_ROOT}/sh/functions.sh ] ; then + printf "%s\n" "functions.sh not yet created !?" >&2 + exit 1 +elif ! . ${BUILD_ROOT}/sh/functions.sh; then + printf "%s\n" "Sourcing functions.sh failed !?" >&2 + exit 1 +fi + +PATH="${BUILD_ROOT}"/src/einfo:${PATH} diff --git a/test/units/is_older_than b/test/units/check-is-older-than.sh similarity index 83% rename from test/units/is_older_than rename to test/units/check-is-older-than.sh index 47a62d78..8987fcd2 100755 --- a/test/units/is_older_than +++ b/test/units/check-is-older-than.sh @@ -2,7 +2,13 @@ # unit test for is_older_than code of baselayout (2008/06/19) # Author: Matthias Schwarzott -TMPDIR=tmp-"$(basename "$0")" +if [ -z "${BUILD_ROOT}" ]; then + printf "%s\n" "BUILD_ROOT must be defined" >&2 + exit 1 +fi +PATH="${BUILD_ROOT}"/src/is_older_than:${PATH} + +TMPDIR="${BUILD_ROOT}"/tmp-"$(basename "$0")" # Please note that we added this unit test because the function # should really be called is_newer_than as it's what it's really testing. @@ -37,13 +43,14 @@ do_test() is_older_than "$@" r2=$? - [ -n "${VERBOSE}" ] && echo "reference = $r1 | OpenRC = $r2" + [ -n "${VERBOSE}" ] && + printf "reference = %s | OpenRC = %s\n" "$r1" "$r2" [ $r1 = $r2 ] } echo_cmd() { - [ -n "${VERBOSE}" ] && echo "$@" + [ -n "${VERBOSE}" ] && printf "%s\n" "$@" "$@" } diff --git a/test/units/sh_yesno b/test/units/check-sh-yesno.sh similarity index 96% rename from test/units/sh_yesno rename to test/units/check-sh-yesno.sh index 380864ee..ecc2f6dd 100755 --- a/test/units/sh_yesno +++ b/test/units/check-sh-yesno.sh @@ -9,7 +9,7 @@ # This file may not be copied, modified, propagated, or distributed # except according to the terms contained in the LICENSE file. -: ${top_srcdir:=..} +top_srcdir=${SOURCE_ROOT:-..} . $top_srcdir/test/setup_env.sh ret=0 diff --git a/test/units/meson.build b/test/units/meson.build new file mode 100644 index 00000000..23c2758a --- /dev/null +++ b/test/units/meson.build @@ -0,0 +1,5 @@ +is_older_than = find_program('check-is-older-than.sh') +sh_yesno = find_program('check-sh-yesno.sh') + +test('is_older_than', is_older_than, env : test_env) +test('sh_yesno', sh_yesno, env : test_env)