summaryrefslogtreecommitdiff
path: root/tests/mod-access.t
diff options
context:
space:
mode:
authorJan Kneschke <jan@kneschke.de>2005-03-02 11:27:02 +0000
committerJan Kneschke <jan@kneschke.de>2005-03-02 11:27:02 +0000
commit40e8c6714aa1f371332fcd0b2999d16a432c85e1 (patch)
tree287498fd45066547ed7bfdf8cb11e5e501b561a2 /tests/mod-access.t
parent3caa67a1313b9d8c93ff75f36a0dd3cfd55e0b52 (diff)
downloadlighttpd-git-40e8c6714aa1f371332fcd0b2999d16a432c85e1.tar.gz
seperated the tests for each section and let run-tests.pl use Test::Harness
git-svn-id: svn://svn.lighttpd.net/lighttpd/trunk@72 152afb58-edef-0310-8abb-c4023f1b3aa9
Diffstat (limited to 'tests/mod-access.t')
-rwxr-xr-xtests/mod-access.t200
1 files changed, 200 insertions, 0 deletions
diff --git a/tests/mod-access.t b/tests/mod-access.t
new file mode 100755
index 00000000..8c978a89
--- /dev/null
+++ b/tests/mod-access.t
@@ -0,0 +1,200 @@
+#! /usr/bin/perl -w
+
+use strict;
+use IO::Socket;
+use Test::More tests => 3;
+
+my $basedir = (defined $ENV{'top_builddir'} ? $ENV{'top_builddir'} : '..');
+my $srcdir = (defined $ENV{'srcdir'} ? $ENV{'srcdir'} : '.');
+
+my $testname;
+my @request;
+my @response;
+my $configfile = $srcdir.'/lighttpd.conf';
+my $lighttpd_path = $basedir.'/src/lighttpd';
+my $pidfile = '/tmp/lighttpd/lighttpd.pid';
+my $pidoffile = '/tmp/lighttpd/pidof.pid';
+
+sub pidof {
+ my $prog = $_[0];
+
+ open F, "ps ax | grep $prog | awk '{ print \$1 }'|" or
+ open F, "ps -ef | grep $prog | awk '{ print \$2 }'|" or
+ return -1;
+
+ my $pid = <F>;
+ close F;
+
+ return $pid;
+}
+
+sub stop_proc {
+ open F, $pidfile or return -1;
+ my $pid = <F>;
+ close F;
+
+ kill('TERM',$pid) or return -1;
+ select(undef, undef, undef, 0.01);
+
+ return 0;
+}
+
+
+sub start_proc {
+ # kill old proc if necessary
+ stop_proc;
+
+ unlink($pidfile);
+ system($lighttpd_path." -f ".$configfile);
+
+ if (-e $pidfile) {
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+sub handle_http {
+ my $EOL = "\015\012";
+ my $BLANK = $EOL x 2;
+ my $port = 2048;
+ my $host = "127.0.0.1";
+
+ my $remote =
+ IO::Socket::INET->new(Proto => "tcp",
+ PeerAddr => $host,
+ PeerPort => $port)
+ or return -1;
+
+ $remote->autoflush(1);
+
+ foreach(@request) {
+ # pipeline requests
+ s/\r//g;
+ s/\n/$EOL/g;
+
+ print $remote $_.$BLANK;
+ }
+
+ my $lines = "";
+
+ # read everything
+ while(<$remote>) {
+ $lines .= $_;
+ }
+
+ close $remote;
+
+ my $href;
+ foreach $href (@response) {
+ # first line is always response header
+ my %resp_hdr;
+ my $resp_body;
+ my $resp_line;
+ my $conditions = $_;
+
+ for (my $ln = 0; defined $lines; $ln++) {
+ (my $line, $lines) = split($EOL, $lines, 2);
+
+ # header finished
+ last if(length($line) == 0);
+
+ if ($ln == 0) {
+ # response header
+ $resp_line = $line;
+ } else {
+ # response vars
+
+ if ($line =~ /^([^:]+):\s*(.+)$/) {
+ (my $h = $1) =~ tr/[A-Z]/[a-z]/;
+
+ $resp_hdr{$h} = $2;
+ } else {
+ return -1;
+ }
+ }
+ }
+
+ # check length
+ if (defined $resp_hdr{"content-length"}) {
+ ($resp_body, $lines) = split("^.".$resp_hdr{"content-length"}, $lines, 2);
+ } else {
+ $resp_body = $lines;
+ undef $lines;
+ }
+
+ # check conditions
+ if ($resp_line =~ /^(HTTP\/1\.[01]) ([0-9]{3}) .+$/) {
+ if ($href->{'HTTP-Protocol'} ne $1) {
+ diag(sprintf("proto failed: expected '%s', got '%s'\n", $href->{'HTTP-Protocol'}, $1));
+ return -1;
+ }
+ if ($href->{'HTTP-Status'} ne $2) {
+ diag(sprintf("status failed: expected '%s', got '%s'\n", $href->{'HTTP-Status'}, $2));
+ return -1;
+ }
+ } else {
+ return -1;
+ }
+
+ if (defined $href->{'HTTP-Content'}) {
+ if ($href->{'HTTP-Content'} ne $resp_body) {
+ diag(sprintf("body failed: expected '%s', got '%s'\n", $href->{'HTTP-Content'}, $resp_body));
+ return -1;
+ }
+ }
+
+ if (defined $href->{'-HTTP-Content'}) {
+ if (defined $resp_body && $resp_body ne '') {
+ diag(sprintf("body failed: expected empty body, got '%s'\n", $resp_body));
+ return -1;
+ }
+ }
+
+ foreach (keys %{ $href }) {
+ next if $_ eq 'HTTP-Protocol';
+ next if $_ eq 'HTTP-Status';
+ next if $_ eq 'HTTP-Content';
+ next if $_ eq '-HTTP-Content';
+
+ (my $k = $_) =~ tr/[A-Z]/[a-z]/;
+
+ my $no_val = 0;
+
+ if (substr($k, 0, 1) eq '+') {
+ $k = substr($k, 1);
+ $no_val = 1;
+
+ }
+
+ if (!defined $resp_hdr{$k}) {
+ diag(sprintf("required header '%s' is missing\n", $k));
+ return -1;
+ }
+
+ if ($no_val == 0 &&
+ $href->{$_} ne $resp_hdr{$k}) {
+ diag(sprintf("response-header failed: expected '%s', got '%s'\n", $href->{$_}, $resp_hdr{$k}));
+ return -1;
+ }
+ }
+ }
+
+ # we should have sucked up everything
+ return -1 if (defined $lines);
+
+ return 0;
+}
+
+ok(start_proc == 0, "Starting lighttpd") or die();
+
+
+@request = ( <<EOF
+GET /index.html~ HTTP/1.0
+EOF
+ );
+@response = ( { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 403 } );
+ok(handle_http == 0, 'forbid access to ...~');
+
+ok(stop_proc == 0, "Stopping lighttpd");
+