tests/test-hgwebdir
author Alexandre Fayolle <alexandre.fayolle@logilab.fr>
Thu, 23 Sep 2010 11:41:27 +0200
branchstable
changeset 12391 ca5fd84d62c6
parent 12038 9617803b1acb
permissions -rwxr-xr-x
Fix memory leak when using hg commands over http repositories When using hg commands over an http repository in a long running process, a httphandler instance is leaked for each command, because of a loop handler.parent -> OpenerDirector and OpenerDirector.handlers -> handler which is not handled by Python's gc. Discussion on #mercurial concluded that removing the __del__ method solved the problem.

#!/bin/sh
# Tests some basic hgwebdir functionality. Tests setting up paths and
# collection, different forms of 404s and the subdirectory support.

mkdir webdir
cd webdir

hg init a
echo a > a/a
hg --cwd a ci -Ama -d'1 0'
# create a mercurial queue repository
hg --cwd a qinit --config extensions.hgext.mq= -c

hg init b
echo b > b/b
hg --cwd b ci -Amb -d'2 0'

# create a nested repository
cd b
hg init d
echo d > d/d
hg --cwd d ci -Amd -d'3 0'
cd ..

hg init c
echo c > c/c
hg --cwd c ci -Amc -d'3 0'

# create repository without .hg/store
hg init nostore
rm -R nostore/.hg/store

root=`pwd`
cd ..


cat > paths.conf <<EOF
[paths]
a=$root/a
b=$root/b
EOF

hg serve -p $HGPORT -d --pid-file=hg.pid --webdir-conf paths.conf \
    -A access-paths.log -E error-paths-1.log
cat hg.pid >> $DAEMON_PIDS

echo % should give a 404 - file does not exist
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/a/file/tip/bork?style=raw'

echo % should succeed
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/a/file/tip/a?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/b/file/tip/b?style=raw'

echo % should give a 404 - repo is not published
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/c/file/tip/c?style=raw'

echo % atom-log without basedir
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/a/atom-log' \
    | grep '<link' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

echo % rss-log without basedir
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/a/rss-log' \
    | grep '<guid' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

cat > paths.conf <<EOF
[paths]
t/a/=$root/a
b=$root/b
coll=$root/*
rcoll=$root/**
star=*
starstar=**
EOF

hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
    -A access-paths.log -E error-paths-2.log
cat hg.pid >> $DAEMON_PIDS

echo % should succeed, slashy names
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/?style=paper' \
	| sed "s/[0-9]\{1,\} seconds\{0,1\} ago/seconds ago/"
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/?style=paper' \
	| sed "s/[0-9]\{1,\} seconds\{0,1\} ago/seconds ago/"
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/a?style=atom' \
	| sed "s/http:\/\/[^/]*\//http:\/\/127.0.0.1\//"
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/a/?style=atom' \
	| sed "s/http:\/\/[^/]*\//http:\/\/127.0.0.1\//"
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/a/file/tip/a?style=raw'
# Test [paths] '*' extension
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/coll/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/coll/a/file/tip/a?style=raw'
#test [paths] '**' extension
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/rcoll/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/rcoll/b/d/file/tip/d?style=raw'


"$TESTDIR/killdaemons.py"
cat > paths.conf <<EOF
[paths]
t/a = $root/a
t/b = $root/b
c = $root/c
[web]
descend=false
EOF

hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
    -A access-paths.log -E error-paths-3.log
cat hg.pid >> $DAEMON_PIDS
echo % test descend = False
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/?style=raw'


"$TESTDIR/killdaemons.py"
cat > paths.conf <<EOF
[paths]
nostore = $root/nostore
inexistent = $root/inexistent
EOF

hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
    -A access-paths.log -E error-paths-4.log
cat hg.pid >> $DAEMON_PIDS
echo % test inexistent and inaccessible repo should be ignored silently
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/'


cat > collections.conf <<EOF
[collections]
$root=$root
EOF

hg serve --config web.baseurl=http://hg.example.com:8080/ -p $HGPORT2 -d \
    --pid-file=hg.pid --webdir-conf collections.conf \
    -A access-collections.log -E error-collections.log
cat hg.pid >> $DAEMON_PIDS

echo % collections: should succeed
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/a/file/tip/a?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/b/file/tip/b?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/c/file/tip/c?style=raw'

echo % atom-log with basedir /
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/a/atom-log' \
    | grep '<link' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

echo % rss-log with basedir /
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/a/rss-log' \
    | grep '<guid' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

"$TESTDIR/killdaemons.py"

hg serve --config web.baseurl=http://hg.example.com:8080/foo/ -p $HGPORT2 -d \
    --pid-file=hg.pid --webdir-conf collections.conf \
    -A access-collections-2.log -E error-collections-2.log
cat hg.pid >> $DAEMON_PIDS

echo % atom-log with basedir /foo/
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/a/atom-log' \
    | grep '<link' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

echo % rss-log with basedir /foo/
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/a/rss-log' \
    | grep '<guid' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

echo % paths errors 1
cat error-paths-1.log
echo % paths errors 2
cat error-paths-2.log
echo % paths errors 3
cat error-paths-3.log
echo % collections errors
cat error-collections.log
echo % collections errors 2
cat error-collections-2.log