Diffstat (limited to 'tests')
| -rwxr-xr-x | tests/setup.sh | 14 | ||||
| -rwxr-xr-x | tests/t0001-validate-git-versions.sh | 4 | ||||
| -rwxr-xr-x | tests/t0105-commit.sh | 2 | ||||
| -rwxr-xr-x | tests/t0107-snapshot.sh | 53 | ||||
| -rwxr-xr-x | tests/t0109-gitconfig.sh | 2 | ||||
| -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 |
8 files changed, 335 insertions, 16 deletions
diff --git a/tests/setup.sh b/tests/setup.sh index 334cca6..8db810f 100755 --- a/tests/setup.sh +++ b/tests/setup.sh @@ -80,13 +80,17 @@ mkrepo() { git commit -m "commit $n" n=$(expr $n + 1) done - if test "$3" = "testplus" - then + case "$3" in + testplus) echo "hello" >a+b git add a+b git commit -m "add a+b" git branch "1+2" - fi + ;; + commit-graph) + git commit-graph write + ;; + esac ) } @@ -95,7 +99,7 @@ setup_repos() rm -rf cache mkdir -p cache mkrepo repos/foo 5 >/dev/null - mkrepo repos/bar 50 >/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 @@ -104,7 +108,7 @@ virtual-root=/ cache-root=$PWD/cache cache-size=1021 -snapshots=tar.gz tar.bz tar.lz tar.xz zip +snapshots=tar.gz tar.bz tar.lz tar.xz tar.zst zip enable-log-filecount=1 enable-log-linecount=1 summary-log=5 diff --git a/tests/t0001-validate-git-versions.sh b/tests/t0001-validate-git-versions.sh index 73bd32f..dd84fe3 100755 --- a/tests/t0001-validate-git-versions.sh +++ b/tests/t0001-validate-git-versions.sh @@ -33,10 +33,10 @@ test_expect_success 'test submodule version matches Makefile' ' else ( cd ../.. && - sm_sha1=$(git ls-files --stage -- git | + 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_sha1 + git describe --match "v[0-9]*" $sm_oid ) | sed -e "s/^v//" -e "s/-/./" >sm_version && test_cmp sm_version makefile_version fi diff --git a/tests/t0105-commit.sh b/tests/t0105-commit.sh index 9cdf55c..1a12ee3 100755 --- a/tests/t0105-commit.sh +++ b/tests/t0105-commit.sh @@ -25,7 +25,7 @@ test_expect_success 'get root commit' ' ' test_expect_success 'root commit contains diffstat' ' - grep "<a href=./foo/diff/file-1.id=[0-9a-f]\{40\}.>file-1</a>" tmp + grep "<a href=./foo/diff/file-1.id=[0-9a-f]\{40,64\}.>file-1</a>" tmp ' test_expect_success 'root commit contains diff' ' diff --git a/tests/t0107-snapshot.sh b/tests/t0107-snapshot.sh index 84995d1..0811ec4 100755 --- a/tests/t0107-snapshot.sh +++ b/tests/t0107-snapshot.sh @@ -25,7 +25,7 @@ test_expect_success 'verify gzip format' ' test_expect_success 'untar' ' rm -rf master && - tar -xzf master.tar.gz + gzip -dc master.tar.gz | tar -xf - ' test_expect_success 'count files' ' @@ -61,13 +61,12 @@ test_expect_success LZIP 'strip off the header lines' ' ' test_expect_success LZIP 'verify lzip format' ' - lzip --test master.tar.lz && - cp master.tar.lz /tmp/. + lzip --test master.tar.lz ' test_expect_success LZIP 'untar' ' rm -rf master && - tar --lzip -xf master.tar.lz + lzip -dc master.tar.lz | tar -xf - ' test_expect_success LZIP 'count files' ' @@ -103,13 +102,12 @@ test_expect_success XZ 'strip off the header lines' ' ' test_expect_success XZ 'verify xz format' ' - xz --test master.tar.xz && - cp master.tar.xz /tmp/. + xz --test master.tar.xz ' test_expect_success XZ 'untar' ' rm -rf master && - tar --xz -xf master.tar.xz + xz -dc master.tar.xz | tar -xf - ' test_expect_success XZ 'count files' ' @@ -122,6 +120,47 @@ test_expect_success XZ 'verify untarred 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 ' diff --git a/tests/t0109-gitconfig.sh b/tests/t0109-gitconfig.sh index 8cee75c..189ef28 100755 --- a/tests/t0109-gitconfig.sh +++ b/tests/t0109-gitconfig.sh @@ -25,7 +25,7 @@ test_no_home_access () { -E CGIT_CONFIG="$PWD/cgitrc" \ -E QUERY_STRING="url=$1" \ -e access -f -o strace.out cgit && - test_must_fail grep "$non_existent_path" strace.out + ! grep "$non_existent_path" strace.out } test_no_home_access_success() { 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 |