Diffstat (limited to 'tests')
| -rw-r--r-- | tests/.gitignore | 4 | ||||
| -rw-r--r-- | tests/Makefile | 6 | ||||
| -rw-r--r-- | tests/filters/dump.lua | 17 | ||||
| -rwxr-xr-x | tests/filters/dump.sh | 4 | ||||
| -rwxr-xr-x | tests/setup.sh | 208 | ||||
| -rwxr-xr-x | tests/t0001-validate-git-versions.sh | 45 | ||||
| -rwxr-xr-x | tests/t0010-validate-html.sh | 31 | ||||
| -rwxr-xr-x | tests/t0020-validate-cache.sh | 41 | ||||
| -rwxr-xr-x | tests/t0101-index.sh | 25 | ||||
| -rwxr-xr-x | tests/t0102-summary.sh | 35 | ||||
| -rwxr-xr-x | tests/t0103-log.sh | 33 | ||||
| -rwxr-xr-x | tests/t0104-tree.sh | 33 | ||||
| -rwxr-xr-x | tests/t0105-commit.sh | 41 | ||||
| -rwxr-xr-x | tests/t0106-diff.sh | 101 | ||||
| -rwxr-xr-x | tests/t0107-snapshot.sh | 208 | ||||
| -rwxr-xr-x | tests/t0108-patch.sh | 59 | ||||
| -rwxr-xr-x | tests/t0109-gitconfig.sh | 48 | ||||
| -rwxr-xr-x | tests/t0110-rawdiff.sh | 42 | ||||
| -rwxr-xr-x | tests/t0111-filter.sh | 46 | ||||
| -rw-r--r-- | tests/t0112-ci.sh | 127 | ||||
| -rw-r--r-- | tests/t0113-ci-lua.sh | 78 | ||||
| -rw-r--r-- | tests/t0114-broken-repo.sh | 71 | ||||
| -rwxr-xr-x | tests/valgrind/bin/cgit | 12 |
23 files changed, 1058 insertions, 257 deletions
diff --git a/tests/.gitignore b/tests/.gitignore index c1c1c0b..3fd2e96 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,2 +1,2 @@ -trash -test-output.log +trash\ directory.t* +test-results diff --git a/tests/Makefile b/tests/Makefile index 8c6c236..65e1117 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,11 +1,15 @@ +include ../git/config.mak.uname +-include ../cgit.conf +SHELL_PATH ?= $(SHELL) +SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) T = $(wildcard t[0-9][0-9][0-9][0-9]-*.sh) all: $(T) $(T): - @./$@ + @'$(SHELL_PATH_SQ)' $@ $(CGIT_TEST_OPTS) clean: $(RM) -rf trash diff --git a/tests/filters/dump.lua b/tests/filters/dump.lua new file mode 100644 index 0000000..1f15c93 --- /dev/null +++ b/tests/filters/dump.lua @@ -0,0 +1,17 @@ +function filter_open(...) + buffer = "" + for i = 1, select("#", ...) do + buffer = buffer .. select(i, ...) .. " " + end +end + +function filter_close() + html(buffer) + return 0 +end + +function filter_write(str) + buffer = buffer .. string.upper(str) +end + + diff --git a/tests/filters/dump.sh b/tests/filters/dump.sh new file mode 100755 index 0000000..da6f7a1 --- /dev/null +++ b/tests/filters/dump.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +[ "$#" -gt 0 ] && printf "%s " "$*" +tr '[:lower:]' '[:upper:]' diff --git a/tests/setup.sh b/tests/setup.sh index e3c6c17..8db810f 100755 --- a/tests/setup.sh +++ b/tests/setup.sh @@ -15,134 +15,166 @@ # run_test 'repo index' 'cgit_url "/" | tidy -e' # run_test 'repo summary' 'cgit_url "/foo" | tidy -e' -unset CDPATH +# We don't want to run Git commands through Valgrind, so we filter out the +# --valgrind option here and handle it ourselves. We copy the arguments +# assuming that none contain a newline, although other whitespace is +# preserved. +LF=' +' +test_argv= + +while test $# != 0 +do + case "$1" in + --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind) + cgit_valgrind=t + test_argv="$test_argv${LF}--verbose" + ;; + *) + test_argv="$test_argv$LF$1" + ;; + esac + shift +done + +OLDIFS=$IFS +IFS=$LF +set -- $test_argv +IFS=$OLDIFS + +: ${TEST_DIRECTORY=$(pwd)/../git/t} +: ${TEST_OUTPUT_DIRECTORY=$(pwd)} +TEST_NO_CREATE_REPO=YesPlease +. "$TEST_DIRECTORY"/test-lib.sh + +# Prepend the directory containing cgit to PATH. +if test -n "$cgit_valgrind" +then + GIT_VALGRIND="$TEST_DIRECTORY/valgrind" + CGIT_VALGRIND=$(cd ../valgrind && pwd) + PATH="$CGIT_VALGRIND/bin:$PATH" + export GIT_VALGRIND CGIT_VALGRIND +else + PATH="$(pwd)/../..:$PATH" +fi + +FILTER_DIRECTORY=$(cd ../filters && pwd) + +if cgit --version | grep -F -q "[+] Lua scripting"; then + export CGIT_HAS_LUA=1 +else + export CGIT_HAS_LUA=0 +fi mkrepo() { name=$1 count=$2 - dir=$PWD - test -d "$name" && return - printf "Creating testrepo %s\n" "$name" - mkdir -p "$name" - cd "$name" - git init - n=1 - while test $n -le $count - do - echo $n >file-$n - git add file-$n - git commit -m "commit $n" - n=$(expr $n + 1) - done - if test "$3" = "testplus" - then - echo "hello" >a+b - git add a+b - git commit -m "add a+b" - git branch "1+2" - fi - cd "$dir" + test_create_repo "$name" + ( + cd "$name" + n=1 + while test $n -le $count + do + echo $n >file-$n + git add file-$n + git commit -m "commit $n" + n=$(expr $n + 1) + done + case "$3" in + testplus) + echo "hello" >a+b + git add a+b + git commit -m "add a+b" + git branch "1+2" + ;; + commit-graph) + git commit-graph write + ;; + esac + ) } setup_repos() { - rm -rf trash/cache - mkdir -p trash/cache - mkrepo trash/repos/foo 5 >/dev/null - mkrepo trash/repos/bar 50 >/dev/null - mkrepo trash/repos/foo+bar 10 testplus >/dev/null - mkrepo "trash/repos/with space" 2 >/dev/null - cat >trash/cgitrc <<EOF + rm -rf cache + mkdir -p cache + mkrepo repos/foo 5 >/dev/null + mkrepo repos/bar 50 commit-graph >/dev/null + mkrepo repos/foo+bar 10 testplus >/dev/null + mkrepo "repos/with space" 2 >/dev/null + mkrepo repos/filter 5 testplus >/dev/null + cat >cgitrc <<EOF virtual-root=/ -cache-root=$PWD/trash/cache +cache-root=$PWD/cache cache-size=1021 -snapshots=tar.gz tar.bz zip +snapshots=tar.gz tar.bz tar.lz tar.xz tar.zst zip enable-log-filecount=1 enable-log-linecount=1 summary-log=5 summary-branches=5 summary-tags=5 clone-url=git://example.org/\$CGIT_REPO_URL.git +enable-filter-overrides=1 repo.url=foo -repo.path=$PWD/trash/repos/foo/.git +repo.path=$PWD/repos/foo/.git # Do not specify a description for this repo, as it then will be assigned # the constant value "[no description]" (which actually used to cause a # segfault). repo.url=bar -repo.path=$PWD/trash/repos/bar/.git +repo.path=$PWD/repos/bar/.git repo.desc=the bar repo repo.url=foo+bar -repo.path=$PWD/trash/repos/foo+bar/.git +repo.path=$PWD/repos/foo+bar/.git repo.desc=the foo+bar repo repo.url=with space -repo.path=$PWD/trash/repos/with space/.git +repo.path=$PWD/repos/with space/.git repo.desc=spaced repo -EOF -} - -prepare_tests() -{ - setup_repos - rm -f test-output.log 2>/dev/null - test_count=0 - test_failed=0 - echo "[$0]" "$@" >test-output.log - echo "$@" "($0)" -} -tests_done() -{ - printf "\n" - if test $test_failed -gt 0 - then - printf "test: *** %s failure(s), logfile=%s\n" \ - $test_failed "$(pwd)/test-output.log" - false - fi -} +repo.url=filter-exec +repo.path=$PWD/repos/filter/.git +repo.desc=filtered repo +repo.about-filter=exec:$FILTER_DIRECTORY/dump.sh +repo.commit-filter=exec:$FILTER_DIRECTORY/dump.sh +repo.email-filter=exec:$FILTER_DIRECTORY/dump.sh +repo.source-filter=exec:$FILTER_DIRECTORY/dump.sh +repo.readme=master:a+b +EOF -run_test() -{ - bug=0 - if test "$1" = "BUG" - then - bug=1 - shift - fi - desc=$1 - script=$2 - test_count=$(expr $test_count + 1) - printf "\ntest %d: name='%s'\n" $test_count "$desc" >>test-output.log - printf "test %d: eval='%s'\n" $test_count "$2" >>test-output.log - eval "$2" >>test-output.log 2>>test-output.log - res=$? - printf "test %d: exitcode=%d\n" $test_count $res >>test-output.log - if test $res = 0 -a $bug = 0 - then - printf " %2d) %-60s [ok]\n" $test_count "$desc" - elif test $res = 0 -a $bug = 1 - then - printf " %2d) %-60s [BUG FIXED]\n" $test_count "$desc" - elif test $bug = 1 - then - printf " %2d) %-60s [KNOWN BUG]\n" $test_count "$desc" - else - test_failed=$(expr $test_failed + 1) - printf " %2d) %-60s [failed]\n" $test_count "$desc" + if [ $CGIT_HAS_LUA -eq 1 ]; then + cat >>cgitrc <<EOF +repo.url=filter-lua +repo.path=$PWD/repos/filter/.git +repo.desc=filtered repo +repo.about-filter=lua:$FILTER_DIRECTORY/dump.lua +repo.commit-filter=lua:$FILTER_DIRECTORY/dump.lua +repo.email-filter=lua:$FILTER_DIRECTORY/dump.lua +repo.source-filter=lua:$FILTER_DIRECTORY/dump.lua +repo.readme=master:a+b +EOF fi } cgit_query() { - CGIT_CONFIG="$PWD/trash/cgitrc" QUERY_STRING="$1" "$PWD/../cgit" + CGIT_CONFIG="$PWD/cgitrc" QUERY_STRING="$1" cgit } cgit_url() { - CGIT_CONFIG="$PWD/trash/cgitrc" QUERY_STRING="url=$1" "$PWD/../cgit" + CGIT_CONFIG="$PWD/cgitrc" QUERY_STRING="url=$1" cgit +} + +strip_headers() { + while read -r line + do + test -z "$line" && break + done + cat } + +test -z "$CGIT_TEST_NO_CREATE_REPOS" && setup_repos diff --git a/tests/t0001-validate-git-versions.sh b/tests/t0001-validate-git-versions.sh new file mode 100755 index 0000000..dd84fe3 --- /dev/null +++ b/tests/t0001-validate-git-versions.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +if [ "${CGIT_TEST_NO_GIT_VERSION}" = "YesPlease" ]; then + exit 0 +fi + +test_description='Check Git version is correct' +CGIT_TEST_NO_CREATE_REPOS=YesPlease +. ./setup.sh + +test_expect_success 'extract Git version from Makefile' ' + sed -n -e "/^GIT_VER[ ]*=/ { + s/^GIT_VER[ ]*=[ ]*// + p + }" ../../Makefile >makefile_version +' + +# Note that Git's GIT-VERSION-GEN script applies "s/-/./g" to the version +# string to produce the internal version in the GIT-VERSION-FILE, so we +# must apply the same transformation to the version in the Makefile before +# comparing them. +test_expect_success 'test Git version matches Makefile' ' + ( cat ../../git/GIT-VERSION-FILE || echo "No GIT-VERSION-FILE" ) | + sed -e "s/GIT_VERSION[ ]*=[ ]*//" -e "s/\\.dirty$//" >git_version && + sed -e "s/-/./g" makefile_version >makefile_git_version && + test_cmp git_version makefile_git_version +' + +test_expect_success 'test submodule version matches Makefile' ' + if ! test -e ../../git/.git + then + echo "git/ is not a Git repository" >&2 + else + ( + cd ../.. && + sm_oid=$(git ls-files --stage -- git | + sed -e "s/^[0-9]* \\([0-9a-f]*\\) [0-9] .*$/\\1/") && + cd git && + git describe --match "v[0-9]*" $sm_oid + ) | sed -e "s/^v//" -e "s/-/./" >sm_version && + test_cmp sm_version makefile_version + fi +' + +test_done diff --git a/tests/t0010-validate-html.sh b/tests/t0010-validate-html.sh index 3fe4800..ca08d69 100755 --- a/tests/t0010-validate-html.sh +++ b/tests/t0010-validate-html.sh @@ -1,5 +1,6 @@ #!/bin/sh +test_description='Validate html with tidy' . ./setup.sh @@ -7,9 +8,9 @@ test_url() { tidy_opt="-eq" test -z "$NO_TIDY_WARNINGS" || tidy_opt+=" --show-warnings no" - cgit_url "$1" >trash/tidy-$test_count || return - sed -ie "1,4d" trash/tidy-$test_count || return - "$tidy" $tidy_opt trash/tidy-$test_count + cgit_url "$1" >tidy-$test_count.tmp || return + sed -e "1,4d" tidy-$test_count.tmp >tidy-$test_count || return + "$tidy" $tidy_opt tidy-$test_count rc=$? # tidy returns with exitcode 1 on warnings, 2 on error @@ -21,21 +22,19 @@ test_url() fi } -prepare_tests 'Validate html with tidy' - -tidy=`which tidy` +tidy=`which tidy 2>/dev/null` test -n "$tidy" || { - echo "Skipping tests: tidy not found" - tests_done + skip_all='Skipping html validation tests: tidy not found' + test_done exit } -run_test 'index page' 'test_url ""' -run_test 'foo' 'test_url "foo"' -run_test 'foo/log' 'test_url "foo/log"' -run_test 'foo/tree' 'test_url "foo/tree"' -run_test 'foo/tree/file-1' 'test_url "foo/tree/file-1"' -run_test 'foo/commit' 'test_url "foo/commit"' -run_test 'foo/diff' 'test_url "foo/diff"' +test_expect_success 'index page' 'test_url ""' +test_expect_success 'foo' 'test_url "foo"' +test_expect_success 'foo/log' 'test_url "foo/log"' +test_expect_success 'foo/tree' 'test_url "foo/tree"' +test_expect_success 'foo/tree/file-1' 'test_url "foo/tree/file-1"' +test_expect_success 'foo/commit' 'test_url "foo/commit"' +test_expect_success 'foo/diff' 'test_url "foo/diff"' -tests_done +test_done diff --git a/tests/t0020-validate-cache.sh b/tests/t0020-validate-cache.sh index 53ec2eb..657765d 100755 --- a/tests/t0020-validate-cache.sh +++ b/tests/t0020-validate-cache.sh @@ -1,13 +1,13 @@ #!/bin/sh +test_description='Validate cache' . ./setup.sh -prepare_tests 'Validate cache' +test_expect_success 'verify cache-size=0' ' -run_test 'verify cache-size=0' ' - - rm -f trash/cache/* && - sed -i -e "s/cache-size=1021$/cache-size=0/" trash/cgitrc && + rm -f cache/* && + sed -e "s/cache-size=1021$/cache-size=0/" cgitrc >cgitrc.tmp && + mv -f cgitrc.tmp cgitrc && cgit_url "" && cgit_url "foo" && cgit_url "foo/refs" && @@ -21,13 +21,15 @@ run_test 'verify cache-size=0' ' cgit_url "bar/log" && cgit_url "bar/diff" && cgit_url "bar/patch" && - test 0 -eq $(ls trash/cache | wc -l) + ls cache >output && + test_line_count = 0 output ' -run_test 'verify cache-size=1' ' +test_expect_success 'verify cache-size=1' ' - rm -f trash/cache/* && - sed -i -e "s/cache-size=0$/cache-size=1/" trash/cgitrc && + rm -f cache/* && + sed -e "s/cache-size=0$/cache-size=1/" cgitrc >cgitrc.tmp && + mv -f cgitrc.tmp cgitrc && cgit_url "" && cgit_url "foo" && cgit_url "foo/refs" && @@ -41,13 +43,15 @@ run_test 'verify cache-size=1' ' cgit_url "bar/log" && cgit_url "bar/diff" && cgit_url "bar/patch" && - test 1 -eq $(ls trash/cache | wc -l) + ls cache >output && + test_line_count = 1 output ' -run_test 'verify cache-size=1021' ' +test_expect_success 'verify cache-size=1021' ' - rm -f trash/cache/* && - sed -i -e "s/cache-size=1$/cache-size=1021/" trash/cgitrc && + rm -f cache/* && + sed -e "s/cache-size=1$/cache-size=1021/" cgitrc >cgitrc.tmp && + mv -f cgitrc.tmp cgitrc && cgit_url "" && cgit_url "foo" && cgit_url "foo/refs" && @@ -61,7 +65,14 @@ run_test 'verify cache-size=1021' ' cgit_url "bar/log" && cgit_url "bar/diff" && cgit_url "bar/patch" && - test 13 -eq $(ls trash/cache | wc -l) + ls cache >output && + test_line_count = 13 output && + cgit_url "foo/ls_cache" >output.full && + strip_headers <output.full >output && + test_line_count = 13 output && + # Check that ls_cache output is cached correctly + cgit_url "foo/ls_cache" >output.second && + test_cmp output.full output.second ' -tests_done +test_done diff --git a/tests/t0101-index.sh b/tests/t0101-index.sh index 573a351..82ef9b0 100755 --- a/tests/t0101-index.sh +++ b/tests/t0101-index.sh @@ -1,18 +1,17 @@ #!/bin/sh +test_description='Check content on index page' . ./setup.sh -prepare_tests "Check content on index page" +test_expect_success 'generate index page' 'cgit_url "" >tmp' +test_expect_success 'find foo repo' 'grep "foo" tmp' +test_expect_success 'find foo description' 'grep "\[no description\]" tmp' +test_expect_success 'find bar repo' 'grep "bar" tmp' +test_expect_success 'find bar description' 'grep "the bar repo" tmp' +test_expect_success 'find foo+bar repo' 'grep ">foo+bar<" tmp' +test_expect_success 'verify foo+bar link' 'grep "/foo+bar/" tmp' +test_expect_success 'verify "with%20space" link' 'grep "/with%20space/" tmp' +test_expect_success 'no tree-link' '! grep "foo/tree" tmp' +test_expect_success 'no log-link' '! grep "foo/log" tmp' -run_test 'generate index page' 'cgit_url "" >trash/tmp' -run_test 'find foo repo' 'grep -e "foo" trash/tmp' -run_test 'find foo description' 'grep -e "\[no description\]" trash/tmp' -run_test 'find bar repo' 'grep -e "bar" trash/tmp' -run_test 'find bar description' 'grep -e "the bar repo" trash/tmp' -run_test 'find foo+bar repo' 'grep -e ">foo+bar<" trash/tmp' -run_test 'verify foo+bar link' 'grep -e "/foo+bar/" trash/tmp' -run_test 'verify "with%20space" link' 'grep -e "/with%20space/" trash/tmp' -run_test 'no tree-link' '! grep -e "foo/tree" trash/tmp' -run_test 'no log-link' '! grep -e "foo/log" trash/tmp' - -tests_done +test_done diff --git a/tests/t0102-summary.sh b/tests/t0102-summary.sh index f299c5a..b8864cb 100755 --- a/tests/t0102-summary.sh +++ b/tests/t0102-summary.sh @@ -1,26 +1,25 @@ #!/bin/sh +test_description='Check content on summary page' . ./setup.sh -prepare_tests "Check content on summary page" - -run_test 'generate foo summary' 'cgit_url "foo" >trash/tmp' -run_test 'find commit 1' 'grep -e "commit 1" trash/tmp' -run_test 'find commit 5' 'grep -e "commit 5" trash/tmp' -run_test 'find branch master' 'grep -e "master" trash/tmp' -run_test 'no tags' '! grep -e "tags" trash/tmp' -run_test 'clone-url expanded correctly' ' - grep -e "git://example.org/foo.git" trash/tmp +test_expect_success 'generate foo summary' 'cgit_url "foo" >tmp' +test_expect_success 'find commit 1' 'grep "commit 1" tmp' +test_expect_success 'find commit 5' 'grep "commit 5" tmp' +test_expect_success 'find branch master' 'grep "master" tmp' +test_expect_success 'no tags' '! grep "tags" tmp' +test_expect_success 'clone-url expanded correctly' ' + grep "git://example.org/foo.git" tmp ' -run_test 'generate bar summary' 'cgit_url "bar" >trash/tmp' -run_test 'no commit 45' '! grep -e "commit 45" trash/tmp' -run_test 'find commit 46' 'grep -e "commit 46" trash/tmp' -run_test 'find commit 50' 'grep -e "commit 50" trash/tmp' -run_test 'find branch master' 'grep -e "master" trash/tmp' -run_test 'no tags' '! grep -e "tags" trash/tmp' -run_test 'clone-url expanded correctly' ' - grep -e "git://example.org/bar.git" trash/tmp +test_expect_success 'generate bar summary' 'cgit_url "bar" >tmp' +test_expect_success 'no commit 45' '! grep "commit 45" tmp' +test_expect_success 'find commit 46' 'grep "commit 46" tmp' +test_expect_success 'find commit 50' 'grep "commit 50" tmp' +test_expect_success 'find branch master' 'grep "master" tmp' +test_expect_success 'no tags' '! grep "tags" tmp' +test_expect_success 'clone-url expanded correctly' ' + grep "git://example.org/bar.git" tmp ' -tests_done +test_done diff --git a/tests/t0103-log.sh b/tests/t0103-log.sh index 75dd761..bdf1435 100755 --- a/tests/t0103-log.sh +++ b/tests/t0103-log.sh @@ -1,25 +1,24 @@ #!/bin/sh +test_description='Check content on log page' . ./setup.sh -prepare_tests "Check content on log page" +test_expect_success 'generate foo/log' 'cgit_url "foo/log" >tmp' +test_expect_success 'find commit 1' 'grep "commit 1" tmp' +test_expect_success 'find commit 5' 'grep "commit 5" tmp' -run_test 'generate foo/log' 'cgit_url "foo/log" >trash/tmp' -run_test 'find commit 1' 'grep -e "commit 1" trash/tmp' -run_test 'find commit 5' 'grep -e "commit 5" trash/tmp' +test_expect_success 'generate bar/log' 'cgit_url "bar/log" >tmp' +test_expect_success 'find commit 1' 'grep "commit 1" tmp' +test_expect_success 'find commit 50' 'grep "commit 50" tmp' -run_test 'generate bar/log' 'cgit_url "bar/log" >trash/tmp' -run_test 'find commit 1' 'grep -e "commit 1" trash/tmp' -run_test 'find commit 50' 'grep -e "commit 50" trash/tmp' - -run_test 'generate "with%20space/log?qt=grep&q=commit+1"' ' - cgit_url "with+space/log&qt=grep&q=commit+1" >trash/tmp +test_expect_success 'generate "with%20space/log?qt=grep&q=commit+1"' ' + cgit_url "with+space/log&qt=grep&q=commit+1" >tmp ' -run_test 'find commit 1' 'grep -e "commit 1" trash/tmp' -run_test 'find link with %20 in path' 'grep -e "/with%20space/log/?qt=grep" trash/tmp' -run_test 'find link with + in arg' 'grep -e "/log/?qt=grep&q=commit+1" trash/tmp' -run_test 'no links with space in path' '! grep -e "href=./with space/" trash/tmp' -run_test 'no links with space in arg' '! grep -e "q=commit 1" trash/tmp' -run_test 'commit 2 is not visible' '! grep -e "commit 2" trash/tmp' +test_expect_success 'find commit 1' 'grep "commit 1" tmp' +test_expect_success 'find link with %20 in path' 'grep "/with%20space/log/?qt=grep" tmp' +test_expect_success 'find link with + in arg' 'grep "/log/?qt=grep&q=commit+1" tmp' +test_expect_success 'no links with space in path' '! grep "href=./with space/" tmp' +test_expect_success 'no links with space in arg' '! grep "q=commit 1" tmp' +test_expect_success 'commit 2 is not visible' '! grep "commit 2" tmp' -tests_done +test_done diff --git a/tests/t0104-tree.sh b/tests/t0104-tree.sh index 2ce1251..2e140f5 100755 --- a/tests/t0104-tree.sh +++ b/tests/t0104-tree.sh @@ -1,33 +1,32 @@ #!/bin/sh +test_description='Check content on tree page' . ./setup.sh -prepare_tests "Check content on tree page" +test_expect_success 'generate bar/tree' 'cgit_url "bar/tree" >tmp' +test_expect_success 'find file-1' 'grep "file-1" tmp' +test_expect_success 'find file-50' 'grep "file-50" tmp' -run_test 'generate bar/tree' 'cgit_url "bar/tree" >trash/tmp' -run_test 'find file-1' 'grep -e "file-1" trash/tmp' -run_test 'find file-50' 'grep -e "file-50" trash/tmp' +test_expect_success 'generate bar/tree/file-50' 'cgit_url "bar/tree/file-50" >tmp' -run_test 'generate bar/tree/file-50' 'cgit_url "bar/tree/file-50" >trash/tmp' - -run_test 'find line 1' ' - grep -e "<a class=.no. id=.n1. name=.n1. href=.#n1.>1</a>" trash/tmp +test_expect_success 'find line 1' ' + grep "<a id=.n1. href=.#n1.>1</a>" tmp ' -run_test 'no line 2' ' - ! grep -e "<a class=.no. id=.n2. name=.n2. href=.#n2.>2</a>" trash/tmp +test_expect_success 'no line 2' ' + ! grep "<a id=.n2. href=.#n2.>2</a>" tmp ' -run_test 'generate foo+bar/tree' 'cgit_url "foo%2bbar/tree" >trash/tmp' +test_expect_success 'generate foo+bar/tree' 'cgit_url "foo%2bbar/tree" >tmp' -run_test 'verify a+b link' ' - grep -e "/foo+bar/tree/a+b" trash/tmp +test_expect_success 'verify a+b link' ' + grep "/foo+bar/tree/a+b" tmp ' -run_test 'generate foo+bar/tree?h=1+2' 'cgit_url "foo%2bbar/tree&h=1%2b2" >trash/tmp' +test_expect_success 'generate foo+bar/tree?h=1+2' 'cgit_url "foo%2bbar/tree&h=1%2b2" >tmp' -run_test 'verify a+b?h=1+2 link' ' - grep -e "/foo+bar/tree/a+b?h=1%2b2" trash/tmp +test_expect_success 'verify a+b?h=1+2 link' ' + grep "/foo+bar/tree/a+b?h=1%2b2" tmp ' -tests_done +test_done diff --git a/tests/t0105-commit.sh b/tests/t0105-commit.sh index ae794c8..1a12ee3 100755 --- a/tests/t0105-commit.sh +++ b/tests/t0105-commit.sh @@ -1,37 +1,36 @@ #!/bin/sh +test_description='Check content on commit page' . ./setup.sh -prepare_tests "Check content on commit page" +test_expect_success 'generate foo/commit' 'cgit_url "foo/commit" >tmp' +test_expect_success 'find tree link' 'grep "<a href=./foo/tree/.>" tmp' +test_expect_success 'find parent link' 'grep -E "<a href=./foo/commit/\?id=.+>" tmp' -run_test 'generate foo/commit' 'cgit_url "foo/commit" >trash/tmp' -run_test 'find tree link' 'grep -e "<a href=./foo/tree/.>" trash/tmp' -run_test 'find parent link' 'grep -E "<a href=./foo/commit/\?id=.+>" trash/tmp' - -run_test 'find commit subject' ' - grep -e "<div class=.commit-subject.>commit 5<" trash/tmp +test_expect_success 'find commit subject' ' + grep "<div class=.commit-subject.>commit 5<" tmp ' -run_test 'find commit msg' 'grep -e "<div class=.commit-msg.></div>" trash/tmp' -run_test 'find diffstat' 'grep -e "<table summary=.diffstat. class=.diffstat.>" trash/tmp' +test_expect_success 'find commit msg' 'grep "<div class=.commit-msg.></div>" tmp' +test_expect_success 'find diffstat' 'grep "<table summary=.diffstat. class=.diffstat.>" tmp' -run_test 'find diff summary' ' - grep -e "1 files changed, 1 insertions, 0 deletions" trash/tmp +test_expect_success 'find diff summary' ' + grep "1 files changed, 1 insertions, 0 deletions" tmp ' -run_test 'get root commit' ' - root=$(cd trash/repos/foo && git rev-list --reverse HEAD | head -1) && - cgit_url "foo/commit&id=$root" >trash/tmp && - grep "</html>" trash/tmp +test_expect_success 'get root commit' ' + root=$(cd repos/foo && git rev-list --reverse HEAD | head -1) && + cgit_url "foo/commit&id=$root" >tmp && + grep "</html>" tmp ' -run_test 'root commit contains diffstat' ' - grep "<a href=./foo/diff/file-1.id=[0-9a-f]\{40\}.>file-1</a>" trash/tmp +test_expect_success 'root commit contains diffstat' ' + grep "<a href=./foo/diff/file-1.id=[0-9a-f]\{40,64\}.>file-1</a>" tmp ' -run_test 'root commit contains diff' ' - grep ">diff --git a/file-1 b/file-1<" trash/tmp && - grep -e "<div class=.add.>+1</div>" trash/tmp +test_expect_success 'root commit contains diff' ' + grep ">diff --git a/file-1 b/file-1<" tmp && + grep "<div class=.add.>+1</div>" tmp ' -tests_done +test_done diff --git a/tests/t0106-diff.sh b/tests/t0106-diff.sh index e140bcc..1100596 100755 --- a/tests/t0106-diff.sh +++ b/tests/t0106-diff.sh @@ -1,20 +1,101 @@ #!/bin/sh +test_description='Check content on diff page' . ./setup.sh -prepare_tests "Check content on diff page" +test_expect_success 'generate foo/diff' 'cgit_url "foo/diff" >tmp' +test_expect_success 'find diff header' 'grep "a/file-5 b/file-5" tmp' +test_expect_success 'find blob link' 'grep "<a href=./foo/tree/file-5?id=" tmp' +test_expect_success 'find added file' 'grep "new file mode 100644" tmp' -run_test 'generate foo/diff' 'cgit_url "foo/diff" >trash/tmp' -run_test 'find diff header' 'grep -e "a/file-5 b/file-5" trash/tmp' -run_test 'find blob link' 'grep -e "<a href=./foo/tree/file-5?id=" trash/tmp' -run_test 'find added file' 'grep -e "new file mode 100644" trash/tmp' +test_expect_success 'find hunk header' ' + grep "<div class=.hunk.>@@ -0,0 +1 @@</div>" tmp +' + +test_expect_success 'find added line' ' + grep "<div class=.add.>+5</div>" tmp +' + +test_expect_success 'ref picker: from: select present' ' + grep "<select name=.id2." tmp +' + +test_expect_success 'ref picker: to: select present' ' + grep "<select name=.id." tmp +' + +test_expect_success 'ref picker: from: label present' ' + grep "from:" tmp +' + +test_expect_success 'ref picker: to: label present' ' + grep "to:" tmp +' + +test_expect_success 'ref pickers live in a separate refs panel' ' + grep "<b>diff refs</b>" tmp && + grep "<b>diff options</b>" tmp +' + +test_expect_success 'ref picker: master branch listed' ' + grep "master" tmp +' + +test_expect_success 'ref picker: auto-submit on change' ' + grep "onchange=.this.form.submit()." tmp +' + +test_expect_success 'flip link present' ' + grep "<a title=.swap from and to. class=.button. href=./foo/diff/?" tmp +' + +test_expect_success 'flip link swaps the default refs' ' + old=$(git --git-dir="$PWD/repos/foo/.git" rev-parse master~1) && + grep "/foo/diff/?id=$old&id2=master" tmp +' + +test_expect_success 'compare two refs: foo/diff?id=master&id2=HEAD' ' + cgit_query "url=foo/diff&id=master&id2=HEAD" >tmp +' + +test_expect_success 'diff with explicit refs shows diffstat' ' + grep "diffstat" tmp +' + +test_expect_success 'diff with oid2 parameter uses it for old ref' ' + cgit_query "url=foo/diff&id=master&id2=HEAD" >tmp && + grep "from:" tmp +' + +test_expect_success 'ref picker: to: shows master when id=master' ' + cgit_query "url=foo/diff&id=master" >tmp && + grep "master" tmp +' + +test_expect_success 'ref picker: from: empty when no id2' ' + cgit_query "url=foo/diff" >tmp && + grep "<select name=.id2." tmp +' + +test_expect_success 'compare initial commit with HEAD' ' + root=$(git --git-dir="$PWD/repos/foo/.git" rev-list --max-parents=0 HEAD) && + cgit_query "url=foo/diff&id=HEAD&id2=$root" >tmp +' + +test_expect_success 'diff with HEAD and root shows content' ' + grep "diffstat" tmp +' -run_test 'find hunk header' ' - grep -e "<div class=.hunk.>@@ -0,0 +1 @@</div>" trash/tmp +test_expect_success 'flip link swaps explicit refs' ' + cgit_query "url=foo/diff&id=master&id2=HEAD" >tmp && + new=$(git --git-dir="$PWD/repos/foo/.git" rev-parse HEAD) && + grep "/foo/diff/?id=$new&id2=master" tmp ' -run_test 'find added line' ' - grep -e "<div class=.add.>+5</div>" trash/tmp +test_expect_success 'flip link omits id for a diff against a root commit' ' + root=$(git --git-dir="$PWD/repos/foo/.git" rev-list --max-parents=0 HEAD) && + cgit_query "url=foo/diff&id=$root" >tmp && + grep "href=./foo/diff/?id2=$root." tmp ' -tests_done +test_done diff --git a/tests/t0107-snapshot.sh b/tests/t0107-snapshot.sh index 8ab4912..0811ec4 100755 --- a/tests/t0107-snapshot.sh +++ b/tests/t0107-snapshot.sh @@ -1,39 +1,205 @@ #!/bin/sh +test_description='Verify snapshot' . ./setup.sh -prepare_tests "Verify snapshot" +test_expect_success 'get foo/snapshot/master.tar.gz' ' + cgit_url "foo/snapshot/master.tar.gz" >tmp +' + +test_expect_success 'check html headers' ' + head -n 1 tmp | + grep "Content-Type: application/x-gzip" && -run_test 'get foo/snapshot/master.tar.gz' ' - cgit_url "foo/snapshot/master.tar.gz" >trash/tmp + head -n 2 tmp | + grep "Content-Disposition: inline; filename=.master.tar.gz." ' -run_test 'check html headers' ' - head -n 1 trash/tmp | - grep -e "Content-Type: application/x-gzip" && +test_expect_success 'strip off the header lines' ' + strip_headers <tmp >master.tar.gz +' + +test_expect_success 'verify gzip format' ' + gunzip --test master.tar.gz +' + +test_expect_success 'untar' ' + rm -rf master && + gzip -dc master.tar.gz | tar -xf - +' + +test_expect_success 'count files' ' + ls master/ >output && + test_line_count = 5 output +' + +test_expect_success 'verify untarred file-5' ' + grep "^5$" master/file-5 && + test_line_count = 1 master/file-5 +' + +if test -n "$(which lzip 2>/dev/null)"; then + test_set_prereq LZIP +else + say 'Skipping LZIP validation tests: lzip not found' +fi + +test_expect_success LZIP 'get foo/snapshot/master.tar.lz' ' + cgit_url "foo/snapshot/master.tar.lz" >tmp +' + +test_expect_success LZIP 'check html headers' ' + head -n 1 tmp | + grep "Content-Type: application/x-lzip" && + + head -n 2 tmp | + grep "Content-Disposition: inline; filename=.master.tar.lz." +' + +test_expect_success LZIP 'strip off the header lines' ' + strip_headers <tmp >master.tar.lz +' + +test_expect_success LZIP 'verify lzip format' ' + lzip --test master.tar.lz +' + +test_expect_success LZIP 'untar' ' + rm -rf master && + lzip -dc master.tar.lz | tar -xf - +' + +test_expect_success LZIP 'count files' ' + ls master/ >output && + test_line_count = 5 output +' + +test_expect_success LZIP 'verify untarred file-5' ' + grep "^5$" master/file-5 && + test_line_count = 1 master/file-5 +' + +if test -n "$(which xz 2>/dev/null)"; then + test_set_prereq XZ +else + say 'Skipping XZ validation tests: xz not found' +fi + +test_expect_success XZ 'get foo/snapshot/master.tar.xz' ' + cgit_url "foo/snapshot/master.tar.xz" >tmp +' + +test_expect_success XZ 'check html headers' ' + head -n 1 tmp | + grep "Content-Type: application/x-xz" && + + head -n 2 tmp | + grep "Content-Disposition: inline; filename=.master.tar.xz." +' - head -n 2 trash/tmp | - grep -e "Content-Disposition: inline; filename=.master.tar.gz." +test_expect_success XZ 'strip off the header lines' ' + strip_headers <tmp >master.tar.xz ' -run_test 'strip off the header lines' ' - tail -n +6 trash/tmp > trash/master.tar.gz +test_expect_success XZ 'verify xz format' ' + xz --test master.tar.xz +' + +test_expect_success XZ 'untar' ' + rm -rf master && + xz -dc master.tar.xz | tar -xf - +' + +test_expect_success XZ 'count files' ' + ls master/ >output && + test_line_count = 5 output +' + +test_expect_success XZ 'verify untarred file-5' ' + grep "^5$" master/file-5 && + test_line_count = 1 master/file-5 +' + +if test -n "$(which zstd 2>/dev/null)"; then + test_set_prereq ZSTD +else + say 'Skipping ZSTD validation tests: zstd not found' +fi + +test_expect_success ZSTD 'get foo/snapshot/master.tar.zst' ' + cgit_url "foo/snapshot/master.tar.zst" >tmp +' + +test_expect_success ZSTD 'check html headers' ' + head -n 1 tmp | + grep "Content-Type: application/x-zstd" && + + head -n 2 tmp | + grep "Content-Disposition: inline; filename=.master.tar.zst." +' + +test_expect_success ZSTD 'strip off the header lines' ' + strip_headers <tmp >master.tar.zst +' + +test_expect_success ZSTD 'verify zstd format' ' + zstd --test master.tar.zst +' + +test_expect_success ZSTD 'untar' ' + rm -rf master && + zstd -dc master.tar.zst | tar -xf - +' + +test_expect_success ZSTD 'count files' ' + ls master/ >output && + test_line_count = 5 output +' + +test_expect_success ZSTD 'verify untarred file-5' ' + grep "^5$" master/file-5 && + test_line_count = 1 master/file-5 +' + +test_expect_success 'get foo/snapshot/master.zip' ' + cgit_url "foo/snapshot/master.zip" >tmp +' + +test_expect_success 'check HTML headers (zip)' ' + head -n 1 tmp | + grep "Content-Type: application/x-zip" && + + head -n 2 tmp | + grep "Content-Disposition: inline; filename=.master.zip." +' + +test_expect_success 'strip off the header lines (zip)' ' + strip_headers <tmp >master.zip +' + +if test -n "$(which unzip 2>/dev/null)"; then + test_set_prereq UNZIP +else + say 'Skipping ZIP validation tests: unzip not found' +fi + +test_expect_success UNZIP 'verify zip format' ' + unzip -t master.zip ' -run_test 'verify gzip format' 'gunzip --test trash/master.tar.gz' -run_test 'untar' ' - rm -rf trash/master && - tar -xf trash/master.tar.gz -C trash +test_expect_success UNZIP 'unzip' ' + rm -rf master && + unzip master.zip ' -run_test 'count files' ' - c=$(ls -1 trash/master/ | wc -l) && - test $c = 5 +test_expect_success UNZIP 'count files (zip)' ' + ls master/ >output && + test_line_count = 5 output ' -run_test 'verify untarred file-5' ' - grep -e "^5$" trash/master/file-5 && - test $(cat trash/master/file-5 | wc -l) = 1 +test_expect_success UNZIP 'verify unzipped file-5' ' + grep "^5$" master/file-5 && + test_line_count = 1 master/file-5 ' -tests_done +test_done diff --git a/tests/t0108-patch.sh b/tests/t0108-patch.sh index 6ee70b3..013d680 100755 --- a/tests/t0108-patch.sh +++ b/tests/t0108-patch.sh @@ -1,39 +1,62 @@ #!/bin/sh +test_description='Check content on patch page' . ./setup.sh -prepare_tests "Check content on patch page" +test_expect_success 'generate foo/patch' ' + cgit_query "url=foo/patch" >tmp +' + +test_expect_success 'find `From:` line' ' + grep "^From: " tmp +' + +test_expect_success 'find `Date:` line' ' + grep "^Date: " tmp +' + +test_expect_success 'find `Subject:` line' ' + grep "^Subject: commit 5" tmp +' -run_test 'generate foo/patch' ' - cgit_query "url=foo/patch" >trash/tmp +test_expect_success 'find `cgit` signature' ' + tail -2 tmp | head -1 | grep "^cgit" ' -run_test 'find `From:` line' ' - grep -e "^From: " trash/tmp +test_expect_success 'compare with output of git-format-patch(1)' ' + CGIT_VERSION=$(sed -n "s/CGIT_VERSION = //p" ../../VERSION) && + git --git-dir="$PWD/repos/foo/.git" format-patch --subject-prefix="" --signature="cgit $CGIT_VERSION" --stdout HEAD^ >tmp2 && + strip_headers <tmp >tmp_ && + test_cmp tmp_ tmp2 ' -run_test 'find `Date:` line' ' - grep -e "^Date: " trash/tmp +test_expect_success 'find initial commit' ' + root=$(git --git-dir="$PWD/repos/foo/.git" rev-list --max-parents=0 HEAD) ' -run_test 'find `Subject:` line' ' - grep -e "^Subject: commit 5" trash/tmp +test_expect_success 'generate patch for initial commit' ' + cgit_query "url=foo/patch&id=$root" >tmp ' -run_test 'find `cgit` signature' ' - tail -1 trash/tmp | grep -e "^cgit" +test_expect_success 'find `cgit` signature' ' + tail -2 tmp | head -1 | grep "^cgit" ' -run_test 'find initial commit' ' - root=$(git --git-dir="$PWD/trash/repos/foo/.git" rev-list HEAD | tail -1) +test_expect_success 'generate patches for multiple commits' ' + id=$(git --git-dir="$PWD/repos/foo/.git" rev-parse HEAD) && + id2=$(git --git-dir="$PWD/repos/foo/.git" rev-parse HEAD~3) && + cgit_query "url=foo/patch&id=$id&id2=$id2" >tmp ' -run_test 'generate patch for initial commit' ' - cgit_query "url=foo/patch&id=$root" >trash/tmp +test_expect_success 'find `cgit` signature' ' + tail -2 tmp | head -1 | grep "^cgit" ' -run_test 'find `cgit` signature' ' - tail -1 trash/tmp | grep -e "^cgit" +test_expect_success 'compare with output of git-format-patch(1)' ' + CGIT_VERSION=$(sed -n "s/CGIT_VERSION = //p" ../../VERSION) && + git --git-dir="$PWD/repos/foo/.git" format-patch -N --subject-prefix="" --signature="cgit $CGIT_VERSION" --stdout HEAD~3..HEAD >tmp2 && + strip_headers <tmp >tmp_ && + test_cmp tmp_ tmp2 ' -tests_done +test_done diff --git a/tests/t0109-gitconfig.sh b/tests/t0109-gitconfig.sh new file mode 100755 index 0000000..189ef28 --- /dev/null +++ b/tests/t0109-gitconfig.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +test_description='Ensure that git does not access $HOME' +. ./setup.sh + +test -n "$(which strace 2>/dev/null)" || { + skip_all='Skipping access validation tests: strace not found' + test_done + exit +} + +strace true 2>/dev/null || { + skip_all='Skipping access validation tests: strace not functional' + test_done + exit +} + +test_no_home_access () { + non_existent_path="/path/to/some/place/that/does/not/possibly/exist" + while test -d "$non_existent_path"; do + non_existent_path="$non_existent_path/$(date +%N)" + done && + strace \ + -E HOME="$non_existent_path" \ + -E CGIT_CONFIG="$PWD/cgitrc" \ + -E QUERY_STRING="url=$1" \ + -e access -f -o strace.out cgit && + ! grep "$non_existent_path" strace.out +} + +test_no_home_access_success() { + test_expect_success "do not access \$HOME: $1" " + test_no_home_access '$1' + " +} + +test_no_home_access_success +test_no_home_access_success foo +test_no_home_access_success foo/refs +test_no_home_access_success foo/log +test_no_home_access_success foo/tree +test_no_home_access_success foo/tree/file-1 +test_no_home_access_success foo/commit +test_no_home_access_success foo/diff +test_no_home_access_success foo/patch +test_no_home_access_success foo/snapshot/master.tar.gz + +test_done diff --git a/tests/t0110-rawdiff.sh b/tests/t0110-rawdiff.sh new file mode 100755 index 0000000..66fa7d5 --- /dev/null +++ b/tests/t0110-rawdiff.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +test_description='Check content on rawdiff page' +. ./setup.sh + +test_expect_success 'generate foo/rawdiff' ' + cgit_query "url=foo/rawdiff" >tmp +' + +test_expect_success 'compare with output of git-diff(1)' ' + git --git-dir="$PWD/repos/foo/.git" diff HEAD^.. >tmp2 && + sed "1,4d" tmp >tmp_ && + cmp tmp_ tmp2 +' + +test_expect_success 'find initial commit' ' + root=$(git --git-dir="$PWD/repos/foo/.git" rev-list --max-parents=0 HEAD) +' + +test_expect_success 'generate diff for initial commit' ' + cgit_query "url=foo/rawdiff&id=$root" >tmp +' + +test_expect_success 'compare with output of git-diff-tree(1)' ' + git --git-dir="$PWD/repos/foo/.git" diff-tree -p --no-commit-id --root "$root" >tmp2 && + sed "1,4d" tmp >tmp_ && + cmp tmp_ tmp2 +' + +test_expect_success 'generate diff for multiple commits' ' + id=$(git --git-dir="$PWD/repos/foo/.git" rev-parse HEAD) && + id2=$(git --git-dir="$PWD/repos/foo/.git" rev-parse HEAD~3) && + cgit_query "url=foo/rawdiff&id=$id&id2=$id2" >tmp +' + +test_expect_success 'compare with output of git-diff(1)' ' + git --git-dir="$PWD/repos/foo/.git" diff HEAD~3..HEAD >tmp2 && + sed "1,4d" tmp >tmp_ && + cmp tmp_ tmp2 +' + +test_done diff --git a/tests/t0111-filter.sh b/tests/t0111-filter.sh new file mode 100755 index 0000000..2fdc366 --- /dev/null +++ b/tests/t0111-filter.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +test_description='Check filtered content' +. ./setup.sh + +prefixes="exec" +if [ $CGIT_HAS_LUA -eq 1 ]; then + prefixes="$prefixes lua" +fi + +for prefix in $prefixes +do + test_expect_success "generate filter-$prefix/tree/a%2bb" " + cgit_url 'filter-$prefix/tree/a%2bb' >tmp + " + + test_expect_success "check whether the $prefix source filter works" ' + grep "<code>a+b HELLO$" tmp + ' + + test_expect_success "generate filter-$prefix/about/" " + cgit_url 'filter-$prefix/about/' >tmp + " + + test_expect_success "check whether the $prefix about filter works" ' + grep "<div id='"'"'summary'"'"'>a+b HELLO$" tmp + ' + + test_expect_success "generate filter-$prefix/commit/" " + cgit_url 'filter-$prefix/commit/' >tmp + " + + test_expect_success "check whether the $prefix commit filter works" ' + grep "<div class='"'"'commit-subject'"'"'>ADD A+B" tmp + ' + + test_expect_success "check whether the $prefix email filter works for authors" ' + grep "<author@example.com> commit A U THOR <AUTHOR@EXAMPLE.COM>" tmp + ' + + test_expect_success "check whether the $prefix email filter works for committers" ' + grep "<committer@example.com> commit C O MITTER <COMMITTER@EXAMPLE.COM>" tmp + ' +done + +test_done diff --git a/tests/t0112-ci.sh b/tests/t0112-ci.sh new file mode 100644 index 0000000..33609d6 --- /dev/null +++ b/tests/t0112-ci.sh @@ -0,0 +1,127 @@ +#!/bin/sh + +test_description='Check content on ci page' +. ./setup.sh + +# The ci settings are only inherited by repositories which are declared +# after them, which is used below to get a repository with no ci url and +# one with a tag-only ci url. +cat >cgitrc.ci <<EOF +virtual-root=/ +cache-root=$PWD/cache +cache-size=0 +enable-filter-overrides=1 + +repo.url=tagonly +repo.path=$PWD/repos/foo/.git +repo.ci-tag-url=https://ci.example.org/tagonly/\$ref + +ci-branch-url=https://ci.example.org/job/\$slug/job/\$ref +ci-tag-url=https://ci.example.org/job/\$slug/view/tags/job/\$ref + +repo.url=foo +repo.path=$PWD/repos/foo/.git + +repo.url=sayauz/web.git +repo.path=$PWD/repos/foo/.git + +repo.url=override +repo.path=$PWD/repos/foo/.git +repo.ci-url=https://ci.example.org/override/\$repo/\$\$/\$ref + +repo.url=filtered +repo.path=$PWD/repos/foo/.git +repo.ci-filter=exec:$PWD/ci-filter.sh +EOF + +# Records its arguments and only accepts tags. +cat >ci-filter.sh <<EOF +#!/bin/sh +printf '%s|%s|%s\n' "\$1" "\$2" "\$3" >>"$PWD/ci-filter.log" +test "\$2" = tag +EOF +chmod +x ci-filter.sh + +git --git-dir="$PWD/repos/foo/.git" tag v0.17.3.2 master + +cgit_ci() +{ + CGIT_CONFIG="$PWD/cgitrc.ci" QUERY_STRING="url=$1" cgit +} + +test_expect_success 'redirect to the branch ci url' ' + cgit_ci "foo/ci&h=master" >tmp && + grep "^Status: 302 Found$" tmp && + grep "^Location: https://ci.example.org/job/foo/job/master$" tmp +' + +test_expect_success 'redirect to the tag ci url' ' + cgit_ci "foo/ci&h=v0.17.3.2" >tmp && + grep "^Status: 302 Found$" tmp && + grep "^Location: https://ci.example.org/job/foo/view/tags/job/v0.17.3.2$" tmp +' + +test_expect_success 'redirect to the default branch ci url' ' + cgit_ci "foo/ci" >tmp && + grep "^Location: https://ci.example.org/job/foo/job/master$" tmp +' + +test_expect_success '$slug strips ".git" and replaces slashes' ' + cgit_ci "sayauz/web.git/ci&h=v0.17.3.2" >tmp && + grep "^Location: https://ci.example.org/job/sayauz-web/view/tags/job/v0.17.3.2$" tmp +' + +test_expect_success 'repo.ci-url overrides and expands $repo and $$' ' + cgit_ci "override/ci&h=master" >tmp && + grep -F "Location: https://ci.example.org/override/override/\$/master" tmp +' + +test_expect_success 'repo.ci-tag-url does not apply to branches' ' + cgit_ci "tagonly/ci&h=v0.17.3.2" >tmp && + grep "^Location: https://ci.example.org/tagonly/v0.17.3.2$" tmp && + cgit_ci "tagonly/ci&h=master" >tmp && + grep "^Status: 404 Not found$" tmp +' + +test_expect_success 'find ci tab' ' + cgit_ci "foo/refs&h=master" >tmp && + grep "href=./foo/ci/.>ci</a>" tmp +' + +test_expect_success 'no ci tab without a ci url' ' + cgit_url "foo/refs" >tmp && + ! grep ">ci</a>" tmp +' + +test_expect_success 'ci filter accepts a tag' ' + rm -f ci-filter.log && + cgit_ci "filtered/ci&h=v0.17.3.2" >tmp && + grep "^Location: https://ci.example.org/job/filtered/view/tags/job/v0.17.3.2$" tmp && + echo "v0.17.3.2|tag|https://ci.example.org/job/filtered/view/tags/job/v0.17.3.2" >expected && + test_cmp expected ci-filter.log +' + +test_expect_success 'ci filter rejects a branch' ' + rm -f ci-filter.log && + cgit_ci "filtered/ci&h=master" >tmp && + grep "^Status: 404 Not found$" tmp && + echo "master|branch|https://ci.example.org/job/filtered/job/master" >expected && + test_cmp expected ci-filter.log +' + +test_expect_success "ci filter hides the tab and is consulted once" ' + rm -f ci-filter.log && + cgit_ci "filtered/refs&h=master" >tmp && + ! grep ">ci</a>" tmp && + test_line_count = 1 ci-filter.log && + cgit_ci "filtered/refs&h=v0.17.3.2" >tmp && + grep "href=./filtered/ci/?h=v0.17.3.2.>ci</a>" tmp +' + +test_expect_success 'ci filter is not consulted without a ci url' ' + rm -f ci-filter.log && + cgit_url "foo/refs" >tmp && + test_path_is_missing ci-filter.log +' + +test_done diff --git a/tests/t0113-ci-lua.sh b/tests/t0113-ci-lua.sh new file mode 100644 index 0000000..1e095b1 --- /dev/null +++ b/tests/t0113-ci-lua.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +test_description='Check ci filter written in Lua' +. ./setup.sh + +if test $CGIT_HAS_LUA -ne 1 +then + skip_all='Skipping Lua ci filter tests: Lua support not compiled in' + test_done + exit +fi + +cat >cgitrc.cilua <<EOF +virtual-root=/ +cache-root=$PWD/cache +cache-size=0 + +ci-url=https://ci.example.org/job/\$slug/job/\$ref +ci-filter=lua:$PWD/ci-filter.lua + +repo.url=foo +repo.path=$PWD/repos/foo/.git +EOF + +# Accepts tags only, and records its arguments. +cat >ci-filter.lua <<EOF +function filter_open(ref, refkind, url) + local log = io.open("$PWD/ci-filter.log", "a") + log:write(ref .. "|" .. refkind .. "|" .. url .. "\n") + log:close() + accepted = (refkind == "tag") +end + +function filter_write(buffer) +end + +function filter_close() + if accepted then + return 0 + end + return 1 +end +EOF + +git --git-dir="$PWD/repos/foo/.git" tag v1.0 master + +cgit_ci() +{ + CGIT_CONFIG="$PWD/cgitrc.cilua" QUERY_STRING="url=$1" cgit +} + +test_expect_success 'Lua ci filter accepts a tag' ' + rm -f ci-filter.log && + cgit_ci "foo/ci&h=v1.0" >tmp && + grep "^Location: https://ci.example.org/job/foo/job/v1.0$" tmp && + echo "v1.0|tag|https://ci.example.org/job/foo/job/v1.0" >expected && + test_cmp expected ci-filter.log +' + +test_expect_success 'Lua ci filter rejects a branch' ' + cgit_ci "foo/ci&h=master" >tmp && + grep "^Status: 404 Not found$" tmp +' + +test_expect_success 'Lua ci filter controls the tab' ' + cgit_ci "foo/refs&h=v1.0" >tmp && + grep "href=./foo/ci/?h=v1.0.>ci</a>" tmp && + cgit_ci "foo/refs&h=master" >tmp && + ! grep ">ci</a>" tmp +' + +test_expect_success 'page is still rendered correctly around the filter' ' + cgit_ci "foo/refs&h=v1.0" >tmp && + grep "</html>" tmp && + ! grep "|tag|" tmp +' + +test_done diff --git a/tests/t0114-broken-repo.sh b/tests/t0114-broken-repo.sh new file mode 100644 index 0000000..61367e6 --- /dev/null +++ b/tests/t0114-broken-repo.sh @@ -0,0 +1,71 @@ +#!/bin/sh + +test_description='Check that a misconfigured repo.path is reported' +. ./setup.sh + +mkdir -p plaindir + +cat >cgitrc.broken <<EOF +virtual-root=/ +cache-root=$PWD/cache +cache-size=0 + +ci-branch-url=https://ci.example.org/job/\$slug/job/\$ref + +repo.url=missing +repo.path=$PWD/no/such/repo.git + +repo.url=notarepo +repo.path=$PWD/plaindir +EOF + +# cgit used to spin forever on these requests, so give it a deadline and +# report a failure rather than hanging the test suite. +cgit_broken() +{ + CGIT_CONFIG="$PWD/cgitrc.broken" QUERY_STRING="url=$1" perl -e ' + my $pid = fork(); + if ($pid == 0) { + exec("cgit") or die "exec: $!"; + } + eval { + local $SIG{ALRM} = sub { die "timeout\n" }; + alarm(20); + waitpid($pid, 0); + alarm(0); + }; + if ($@) { + kill "KILL", $pid; + print STDERR "cgit did not terminate\n"; + exit 1; + } + ' </dev/null +} + +test_expect_success 'report a repo.path that does not exist' ' + cgit_broken "missing/&h=master" >tmp && + grep "Failed to open missing" tmp +' + +test_expect_success 'report a repo.path that is not a repository' ' + cgit_broken "notarepo/&h=master" >tmp && + grep "Failed to open notarepo" tmp +' + +test_expect_success 'report an unknown page for a broken repo' ' + cgit_broken "missing/nosuchpage/&h=master" >tmp && + grep "^Status: 404 Not found$" tmp && + grep "Invalid request" tmp +' + +test_expect_success 'no ci tab for a broken repo' ' + cgit_broken "missing/nosuchpage/&h=master" >tmp && + ! grep ">ci</a>" tmp +' + +test_expect_success 'report a broken repo on the ci page' ' + cgit_broken "missing/ci/&h=master" >tmp && + grep "Failed to open missing" tmp +' + +test_done diff --git a/tests/valgrind/bin/cgit b/tests/valgrind/bin/cgit new file mode 100755 index 0000000..dcdfbe5 --- /dev/null +++ b/tests/valgrind/bin/cgit @@ -0,0 +1,12 @@ +#!/bin/sh + +# Note that we currently use Git's suppression file and there are variables +# $GIT_VALGRIND and $CGIT_VALGRIND which point to different places. +exec valgrind -q --error-exitcode=126 \ + --suppressions="$GIT_VALGRIND/default.supp" \ + --gen-suppressions=all \ + --leak-check=no \ + --track-origins=yes \ + --log-fd=4 \ + --input-fd=4 \ + "$CGIT_VALGRIND/../../cgit" "$@" |