sfeed_update tests: add initial automated tests - sfeed_tests - sfeed tests and RSS and Atom files
 (HTM) git clone git://git.codemadness.org/sfeed_tests
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d8e5c3bd772a5480dff77936b2642e496e741e38
 (DIR) parent f6225f213e6abbe40b67ced09edfbe16f762018d
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Thu, 14 Dec 2023 20:35:36 +0100
       
       sfeed_update tests: add initial automated tests
       
       Diffstat:
         C input/sfeed_update/test.sh -> inpu… |       0 
         M input/sfeed_update/test.sh          |     172 +++++++++++++++++++++++++++++--
       
       2 files changed, 164 insertions(+), 8 deletions(-)
       ---
 (DIR) diff --git a/input/sfeed_update/test.sh b/input/sfeed_update/manual.sh
 (DIR) diff --git a/input/sfeed_update/test.sh b/input/sfeed_update/test.sh
       @@ -1,9 +1,165 @@
        #!/bin/sh
       -sfeed_update /dev/null # should say feeds function is not defined.
       -sfeed_update nonexistant
       -sfeed_update `pwd` # directory
       -sfeed_update /root # directory, no access
       -sfeed_update /root/.sfeed/sfeedrc # no access
       -
       -#sfeed_update "" # empty: loads default
       -#sfeed_update # loads default
       +SFEED_UPDATE="sfeed_update"
       +
       +# expect(expect, got, [extra])
       +expect() {
       +        if [ "$1" != "$2" ]; then
       +                extra="$3"
       +                [ "$extra" = "" ] || extra="($extra)"
       +                echo "Expected \"$1\", but got \"$2\" $extra" >&2
       +                exit 1
       +        fi
       +}
       +
       +# test normal execution, all succesful.
       +test_normal() {
       +        rc="$(mktemp)"
       +        log_stdout="$(mktemp)"
       +        log_stderr="$(mktemp)"
       +        feedpath="$(mktemp -d)"
       +
       +        cat > "$rc" <<!
       +sfeedpath="$feedpath"
       +
       +feeds() {
       +        # feed <name> <feedurl> [basesiteurl] [encoding]
       +        feed "1" "file:///dev/null"
       +        feed "2" "file:///dev/null"
       +        feed "3" "file:///dev/null"
       +}
       +!
       +
       +        "$SFEED_UPDATE" "$rc" >"$log_stdout" 2>"$log_stderr"
       +        expect "0" "$?" "exit statuscode"
       +
       +        linecount=$(wc -l < "$log_stdout")
       +        linecount=$((linecount+0))
       +        expect "3" "$linecount" "all 3 lines should be written to stdout"
       +
       +        linecount=$(wc -l < "$log_stderr")
       +        linecount=$((linecount+0))
       +        expect "0" "$linecount" "0 lines should be written to stderr"
       +
       +        test -d "$feedpath"
       +        expect "0" "$?" "directory should exist: $feedpath"
       +
       +        for i in 1 2 3; do
       +                f="$feedpath/$i"
       +                test -f "$f"
       +                expect "0" "$?" "file should exist: $f"
       +        done
       +
       +        # cleanup test
       +        rm -rf "$feedpath"
       +        rm -f "$log_stdout" "$log_stderr" "$rc"
       +
       +        echo "test_normal: test OK" >&2
       +}
       +
       +# test execution where a feed failed.
       +test_one_fail() {
       +        rc="$(mktemp)"
       +        log_stdout="$(mktemp)"
       +        log_stderr="$(mktemp)"
       +        feedpath="$(mktemp -d)"
       +
       +        cat > "$rc" <<!
       +sfeedpath="$feedpath"
       +
       +feeds() {
       +        # feed <name> <feedurl> [basesiteurl] [encoding]
       +        feed "1" "file:///dev/null"
       +        feed "2" "file:///dev/null_fail"
       +        feed "3" "file:///dev/null"
       +}
       +!
       +
       +        "$SFEED_UPDATE" "$rc" >"$log_stdout" 2> "$log_stderr"
       +        expect "1" "$?" "exit statuscode"
       +
       +        linecount=$(wc -l < "$log_stdout")
       +        linecount=$((linecount+0))
       +        expect "2" "$linecount" "2 lines should be written to stdout"
       +
       +        linecount=$(wc -l < "$log_stderr")
       +        linecount=$((linecount+0))
       +        expect "1" "$linecount" "1 line should be written to stderr"
       +
       +        test -d "$feedpath"
       +        expect "0" "$?" "directory should exist: $feedpath"
       +
       +        for i in 1 2 3; do
       +                f="$feedpath/$i"
       +                test -f "$f"
       +                expect "0" "$?" "file should exist: $f"
       +        done
       +
       +        # cleanup test
       +        rm -rf "$feedpath"
       +        rm -f "$log_stdout" "$log_stderr" "$rc"
       +
       +        echo "test_one_fail: test OK" >&2
       +}
       +
       +# test SIGTERM
       +test_sigterm() {
       +        rc="$(mktemp)"
       +        log_stdout="$(mktemp)"
       +        log_stderr="$(mktemp)"
       +        feedpath="$(mktemp -d)"
       +
       +        cat > "$rc" <<!
       +sfeedpath="$feedpath"
       +
       +# override
       +feed() {
       +        _feed "\$@"
       +        sleep 2
       +}
       +
       +feeds() {
       +        # feed <name> <feedurl> [basesiteurl] [encoding]
       +        feed "1" "file:///dev/null"
       +        feed "2" "file:///dev/null"
       +        feed "3" "file:///dev/null"
       +}
       +!
       +
       +        "$SFEED_UPDATE" "$rc" >"$log_stdout" 2> "$log_stderr" &
       +        pid="$!"
       +        {
       +                sleep 1
       +                kill -TERM "$pid"
       +        } &
       +        wait "$pid"
       +        expect "143" "$?" "exit statuscode"
       +
       +        test -d "$feedpath"
       +        expect "0" "$?" "directory should exist: $feedpath"
       +
       +        # TODO: test that temporary directory is properly cleaned up.
       +
       +        # cleanup test
       +        rm -rf "$feedpath"
       +        rm -f "$log_stdout" "$log_stderr" "$rc"
       +
       +        echo "test_sigterm: test OK" >&2
       +}
       +
       +test_normal
       +test_one_fail
       +
       +# NOTE: SIGINT can't reliably be tested.
       +test_sigterm
       +
       +# TODO:
       +# - test weird feednames.
       +#   - check filenames, '*', '/', newline.
       +# - test override functions.
       +# - test error messages, grep for "FAIL (ENCODING)" etc.
       +# - test merge, order logic.
       +# - test empty fields (for xargs etc).
       +# - add existing test-cases and make them automatic:
       +#   - ecoding/
       +#   - exitstatus/
       +#   - merge/