summaryrefslogtreecommitdiffstats
path: root/debian/perl-framework/t/modules/cgi.t
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/perl-framework/t/modules/cgi.t288
1 files changed, 288 insertions, 0 deletions
diff --git a/debian/perl-framework/t/modules/cgi.t b/debian/perl-framework/t/modules/cgi.t
new file mode 100644
index 0000000..d191d8d
--- /dev/null
+++ b/debian/perl-framework/t/modules/cgi.t
@@ -0,0 +1,288 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Test;
+use Apache::TestRequest;
+use Apache::TestUtil;
+use File::stat;
+
+my $have_apache_2 = have_apache 2;
+my $have_apache_2050 = have_min_apache_version "2.0.50";
+
+my $script_log_length = 8192;
+if (have_module 'mod_cgi') {
+ $script_log_length = 40960;
+}
+
+## mod_cgi test
+##
+## extra.conf.in:
+## <IfModule mod_cgi.c>
+## AddHandler cgi-script .sh
+## AddHandler cgi-script .pl
+## ScriptLog logs/mod_cgi.log
+## <IfModule mod_cgi.c>
+## ScriptLogLength 40960
+## </IfModule mod_cgi>
+## <IfModule !mod_cgi.c>
+## ScriptLogLength 8192
+## </IfModule mod_cgi>
+## ScriptLogBuffer 256
+## <Directory @SERVERROOT@/htdocs/modules/cgi>
+## Options +ExecCGI
+## [some AcceptPathInfo stuff]
+## </Directory>
+## </IfModule>
+##
+
+my @post_content = (10, 99, 250, 255, 256, 257, 258, 1024);
+
+my %test = (
+ 'perl.pl' => {
+ 'rc' => 200,
+ 'expect' => 'perl cgi'
+ },
+ 'bogus-perl.pl' => {
+ 'rc' => 500,
+ 'expect' => 'none'
+ },
+ 'nph-test.pl' => {
+ 'rc' => 200,
+ 'expect' => 'ok'
+ },
+ 'sh.sh' => {
+ 'rc' => 200,
+ 'expect' => 'sh cgi'
+ },
+ 'bogus-sh.sh' => {
+ 'rc' => 500,
+ 'expect' => 'none'
+ },
+ 'acceptpathinfoon.sh' => {
+ 'rc' => 200,
+ 'expect' => ''
+ },
+ 'acceptpathinfoon.sh/foo' => {
+ 'rc' => 200,
+ 'expect' => '/foo'
+ },
+ 'acceptpathinfooff.sh' => {
+ 'rc' => 200,
+ 'expect' => ''
+ },
+ 'acceptpathinfooff.sh/foo' => {
+ 'rc' => 404,
+ 'expect' => 'none'
+ },
+ 'acceptpathinfodefault.sh' => {
+ 'rc' => 200,
+ 'expect' => ''
+ },
+ 'acceptpathinfodefault.sh/foo' => {
+ 'rc' => 200,
+ 'expect' => '/foo'
+ },
+ 'stderr1.pl' => {
+ 'rc' => 200,
+ 'expect' => 'this is stdout'
+ },
+ 'stderr2.pl' => {
+ 'rc' => 200,
+ 'expect' => 'this is also stdout'
+ },
+ 'stderr3.pl' => {
+ 'rc' => 200,
+ 'expect' => 'this is more stdout'
+ },
+ 'nph-stderr.pl' => {
+ 'rc' => 200,
+ 'expect' => 'this is nph-stdout'
+ },
+);
+
+#XXX: find something that'll on other platforms (/bin/sh aint it)
+if (Apache::TestConfig::WINFU()) {
+ delete @test{qw(sh.sh bogus-sh.sh)};
+}
+if (Apache::TestConfig::WINFU() || !$have_apache_2) {
+ delete @test{qw(acceptpathinfoon.sh acceptpathinfoon.sh/foo)};
+ delete @test{qw(acceptpathinfooff.sh acceptpathinfooff.sh/foo)};
+ delete @test{qw(acceptpathinfodefault.sh acceptpathinfodefault.sh/foo)};
+}
+
+# CGI stderr handling works in 2.0.50 and later only on Unixes.
+if (!$have_apache_2050 || Apache::TestConfig::WINFU()) {
+ delete @test{qw(stderr1.pl stderr2.pl stderr3.pl nph-stderr.pl)};
+}
+
+my $tests = ((keys %test) * 2) + (@post_content * 3) + 4;
+plan tests => $tests, \&need_cgi;
+
+my ($expected, $actual);
+my $path = "/modules/cgi";
+my $vars = Apache::Test::vars();
+my $t_logs = $vars->{t_logs};
+my $cgi_log = "$t_logs/mod_cgi.log";
+my ($bogus,$log_size,$stat) = (0,0,0);
+
+unlink $cgi_log if -e $cgi_log;
+
+foreach (sort keys %test) {
+ $expected = $test{$_}{rc};
+ $actual = GET_RC "$path/$_";
+ ok t_cmp($actual,
+ $expected,
+ "return code for $_"
+ );
+
+ if ($test{$_}{expect} ne 'none') {
+ $expected = $test{$_}{expect};
+ $actual = GET_BODY "$path/$_";
+ chomp $actual if $actual =~ /\n$/;
+
+ ok t_cmp($actual,
+ $expected,
+ "body for $_"
+ );
+ }
+ elsif ($_ !~ /^bogus/) {
+ print "# no body test for this one\n";
+ ok 1;
+ }
+
+ ## verify bogus cgi's get handled correctly
+ ## logging to the cgi log
+ if ($_ =~ /^bogus/) {
+ $bogus++;
+ if ($bogus == 1) {
+
+ ## make sure cgi log got created, get size.
+ if (-e $cgi_log) {
+ print "# cgi log created ok.\n";
+ ok 1;
+ $stat = stat($cgi_log);
+ $log_size = $$stat[7];
+ } else {
+ print "# error: cgi log not created!\n";
+ ok 0;
+ }
+ } else {
+
+ ## make sure log got bigger.
+ if (-e $cgi_log) {
+ $stat = stat($cgi_log);
+ print "# checking that log size ($$stat[7]) is bigger than it used to be ($log_size)\n";
+ ok ($$stat[7] > $log_size);
+ $log_size = $$stat[7];
+ } else {
+ print "# error: cgi log does not exist!\n";
+ ok 0;
+ }
+ }
+ }
+}
+
+## post lots of content to a bad cgi, so we can verify
+## ScriptLogBuffer is working.
+my $content = 0;
+foreach my $length (@post_content) {
+ $content++;
+ $expected = '500';
+ $actual = POST_RC "$path/bogus-perl.pl", content => "$content"x$length;
+
+ print "# posted content (length $length) to bogus-perl.pl\n";
+ print "# got return code of: $actual, expecting: $expected\n";
+ ## should get rc 500
+ ok ($actual eq $expected);
+
+ if (-e $cgi_log) {
+ ## cgi log should be bigger.
+ ## as long as it's under ScriptLogLength
+ $stat = stat($cgi_log);
+ if ($log_size < $script_log_length) {
+ print "# checking that log size ($$stat[7]) is greater than $log_size\n";
+ ok ($$stat[7] > $log_size);
+ } else {
+ ## should not fall in here at this point,
+ ## but just in case...
+ print "# verifying log did not increase in size...\n";
+ ok ($$stat[7] eq $log_size);
+ }
+ $log_size = $$stat[7];
+
+ ## there should be less than ScriptLogBuffer (256)
+ ## characters logged from the post content
+ open (LOG, $cgi_log) or die "died opening cgi log: $!";
+ my $multiplier = 256;
+ my $log;
+ {
+ local $/;
+ $log = <LOG>;
+ }
+ close (LOG);
+ $multiplier = $length unless $length > $multiplier;
+ print "# verifying that logged content is $multiplier characters\n";
+ if ($log =~ /^(?:$content){$multiplier}\n?$/m) {
+ ok 1;
+ }
+ else {
+ $log =~ s{^}{# }m;
+ print "# no log line found with $multiplier '$content' characters\n";
+ print "# log is:\n'$log'\n";
+ ok 0;
+ }
+ } else {
+ ## log does not exist ##
+ print "# cgi log does not exist, test fails.\n";
+ ok 0;
+ }
+}
+
+## make sure cgi log does not
+## keep logging after it is bigger
+## than ScriptLogLength
+for (my $i=1 ; $i<=40 ; $i++) {
+
+ ## get out if log does not exist ##
+ last unless -e $cgi_log;
+
+ ## request the 1k bad cgi
+ ## (1k of data logged per request)
+ GET_RC "$path/bogus1k.pl";
+
+ ## when log goes over max size stop making requests
+ $stat = stat($cgi_log);
+ $log_size = $$stat[7];
+ last if ($log_size > $script_log_length);
+
+}
+## make sure its over (or equal) our ScriptLogLength
+print "# verifying log is greater than $script_log_length bytes.\n";
+ok ($log_size >= $script_log_length);
+
+## make sure it does not grow now.
+GET_RC "$path/bogus1k.pl";
+print "# verifying log did not grow after making bogus request.\n";
+if (-e $cgi_log) {
+ $stat = stat($cgi_log);
+ ok ($log_size eq $$stat[7]);
+} else {
+ print "# log does not exist!\n";
+ ok 0;
+}
+
+GET_RC "$path/bogus-perl.pl";
+print "# verifying log did not grow after making another bogus request.\n";
+if (-e $cgi_log) {
+ $stat = stat($cgi_log);
+ ok ($log_size eq $$stat[7]);
+} else {
+ print "# log does not exist!\n";
+ ok 0;
+}
+
+print "# checking that HEAD $path/perl.pl returns 200.\n";
+ok HEAD_RC("$path/perl.pl") == 200;
+
+## clean up
+unlink $cgi_log;