aboutsummaryrefslogtreecommitdiff
path: root/tests
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile6
-rw-r--r--tests/filters/dump.lua17
-rwxr-xr-xtests/filters/dump.sh4
-rwxr-xr-xtests/setup.sh92
-rwxr-xr-xtests/t0001-validate-git-versions.sh19
-rwxr-xr-xtests/t0010-validate-html.sh4
-rwxr-xr-xtests/t0020-validate-cache.sh17
-rwxr-xr-xtests/t0104-tree.sh4
-rwxr-xr-xtests/t0105-commit.sh2
-rwxr-xr-xtests/t0107-snapshot.sh143
-rwxr-xr-xtests/t0108-patch.sh30
-rwxr-xr-xtests/t0109-gitconfig.sh41
-rwxr-xr-xtests/t0110-rawdiff.sh42
-rwxr-xr-xtests/t0111-filter.sh46
-rwxr-xr-xtests/valgrind/bin/cgit12
15 files changed, 439 insertions, 40 deletions
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 81e7220..8db810f 100755
--- a/tests/setup.sh
+++ b/tests/setup.sh
@@ -15,12 +15,56 @@
# run_test 'repo index' 'cgit_url "/" | tidy -e'
# run_test 'repo summary' 'cgit_url "/foo" | tidy -e'
+# 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.
-PATH="$(pwd)/../..:$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
@@ -36,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
)
}
@@ -51,21 +99,23 @@ 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
cat >cgitrc <<EOF
virtual-root=/
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/repos/foo/.git
@@ -84,7 +134,29 @@ repo.desc=the foo+bar repo
repo.url=with space
repo.path=$PWD/repos/with space/.git
repo.desc=spaced repo
+
+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
+
+ 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()
@@ -97,4 +169,12 @@ cgit_url()
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
index 754046e..dd84fe3 100755
--- a/tests/t0001-validate-git-versions.sh
+++ b/tests/t0001-validate-git-versions.sh
@@ -1,5 +1,9 @@
#!/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
@@ -11,10 +15,15 @@ test_expect_success 'extract Git version from Makefile' '
}" ../../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[ ]*=[ ]*//" >git_version &&
- test_cmp git_version makefile_version
+ 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' '
@@ -24,11 +33,11 @@ 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
- ) | sed -e "s/^v//" >sm_version &&
+ 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/t0010-validate-html.sh b/tests/t0010-validate-html.sh
index 5bd0a25..ca08d69 100755
--- a/tests/t0010-validate-html.sh
+++ b/tests/t0010-validate-html.sh
@@ -8,8 +8,8 @@ test_url()
{
tidy_opt="-eq"
test -z "$NO_TIDY_WARNINGS" || tidy_opt+=" --show-warnings no"
- cgit_url "$1" >tidy-$test_count || return
- sed -ie "1,4d" tidy-$test_count || return
+ 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=$?
diff --git a/tests/t0020-validate-cache.sh b/tests/t0020-validate-cache.sh
index 1910b47..657765d 100755
--- a/tests/t0020-validate-cache.sh
+++ b/tests/t0020-validate-cache.sh
@@ -6,7 +6,8 @@ test_description='Validate cache'
test_expect_success 'verify cache-size=0' '
rm -f cache/* &&
- sed -i -e "s/cache-size=1021$/cache-size=0/" cgitrc &&
+ 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" &&
@@ -27,7 +28,8 @@ test_expect_success 'verify cache-size=0' '
test_expect_success 'verify cache-size=1' '
rm -f cache/* &&
- sed -i -e "s/cache-size=0$/cache-size=1/" cgitrc &&
+ 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" &&
@@ -48,7 +50,8 @@ test_expect_success 'verify cache-size=1' '
test_expect_success 'verify cache-size=1021' '
rm -f cache/* &&
- sed -i -e "s/cache-size=1$/cache-size=1021/" cgitrc &&
+ 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" &&
@@ -63,7 +66,13 @@ test_expect_success 'verify cache-size=1021' '
cgit_url "bar/diff" &&
cgit_url "bar/patch" &&
ls cache >output &&
- test_line_count = 13 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
'
test_done
diff --git a/tests/t0104-tree.sh b/tests/t0104-tree.sh
index 100b026..2e140f5 100755
--- a/tests/t0104-tree.sh
+++ b/tests/t0104-tree.sh
@@ -10,11 +10,11 @@ test_expect_success 'find file-50' 'grep "file-50" tmp'
test_expect_success 'generate bar/tree/file-50' 'cgit_url "bar/tree/file-50" >tmp'
test_expect_success 'find line 1' '
- grep "<a class=.no. id=.n1. name=.n1. href=.#n1.>1</a>" tmp
+ grep "<a id=.n1. href=.#n1.>1</a>" tmp
'
test_expect_success 'no line 2' '
- ! grep "<a class=.no. id=.n2. name=.n2. href=.#n2.>2</a>" tmp
+ ! grep "<a id=.n2. href=.#n2.>2</a>" tmp
'
test_expect_success 'generate foo+bar/tree' 'cgit_url "foo%2bbar/tree" >tmp'
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 7e6f5bf..0811ec4 100755
--- a/tests/t0107-snapshot.sh
+++ b/tests/t0107-snapshot.sh
@@ -16,7 +16,7 @@ test_expect_success 'check html headers' '
'
test_expect_success 'strip off the header lines' '
- tail -n +6 tmp > master.tar.gz
+ strip_headers <tmp >master.tar.gz
'
test_expect_success 'verify gzip format' '
@@ -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' '
@@ -38,6 +38,129 @@ test_expect_success 'verify untarred 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."
+'
+
+test_expect_success XZ 'strip off the header lines' '
+ strip_headers <tmp >master.tar.xz
+'
+
+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
'
@@ -51,24 +174,30 @@ test_expect_success 'check HTML headers (zip)' '
'
test_expect_success 'strip off the header lines (zip)' '
- tail -n +6 tmp >master.zip
+ strip_headers <tmp >master.zip
'
-test_expect_success 'verify zip format' '
+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
'
-test_expect_success 'unzip' '
+test_expect_success UNZIP 'unzip' '
rm -rf master &&
unzip master.zip
'
-test_expect_success 'count files (zip)' '
+test_expect_success UNZIP 'count files (zip)' '
ls master/ >output &&
test_line_count = 5 output
'
-test_expect_success 'verify unzipped file-5' '
+test_expect_success UNZIP 'verify unzipped file-5' '
grep "^5$" master/file-5 &&
test_line_count = 1 master/file-5
'
diff --git a/tests/t0108-patch.sh b/tests/t0108-patch.sh
index 3b5bae4..013d680 100755
--- a/tests/t0108-patch.sh
+++ b/tests/t0108-patch.sh
@@ -20,11 +20,18 @@ test_expect_success 'find `Subject:` line' '
'
test_expect_success 'find `cgit` signature' '
- tail -1 tmp | grep "^cgit"
+ tail -2 tmp | head -1 | grep "^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 --subject-prefix="" --signature="cgit $CGIT_VERSION" --stdout HEAD^ >tmp2 &&
+ strip_headers <tmp >tmp_ &&
+ test_cmp tmp_ tmp2
'
test_expect_success 'find initial commit' '
- root=$(git --git-dir="$PWD/repos/foo/.git" rev-list HEAD | tail -1)
+ root=$(git --git-dir="$PWD/repos/foo/.git" rev-list --max-parents=0 HEAD)
'
test_expect_success 'generate patch for initial commit' '
@@ -32,7 +39,24 @@ test_expect_success 'generate patch for initial commit' '
'
test_expect_success 'find `cgit` signature' '
- tail -1 tmp | grep "^cgit"
+ tail -2 tmp | head -1 | grep "^cgit"
+'
+
+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
+'
+
+test_expect_success 'find `cgit` signature' '
+ tail -2 tmp | head -1 | grep "^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
'
test_done
diff --git a/tests/t0109-gitconfig.sh b/tests/t0109-gitconfig.sh
index f64e691..189ef28 100755
--- a/tests/t0109-gitconfig.sh
+++ b/tests/t0109-gitconfig.sh
@@ -9,17 +9,40 @@ test -n "$(which strace 2>/dev/null)" || {
exit
}
-test_expect_success 'no access to $HOME' '
- non_existant_path="/path/to/some/place/that/does/not/possibly/exist"
- while test -d "$non_existant_path"; do
- non_existant_path="$non_existant_path/$(date +%N)"
- done
+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_existant_path" \
+ -E HOME="$non_existent_path" \
-E CGIT_CONFIG="$PWD/cgitrc" \
- -E QUERY_STRING="url=foo/commit" \
+ -E QUERY_STRING="url=$1" \
-e access -f -o strace.out cgit &&
- test_must_fail grep "$non_existant_path" strace.out
-'
+ ! 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 &LT;AUTHOR@EXAMPLE.COM&GT;" tmp
+ '
+
+ test_expect_success "check whether the $prefix email filter works for committers" '
+ grep "<committer@example.com> commit C O MITTER &LT;COMMITTER@EXAMPLE.COM&GT;" tmp
+ '
+done
+
+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" "$@"