git-commit-vandalism/t/t9501-gitweb-standalone-http-status.sh
John 'Warthog9' Hawley b62a1a98bc gitweb: Load checking
This changes slightly the behavior of gitweb, so that it verifies
that the box isn't inundated with before attempting to serve gitweb.
If the box is overloaded, it basically returns a 503 Server Unavailable
until the load falls below the defined threshold.  This helps dramatically
if you have a box that's I/O bound, reaches a certain load and you
don't want gitweb, the I/O hog that it is, increasing the pain the
server is already undergoing.

This behavior is controlled by $maxload configuration variable.
Default is a load of 300, which for most cases should never be hit.
Unset it (set it to undefined value, i.e. undef) to turn off checking.

Currently it requires that '/proc/loadavg' file exists, otherwise the
load check is bypassed (load is taken to be 0).  So platforms that do
not implement '/proc/loadavg' currently cannot use this feature
(provisions are included for additional checks to be added by others).

There is simple test in t/t9501-gitweb-standalone-http-status.sh to
check that it correctly returns "503 Service Unavailable" if load is
too high, and also if there are any Perl warnings or errors.

Signed-off-by: John 'Warthog9' Hawley <warthog9@kernel.org>
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-01-30 15:53:50 -08:00

138 lines
3.9 KiB
Bash
Executable File

#!/bin/sh
#
# Copyright (c) 2009 Mark Rada
#
test_description='gitweb as standalone script (http status tests).
This test runs gitweb (git web interface) as a CGI script from the
commandline, and checks that it returns the expected HTTP status
code and message.'
. ./gitweb-lib.sh
# ----------------------------------------------------------------------
# snapshot settings
test_commit \
'SnapshotTests' \
'i can has snapshot?'
cat >>gitweb_config.perl <<\EOF
$feature{'snapshot'}{'override'} = 0;
EOF
test_expect_success \
'snapshots: tgz only default format enabled' \
'gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tgz" &&
grep "Status: 200 OK" gitweb.output &&
gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tbz2" &&
grep "403 - Unsupported snapshot format" gitweb.output &&
gitweb_run "p=.git;a=snapshot;h=HEAD;sf=txz" &&
grep "403 - Snapshot format not allowed" gitweb.output &&
gitweb_run "p=.git;a=snapshot;h=HEAD;sf=zip" &&
grep "403 - Unsupported snapshot format" gitweb.output'
cat >>gitweb_config.perl <<\EOF
$feature{'snapshot'}{'default'} = ['tgz','tbz2','txz','zip'];
EOF
test_expect_success \
'snapshots: all enabled in default, use default disabled value' \
'gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tgz" &&
grep "Status: 200 OK" gitweb.output &&
gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tbz2" &&
grep "Status: 200 OK" gitweb.output &&
gitweb_run "p=.git;a=snapshot;h=HEAD;sf=txz" &&
grep "403 - Snapshot format not allowed" gitweb.output &&
gitweb_run "p=.git;a=snapshot;h=HEAD;sf=zip" &&
grep "Status: 200 OK" gitweb.output'
cat >>gitweb_config.perl <<\EOF
$known_snapshot_formats{'zip'}{'disabled'} = 1;
EOF
test_expect_success \
'snapshots: zip explicitly disabled' \
'gitweb_run "p=.git;a=snapshot;h=HEAD;sf=zip" &&
grep "403 - Snapshot format not allowed" gitweb.output'
test_debug 'cat gitweb.output'
cat >>gitweb_config.perl <<\EOF
$known_snapshot_formats{'tgz'}{'disabled'} = 0;
EOF
test_expect_success \
'snapshots: tgz explicitly enabled' \
'gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tgz" &&
grep "Status: 200 OK" gitweb.output'
test_debug 'cat gitweb.headers'
# ----------------------------------------------------------------------
# snapshot hash ids
test_expect_success 'snapshots: good tree-ish id' '
gitweb_run "p=.git;a=snapshot;h=master;sf=tgz" &&
grep "Status: 200 OK" gitweb.output
'
test_debug 'cat gitweb.headers'
test_expect_success 'snapshots: bad tree-ish id' '
gitweb_run "p=.git;a=snapshot;h=frizzumFrazzum;sf=tgz" &&
grep "404 - Object does not exist" gitweb.output
'
test_debug 'cat gitweb.output'
test_expect_success 'snapshots: bad tree-ish id (tagged object)' '
echo object > tag-object &&
git add tag-object &&
git commit -m "Object to be tagged" &&
git tag tagged-object `git hash-object tag-object` &&
gitweb_run "p=.git;a=snapshot;h=tagged-object;sf=tgz" &&
grep "400 - Object is not a tree-ish" gitweb.output
'
test_debug 'cat gitweb.output'
test_expect_success 'snapshots: good object id' '
ID=`git rev-parse --verify HEAD` &&
gitweb_run "p=.git;a=snapshot;h=$ID;sf=tgz" &&
grep "Status: 200 OK" gitweb.output
'
test_debug 'cat gitweb.headers'
test_expect_success 'snapshots: bad object id' '
gitweb_run "p=.git;a=snapshot;h=abcdef01234;sf=tgz" &&
grep "404 - Object does not exist" gitweb.output
'
test_debug 'cat gitweb.output'
# ----------------------------------------------------------------------
# load checking
# always hit the load limit
cat >>gitweb_config.perl <<\EOF
our $maxload = 0;
EOF
test_expect_success 'load checking: load too high (default action)' '
gitweb_run "p=.git" &&
grep "Status: 503 Service Unavailable" gitweb.headers &&
grep "503 - The load average on the server is too high" gitweb.body
'
test_debug 'cat gitweb.log' # just in case
test_debug 'cat gitweb.headers'
# turn off load checking
cat >>gitweb_config.perl <<\EOF
our $maxload = undef;
EOF
test_done