t/modules/alias.t (181 lines of code) (raw):

use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; use Apache::TestConfig (); use constant WINFU => Apache::TestConfig::WINFU(); ## ## mod_alias test ## ## redirect codes for Redirect testing ## my %redirect = ( perm => '301', perm2 => '301', temp => '302', temp2 => '302', seeother => '303', gone => '410', forbid => '403' ); ## RedirectMatch testing ## my %rm_body = ( p => '301', t => '302' ); my %rm_rc = ( s => '303', g => '410', f => '403' ); my %relative_redirects = ( "/redirect_relative/default" => "^http", # URL should be absolute "/redirect_relative/on" => "^/out-on", # URL should be relative "/redirect_relative/off" => "^http", # URL should be absolute "/redirect_relative/off/fail" => undef, # 500 due to invalid URL ); #XXX: find something that'll on other platforms (/bin/sh aint it) my $script_tests = WINFU ? 0 : 4 + have_min_apache_version("2.4.19"); my $tests = 12 + have_min_apache_version("2.4.19") * 10 + (keys %redirect) + (keys %rm_body) * (1 + have_min_apache_version("2.4.19")) * 10 + (keys %rm_rc) * (1 + have_min_apache_version("2.4.19")) * 10 + $script_tests; if (have_min_apache_version("2.5.1")) { $tests += (keys %relative_redirects)*2; } #LWP required to follow redirects plan tests => $tests, need need_module('alias'), need_lwp; ## simple alias ## t_debug "verifying simple aliases"; ok t_cmp((GET_RC "/alias/"), 200, "/alias/"); ## alias to a non-existant area ## ok t_cmp((GET_RC "/bogu/"), 404, "/bogu/"); t_debug "verifying alias match with /ali[0-9]."; for (my $i=0 ; $i <= 9 ; $i++) { ok t_cmp((GET_BODY "/ali$i"), $i, "/ali$i"); } if (have_min_apache_version("2.4.19")) { t_debug "verifying expression alias match with /expr/ali[0-9]."; for (my $i=0 ; $i <= 9 ; $i++) { ok t_cmp((GET_BODY "/expr/ali$i"), $i, "/ali$i"); } } my ($actual, $expected); foreach (sort keys %redirect) { ## make LWP not follow the redirect since we ## are just interested in the return code. local $Apache::TestRequest::RedirectOK = 0; $expected = $redirect{$_}; $actual = GET_RC "/$_"; ok t_cmp($actual, $expected, "/$_"); } print "verifying body of perm and temp redirect match\n"; foreach (sort keys %rm_body) { for (my $i=0 ; $i <= 9 ; $i++) { $expected = $i; $actual = GET_BODY "/$_$i"; ok t_cmp($actual, $expected, "/$_$i"); } } if (have_min_apache_version("2.4.19")) { print "verifying body of perm and temp redirect match with expression support\n"; foreach (sort keys %rm_body) { for (my $i=0 ; $i <= 9 ; $i++) { $expected = $i; $actual = GET_BODY "/expr/$_$i"; ok t_cmp($actual, $expected, "/$_$i"); } } } print "verifying return code of seeother and gone redirect match\n"; foreach (keys %rm_rc) { ## make LWP not follow the redirect since we ## are just interested in the return code. local $Apache::TestRequest::RedirectOK = 0; $expected = $rm_rc{$_}; for (my $i=0 ; $i <= 9 ; $i++) { $actual = GET_RC "$_$i"; ok t_cmp($actual, $expected, "$_$i"); } } if (have_min_apache_version("2.4.19")) { print "verifying return code of seeother and gone redirect match with expression support\n"; foreach (keys %rm_rc) { ## make LWP not follow the redirect since we ## are just interested in the return code. local $Apache::TestRequest::RedirectOK = 0; $expected = $rm_rc{$_}; for (my $i=0 ; $i <= 9 ; $i++) { $actual = GET_RC "/expr/$_$i"; ok t_cmp($actual, $expected, "$_$i"); } } } ## create a little cgi to test ScriptAlias and ScriptAliasMatch ## my $string = "this is a shell script cgi."; my $cgi =<<EOF; #!/bin/sh echo Content-type: text/plain echo echo $string EOF my $vars = Apache::Test::vars(); my $script = "$vars->{t_dir}/htdocs/modules/alias/script"; t_write_file($script,$cgi); chmod 0755, $script; ## if we get the script here it will be plain text ## t_debug "verifying /modules/alias/script is plain text"; ok t_cmp((GET_BODY "/modules/alias/script"), $cgi, "/modules/alias/script") unless WINFU; if (have_cgi) { ## here it should be the result of the executed cgi ## t_debug "verifying same file accessed at /cgi/script is executed code"; ok t_cmp((GET_BODY "/cgi/script"), "$string\n", "/cgi/script") unless WINFU; } else { skip "skipping test without CGI module"; } if (have_cgi) { ## with ScriptAliasMatch ## t_debug "verifying ScriptAliasMatch with /aliascgi-script"; ok t_cmp((GET_BODY "/aliascgi-script"), "$string\n", "/aliascgi-script") unless WINFU; } else { skip "skipping test without CGI module"; } if (have_min_apache_version("2.4.19")) { if (have_cgi) { ## with ScriptAlias in LocationMatch ## t_debug "verifying ScriptAlias in LocationMatch with /expr/aliascgi-script"; ok t_cmp((GET_BODY "/expr/aliascgi-script"), "$string\n", "/aliascgi-script") unless WINFU; } else { skip "skipping test without CGI module"; } } ## failure with ScriptAliasMatch ## t_debug "verifying bad script alias."; ok t_cmp((GET_RC "/aliascgi-nada"), 404, "/aliascgi-nada") unless WINFU; ## clean up ## t_rmtree("$vars->{t_logs}/mod_cgi.log"); if (have_min_apache_version("2.5.1")) { my ($path, $regex); while (($path, $regex) = each (%relative_redirects)) { local $Apache::TestRequest::RedirectOK = 0; my $r; $r = GET($path); if (defined($regex)) { ok t_cmp($r->code, "302"); ok t_cmp($r->header("Location"), qr/$regex/, "failure on $path"); } else { ok t_cmp($r->code, "500"); ok t_cmp($r->header("Location"), undef, "failure on $path"); } } }