richter 00/07/04 14:47:06
Modified: . Tag: Embperl2 test.pl
Log:
Embperl 2
Revision Changes Path
No revision
No revision
1.57.2.32 +1278 -1278embperl/test.pl
Index: test.pl
===================================================================
RCS file: /home/cvs/embperl/test.pl,v
retrieving revision 1.57.2.31
retrieving revision 1.57.2.32
diff -u -r1.57.2.31 -r1.57.2.32
--- test.pl 2000/07/02 19:18:49 1.57.2.31
+++ test.pl 2000/07/04 21:47:06 1.57.2.32
@@ -1,1278 +1,1278 @@
-#!/usr/bin/perl --
-# Before `make install' is performed this script should be runnable with
-# `make test'. After `make install' it should work as `perl test.pl'
-
-
-@tests = (
- 'ascii',
-# 'tmp/header.htm',
- 'pure.htm',
-## 'plainlong.htm',
-## 'plainlong.htm',
-## 'plainlong.htm',
-## 'plainlong.htm',
- 'plain.htm',
- 'plain.htm',
- 'plain.htm',
- 'plainblock.htm',
- 'plainblock.htm',
- 'error.htm???7',
- 'error.htm???7',
- 'error.htm???7',
- 'errormismatch.htm???1',
- 'errormismatchcmd.htm???1',
- 'unclosed.htm???1',
-# 'errorright.htm???1',
- 'notfound.htm???1',
- 'notallow.xhtm???1',
-## 'noerr/noerrpage.htm???6?2',
-## 'errdoc/errdoc.htm???8?262144',
-## 'rawinput/rawinput.htm????16',
- 'var.htm',
- 'varerr.htm???-1',
-## 'varerr.htm???2',
- 'escape.htm',
- 'escape.htm',
-## 'spaces.htm',
- 'tagscan.htm',
- 'tagscan.htm??1',
- 'if.htm',
- 'ifperl.htm',
-
'loop.htm?erstes=Hallo&zweites=Leer+zeichen&drittes=%21%22%23%2a%2B&erstes=Wert2',
-
'loop.htm?erstes=Hallo&zweites=Leer+zeichen&drittes=%21%22%23%2a%2B&erstes=Wert2',
-
'loopperl.htm?erstes=Hallo&zweites=Leer+zeichen&drittes=%21%22%23&erstes=Wert2',
- 'table.htm',
- 'table.htm??1',
- 'lists.htm?sel=2&SEL1=B&SEL3=D&SEL4=cc',
- 'lists.htm?sel=2&SEL1=B&SEL3=D&SEL4=cc',
- 'mix.htm',
-## 'nesting.htm',
- 'object.htm',
-## 'discard.htm???12',
-
'input.htm?feld5=Wert5&feld6=Wert6&feld7=Wert7&feld8=Wert8&cb5=cbv5&cb6=cbv6&cb7=cbv7&cb8=cbv8&cb9=ncbv9&cb10=ncbv10&cb11=ncbv11&mult=Wert3&mult=Wert6&esc=a<b&escmult=a>b&escmult=Wert3',
- 'hidden.htm?feld1=Wert1&feld2=Wert2&feld3=Wert3&feld4=Wert4',
- 'java.htm',
- 'inputjava.htm',
- 'post.htm',
- 'upload.htm?multval=A&multval=B&multval=C&single=S',
- 'reqrec.htm',
- 'reqrec.htm',
- 'rawinput/include.htm????16',
- 'includeerr1.htm???1',
- 'includeerr2.htm???1',
- 'registry/Execute.htm',
-## 'registry/errpage.htm???16',
- 'registry/tied.htm???3',
- 'registry/tied.htm???3',
-## 'callsub.htm',
-## 'callsub.htm',
-## 'importsub.htm',
-## 'importsub.htm',
-## 'importsub2.htm',
-## 'importmodule.htm',
-## 'recursexec.htm',
- 'nph/div.htm????64',
-## 'nph/npherr.htm???8?64',
- 'nph/nphinc.htm????64',
- 'sub.htm',
- 'sub.htm',
-## 'exit.htm',
-## 'exit2.htm',
-## 'exit3.htm',
- 'chdir.htm?a=1&b=2&c=&d=&f=5&g&h=7&=8&=',
- 'chdir.htm?a=1&b=2&c=&d=&f=5&g&h=7&=8&=',
- 'allform/allform.htm?a=1&b=2&c=&d=&f=5&g&h=7&=8&=???8192',
-## 'stdout/stdout.htm????16384',
- 'nochdir/nochdir.htm?a=1&b=2???384',
- 'match/div.htm',
- 'match/div.asc',
-## 'http.htm',
- 'div.htm',
- 'taint.htm???1',
- 'ofunc/div.htm',
-## 'safe/safe.htm???-1?4',
-## 'safe/safe.htm???-1?4',
-## 'safe/safe.htm???-1?4',
-## 'opmask/opmask.htm???-1?12?TEST',
-## 'opmask/opmasktrap.htm???2?12?TEST',
- 'mdatsess.htm?cnt=0',
- 'setsess.htm?a=1',
- 'mdatsess.htm?cnt=1',
- 'getnosess.htm?nocookie=2',
- 'mdatsess.htm?cnt=2',
- 'getsess.htm',
- 'mdatsess.htm?cnt=3',
- 'execgetsess.htm',
- 'clearsess.htm',
- 'EmbperlObject/epopage1.htm',
-## 'EmbperlObject/sub/epopage2.htm',
- ) ;
-
-
-# avoid some warnings:
-
-use vars qw ($httpconfsrc $httpconf $EPPORT $EPPORT2 *SAVEERR *ERR $EPHTTPDDLL
$EPSTARTUP $EPDEBUG
- $EPSESSIONDS $EPSESSIONCLASS $EPSESSIONVERSION
- $opt_offline $opt_ep1 $opt_cgi $opt_modperl $opt_execute $opt_nokill
$opt_loop
- $opt_multchild $opt_memcheck $opt_exitonmem $opt_exitonsv $opt_config
$opt_nostart $opt_uniquefn
- $opt_quite $opt_ignoreerror $opt_tests $opt_blib $opt_help
$opt_dbgbreak $opt_finderr) ;
-
- {
- local $^W = 0 ;
- eval " use Win32::Process; " ;
- $win32loaderr = $@ ;
- eval " use Win32; " ;
- $win32loaderr ||= $@ ;
- }
-
-BEGIN
- {
- $fatal = 1 ;
- $^W = 1 ;
- $| = 1;
-
- if ($ARGV[0] eq '--testlib')
- {
- eval 'use ExtUtils::testlib' ;
- shift @ARGV ;
- $opt_testlib = 1 ;
- }
-
- #### install handler which kill httpd when terminating ####
-
- $SIG{__DIE__} = sub {
- return unless $_[0] =~ /^\*\*\*/ ;
- return if ($opt_nokill) ;
- if ($EPWIN32)
- {
- $HttpdObj->Kill(-1) if ($HttpdObj) ;
- }
- else
- {
- system "kill `cat $tmppath/httpd.pid` 2> /dev/null" if ($EPHTTPD ne '') ;
- }
- } ;
-
- print "\nloading... ";
-
-
- $defaultdebug = 0x1f85ffd ;
- #$defaultdebug = 1 ;
-
- #### setup paths #####
-
- $inpath = 'test/html' ;
- $tmppath = 'test/tmp' ;
- $cmppath = 'test/cmp' ;
-
- $logfile = "$tmppath/test.log" ;
-
- $ENV{EMBPERL_LOG} = $logfile ;
- $ENV{EMBPERL_DEBUG} = $defaultdebug ;
-
- unlink ($logfile) ;
- }
-
-END
- {
- print "\nTest terminated with fatal error\n" if ($fatal) ;
- system "kill `cat $tmppath/httpd.pid` 2> /dev/null" if ($EPHTTPD ne '' &&
!$opt_nokill && !$EPWIN32) ;
- $? = $fatal || $err ;
- }
-
-
-use Getopt::Long ;
-
-@ARGVSAVE = @ARGV ;
-
-Getopt::Long::Configure ('bundling') ;
-$ret = GetOptions ("offline|o", "ep1|1", "cgi|c", "modperl|httpd|h", "execute|e",
"nokill|r", "loop|l:i",
- "multchild|m", "memcheck|v", "exitonmem|g", "exitonsv", "config|f=s",
"nostart|x", "uniquefn|u",
- "quite|q", "ignoreerror|i", "tests|t", "blib|b", "help|?", "dbgbreak",
"finderr") ;
-
-$opt_help = 1 if ($ret == 0) ;
-
-
-
-$confpath = 'test/conf' ;
-
-
-#### read config ####
-
-do ($opt_config || "$confpath/config.pl") ;
-
-die $@ if ($@) ;
-
-
-$EPPORT2 = ($EPPORT || 0) + 1 ;
-$EPSESSIONCLASS = $ENV{EMBPERL_SESSION_CLASS} || (($EPSESSIONVERSION =~
/^0\.17/)?'Win32':'0') || ($EPSESSIONVERSION > 1.00?'Embperl':'0') ;
-$EPSESSIONDS = $ENV{EMBPERL_SESSION_DS} || 'dbi:mysql:session' ;
-
-die "You must install libwin32 first" if ($EPWIN32 && $win32loaderr && $EPHTTPD) ;
-
-
-#### setup files ####
-
-$httpdconfsrc = "$confpath/httpd.conf.src" ;
-$httpdconf = "$confpath/httpd.conf" ;
-$httpderr = "$tmppath/httpd.err.log" ;
-$offlineerr = "$tmppath/test.err.log" ;
-$outfile = "$tmppath/out.htm" ;
-
-#### setup path in URL ####
-
-$embploc = 'embperl/' ;
-$cgiloc = 'cgi-bin/' ;
-
-$port = $EPPORT ;
-$host = 'localhost' ;
-$httpdpid = 0 ;
-
-if ($opt_help)
- {
- print "\n\n" ;
- print "test.pl [options] [files]\n" ;
- print "files: <filename>|<testnumber>|-<testnumber>\n\n" ;
- print "options:\n" ;
- print "-o test offline\n" ;
- print "-1 test Embperl 1.x compatibility\n" ;
- print "-c test cgi\n" ;
- print "-h test mod_perl\n" ;
- print "-e test execute\n" ;
- print "-r don't kill httpd at end of test\n" ;
- print "-l loop forever\n" ;
- print "-m start httpd with mulitple childs\n" ;
- print "-v memory check\n" ;
- print "-g exit if httpd grows after 2 loop\n" ;
- print "-f file to use for config.pl\n" ;
- print "-x do not start httpd\n" ;
- print "-u use unique filenames\n" ;
- print "-n do not check httpd errorlog\n" ;
- print "-q set debug to 0\n" ;
- print "-i ignore errors\n" ;
- print "-t list tests\n" ;
-# print "-b use uninstalled version (from blib/..)\n" ;
- print "\n\n" ;
- print "path\t$EPPATH\n" ;
- print "httpd\t$EPHTTPD\n" ;
- print "port\t$port\n" ;
- $fatal = 0 ;
- exit (1) ;
- }
-
-if ($opt_tests)
- {
- $i = 0 ;
- foreach $t (@tests)
- {
- print "$i = $t\n" ;
- $i++ ;
- }
- $fatal = 0 ;
- exit (1) ;
- }
-
-if ($opt_finderr && !$opt_testlib)
- {
- my $x = find_error () ;
- $fatal = 0 ;
- exit ($x) ;
- }
-
-
-
-$vmmaxsize = 0 ;
-$vminitsize = 0 ;
-$vmhttpdsize = 0 ;
-$vmhttpdinitsize = 0 ;
-
-
-#####################################################
-
-sub chompcr
-
- {
- local $^W = 0 ;
-
- chomp ($_[0]) ;
- if ($_[0] =~ /(.*?)\s*\r$/)
- {
- $_[0] = $1
- }
- elsif ($_[0] =~ /(.*?)\s*$/)
- {
- $_[0] = $1
- }
- }
-
-#####################################################
-
-sub CmpFiles
- {
- my ($f1, $f2, $errin) = @_ ;
- my $line = 1 ;
- my $err = 0 ;
-
- open F1, $f1 || die "***Cannot open $f1" ;
- if (!$errin)
- {
- open F2, $f2 || die "***Cannot open $f2" ;
- }
-
- while (defined ($l1 = <F1>))
- {
- chompcr ($l1) ;
- if (!$errin)
- {
- $l2 = <F2> ;
- chompcr ($l2) ;
- }
- if (!defined ($l2))
- {
- print "\nError in Line $line\nIs:\t$l1\nShould:\t<EOF>\n" ;
- return $line ;
- }
-
-
- $eq = 0 ;
- while (((!$notseen && ($l2 =~ /^\^\^(.*?)$/)) || ($l2 =~ /^\^\-(.*?)$/)) &&
!$eq)
- {
- $l2 = $1 ;
- if (($l1 =~ /^\s*$/) && ($l2 =~ /^\s*$/))
- {
- $eq = 1 ;
- }
- else
- {
- $eq = $l1 =~ /$l2/ ;
- }
- $l2 = <F2> if (!$eq) ;
- chompcr ($l2) ;
- }
-
- if (!$eq)
- {
- if ($l2 =~ /^\^(.*?)$/)
- {
- $l2 = $1 ;
- $eq = $l1 =~ /$l2/ ;
- }
- else
- {
- $eq = lc ($l1) eq lc ($l2) ;
- }
- }
-
- if (!$eq)
- {
- print "\nError in Line $line\nIs:\t>$l1<\nShould:\t>$l2<\n" ;
- return $line ;
- }
- $line++ ;
- }
-
- if (!$errin)
- {
- while (defined ($l2 = <F2>))
- {
- chompcr ($l2) ;
- if (!($l2 =~ /^\s*$/))
- {
- print "\nError in Line $line\nIs:\t\nShould:\t$l2\n" ;
- return $line ;
- }
- $line++ ;
- }
- }
-
- close F1 ;
- close F2 ;
-
- return $err ;
- }
-
-#########################
-#
-# GET/POST via HTTP.
-#
-
-sub REQ
-
- {
- my ($loc, $file, $query, $ofile, $content, $upload) = @_ ;
-
- eval 'require LWP::UserAgent' ;
-
-
- if ($@)
- {
- return "LWP not installed\n" ;
- }
-
- eval 'use HTTP::Request::Common' ;
- if ($@)
- {
- return "HTTP::Request::Common not installed\n" ;
- }
-
-
- $query ||= '' ;
-
- my $ua = new LWP::UserAgent; # create a useragent to test
-
- my($request,$response,$url);
-
-
- if (!$upload)
- {
- $url = new URI::URL("http://$host:$port/$loc$file?$query");
-
- $request = new HTTP::Request($content?'POST':'GET', $url);
- $request -> header ('Cookie' => $cookie) if ($cookie && !($query =~
/nocookie/)) ;
-
- $request -> content ($content) if ($content) ;
- }
- else
- {
- my @q = split (/\&|=/, $query) ;
-
- $request = POST ("http://$host:$port/$loc$file",
- Content_Type => 'form-data',
- Content => [ upload => [undef,
'12upload-filename',
- 'Content-type' =>
'test/plain',
- Content =>
$upload],
- content => $content,
- @q ]) ;
- }
-
- #print "Request: " . $request -> as_string () ;
-
-
- $response = $ua->request($request, undef, undef);
-
- open FH, ">$ofile" ;
- print FH $response -> content ;
- close FH ;
-
- my $c = $response -> header ('Set-Cookie') || '' ;
- $cookie = $c if (!$cookie && ($c =~ /EMBPERL_UID/)) ;
- #print "Got Cookie $cookie\n" ;
-
- #print $response -> headers -> as_string () ;
-
- return $response -> message if (!$response->is_success) ;
-
- return "ok" ;
- }
-
-###########################################################################
-#
-# Get Memory from /proc filesystem
-#
-
-sub GetMem
- {
- my ($pid) = @_ ;
-
- my @status ;
-
- open FH, "/proc/$pid/status" or die "Cannot open /proc/$pid/status" ;
- @status = <FH> ;
- close FH ;
-
- my @line = grep (/VmSize/, @status) ;
- $line[0] =~ /^VmSize\:\s+(\d+)\s+/ ;
- my $vmsize = $1 ;
-
- return $vmsize ;
- }
-
-###########################################################################
-#
-# Get output in error log
-#
-
-sub CheckError
-
- {
- my ($cnt) = @_ ;
- my $err = 0 ;
- my $ic ;
-
- $cnt ||= 0 ;
- $ic = $cnt ;
-
- while (<ERR>)
- {
- chomp ;
- if (!($_ =~ /^\s*$/) &&
- !($_ =~ /\-e /) &&
- !($_ =~ /Warning/) &&
- !($_ =~ /mod_ssl\:/) &&
- !($_ =~ /SES\:/) &&
- $_ ne 'Use of uninitialized value.')
- {
- $cnt-- ;
- if ($cnt < 0)
- {
- print "\n\n" if ($cnt == -1) ;
- print "[$cnt]$_\n" ;
- $err = 1 ;
- }
- }
- }
-
- if ($cnt > 0)
- {
- $err = 1 ;
- print "\n\nExpected $cnt more error(s) in logfile\n" ;
- }
-
- print "\n" if $err ;
-
- return $err ;
- }
-
-#########################
-
-
-sub CheckSVs
-
- {
- my ($loopcnt, $n) = @_ ;
-
- open SVLOG, $logfile or die "Cannot open $logfile ($!)" ;
-
- seek SVLOG, -3000, 2 ;
-
- while (<SVLOG>)
- {
- if (/Exit-SVs: (\d+)/)
- {
- $num_sv = $1 || 0;
- $last_sv[$n] ||= 0 ;
- print "SVs=$num_sv/$last_sv[$n]/$max_sv " ;
- if ($num_sv > $max_sv)
- {
- print "GROWN " ;
- $max_sv = $num_sv ;
-
- }
- die "\n\nMemory problem (SVs)" if ($opt_exitonsv && $loopcnt > 2 &&
$last_sv[$n] < $num_sv && $last_sv[$n] != 0 && $num_sv != 0) ;
- $last_sv[$n] = $num_sv ;
- last ;
- }
- }
-
- close SVLOG ;
- }
-
-
-
-######################### We start with some black magic to print on failure.
-
-
-#use Config qw (myconfig);
-#print myconfig () ;
-
-
-##################
-
-
-use HTML::Embperl;
-require HTML::Embperl::Module ;
-
-print "ok\n";
-
-#### check commandline options #####
-
-if (!$opt_modperl && !$opt_cgi && !$opt_offline && !$opt_execute)
- {
- if ($EPHTTPD ne '')
- { $opt_modperl = $opt_cgi = $opt_offline = $opt_execute = 1 }
- else
- { $opt_offline = $opt_execute = 1 }
- }
-
-$opt_nokill = 1 if ($opt_nostart) ;
-$looptest = defined ($opt_loop)?1:0 ; # endless loop tests
-
-$outfile .= ".$$" if ($opt_uniquefn) ;
-$defaultdebug = 0 if ($opt_quite) ;
-
-
-if ($#ARGV >= 0)
- {
- if ($ARGV[0] =~ /^-/)
- {
- $#tests = - $ARGV[0] ;
- }
- elsif ($ARGV[0] =~ /^(\d+)-/)
- {
- my $i = $1 ;
- shift @tests while ($i-- > 0) ;
- }
- elsif ($ARGV[0] =~ /^\d/)
- {
- @savetests = @tests ;
- @tests = () ;
- while ($t = shift @ARGV)
- {
- push @tests, $savetests[$t] ;
- }
- }
- else
- {
- @tests = @ARGV ;
- }
- }
-
-
-
-#### preparefile systems stuff ####
-
-$um = umask 0 ;
-mkdir $tmppath, 0777 ;
-chmod 0777, $tmppath ;
-umask $um ;
-
-unlink ($outfile) ;
-unlink ($httpderr) ;
-unlink ($offlineerr) ;
-
--w $tmppath or die "***Cannot write to $tmppath" ;
-
-#### some more init #####
-
-$DProf = $INC{'Devel/DProf.pm'}?1:0 ;
-$err = 0 ;
-$loopcnt = 0 ;
-$notseen = 1 ;
-%seen = () ;
-$max_sv = 0 ;
-
-$cp = HTML::Embperl::AddCompartment ('TEST') ;
-
-$cp -> deny (':base_loop') ;
-
-$ENV{EMBPERL_ALLOW} = 'asc|\\.htm$|\\.htm-1$' ;
-
-do
- {
- #############
- #
- # OFFLINE
- #
- #############
-
- if ($opt_offline || $opt_ep1)
- {
- print "\nTesting offline mode...\n\n" ;
-
- if ($loopcnt == 0)
- {
- open (SAVEERR, ">&STDERR") || die "Cannot save stderr" ;
- open (STDERR, ">$offlineerr") || die "Cannot redirect stderr" ;
- open (ERR, "$offlineerr") || die "Cannot open redirected stderr
($offlineerr)" ; ;
- }
-
- $n = 0 ;
- $t_offline = 0 ;
- $n_offline = 0 ;
- $testnum = -1 ;
- foreach $ep1compat (0, 1)
- {
- next if (($ep1compat && !($opt_ep1)) || (!$ep1compat &&
!($opt_offline)));
-
- $ENV{EMBPERL_EP1COMPAT} = $ep1compat ;
- print "\nTesting Embperl 1.x compatibility mode...\n\n" if ($ep1compat) ;
-
- foreach $url (@tests)
- {
- $testnum++ ;
- ($file, $query_info, $debug, $errcnt, $option, $ns) = split (/\?/,
$url) ;
- next if ($file eq 'http.htm') ;
- next if ($file eq 'taint.htm') ;
- next if ($file eq 'reqrec.htm') ;
- next if ($file eq 'http.htm') ;
- next if ($file eq 'post.htm') ;
- next if ($file eq 'upload.htm') ;
- next if ($file =~ /^exit.htm/) ;
- next if ($file =~ /registry/) ;
- next if ($file =~ /match\//) ;
- next if ($file =~ /sess\.htm/) ;
- next if ($file =~ /EmbperlObject/) ;
- next if ($DProf && ($file =~ /safe/)) ;
- next if ($DProf && ($file =~ /opmask/)) ;
- $errcnt = 7 if ($file eq 'varerr.htm' && $^V && $^V ge v5.6.0) ;
-
- $debug ||= $defaultdebug ;
- $page = "$inpath/$file" ;
- $page .= '-1' if ($ep1compat && -e "$page-1") ;
- $errcnt ||= 0 ;
-
- $notseen = $seen{"o:$page"}?0:1 ;
- $seen{"o:$page"} = 1 ;
-
- delete $ENV{EMBPERL_OPTIONS} if (defined ($ENV{EMBPERL_OPTIONS})) ;
- $ENV{EMBPERL_OPTIONS} = $option if (defined ($option)) ;
- $ENV{EMBPERL_COMPARTMENT} = $ns if (defined ($ns)) ;
- @testargs = ( '-o', $outfile ,
- '-l', $logfile,
- '-d', $debug,
- $page, $query_info || '') ;
- unshift (@testargs, 'dbgbreak') if ($opt_dbgbreak) ;
-
- $txt = "#$testnum ". $file . ($debug != $defaultdebug ?"-d $debug
":"") . '...' ;
- $txt .= ' ' x (30 - length ($txt)) ;
- print $txt ;
-
-
- unlink ($outfile) ;
-
- $n_offline++ ;
- $t1 = HTML::Embperl::Clock () ;
- $err = HTML::Embperl::run (@testargs) ;
- $t_offline += HTML::Embperl::Clock () - $t1 ;
-
- if ($opt_memcheck)
- {
- my $vmsize = GetMem ($$) ;
- $vminitsize = $vmsize if $loopcnt == 2 ;
- print "\#$loopcnt size=$vmsize init=$vminitsize " ;
- print "GROWN! at iteration = $loopcnt " if ($vmsize > $vmmaxsize)
;
- $vmmaxsize = $vmsize if ($vmsize > $vmmaxsize) ;
- CheckSVs ($loopcnt, $n) ;
- }
-
- $errin = $err ;
- $err = CheckError ($errcnt) if ($err == 0 || ($errcnt > 0 && $err ==
500) || $file eq 'notfound.htm' || $file eq 'notallow.xhtm') ;
-
-
- if ($err == 0 && $errin != 500 && $file ne 'notfound.htm' && $file ne
'notallow.xhtm')
- {
- $page =~ /.*\/(.*)$/ ;
- $org = "$cmppath/$1" ;
- $org .= '56' if ($file eq 'varerr.htm' && $^V && $^V ge v5.6.0)
;
- $org .= '-1' if ($ep1compat && -e "$org-1") ;
-
- $err = CmpFiles ($outfile, $org, $errin) ;
- }
-
- print "ok\n" unless ($err) ;
- $err = 0 if ($opt_ignoreerror) ;
- last if $err ;
- $n++ ;
- }
- last if $err ;
- }
- }
-
- if ($opt_execute)
- {
- #############
- #
- # Execute
- #
- #############
-
- if ($err == 0)
- {
- print "\nTesting Execute function...\n\n" ;
-
-
- HTML::Embperl::Init ($logfile) ;
-
- $notseen = 1 ;
- $txt = 'div.htm' ;
- $org = "$cmppath/$txt" ;
- $src = "$inpath/$txt" ;
- $errcnt = 0 ;
-
- {
- local $/ = undef ;
- open FH, $src or die "Cannot open $src ($!)" ;
- binmode FH ;
- $indata = <FH> ;
- close FH ;
- }
-
-
- $txt2 = "$txt from file...";
- $txt2 .= ' ' x (30 - length ($txt2)) ;
- print $txt2 ;
-
- unlink ($outfile) ;
- $t1 = HTML::Embperl::Clock () ;
- $err = HTML::Embperl::Execute ({'inputfile' => $src,
- 'mtime' => 1,
- 'outputfile' => $outfile,
- 'debug' => $defaultdebug,
- }) ;
-
- $t_exec += HTML::Embperl::Clock () - $t1 ;
-
- $err = CheckError ($errcnt) if ($err == 0) ;
- $err = CmpFiles ($outfile, $org) if ($err == 0) ;
- print "ok\n" unless ($err) ;
-
- if ($err == 0)
- {
- $txt2 = "$txt from memory...";
- $txt2 .= ' ' x (30 - length ($txt2)) ;
- print $txt2 ;
-
- unlink ($outfile) ;
- $t1 = HTML::Embperl::Clock () ;
- $err = HTML::Embperl::Execute ({'input' => \$indata,
- 'inputfile' => 'i1',
- 'mtime' => 1,
- 'outputfile' => $outfile,
- 'debug' => $defaultdebug,
- }) ;
- $t_exec += HTML::Embperl::Clock () - $t1 ;
-
- $err = CheckError ($errcnt) if ($err == 0) ;
- $err = CmpFiles ($outfile, $org) if ($err == 0) ;
- print "ok\n" unless ($err) ;
- }
-
- if ($err == 0)
- {
- $txt2 = "$txt to memory...";
- $txt2 .= ' ' x (30 - length ($txt2)) ;
- print $txt2 ;
-
- my $outdata ;
- my @errors ;
- unlink ($outfile) ;
- $t1 = HTML::Embperl::Clock () ;
- $err = HTML::Embperl::Execute ({'inputfile' => $src,
- 'mtime' => 1,
- 'output' => \$outdata,
- 'debug' => $defaultdebug,
- }) ;
- $t_exec += HTML::Embperl::Clock () - $t1 ;
-
- $err = CheckError ($errcnt) if ($err == 0) ;
-
- open FH, ">$outfile" or die "Cannot open $outfile ($!)" ;
- print FH $outdata ;
- close FH ;
- $err = CmpFiles ($outfile, $org) if ($err == 0) ;
- print "ok\n" unless ($err) ;
- }
-
- if ($err == 0)
- {
- $txt2 = "$txt from/to memory...";
- $txt2 .= ' ' x (30 - length ($txt2)) ;
- print $txt2 ;
-
- my $outdata ;
- unlink ($outfile) ;
- $t1 = HTML::Embperl::Clock () ;
- $err = HTML::Embperl::Execute ({'input' => \$indata,
- 'inputfile' => $src,
- 'mtime' => 1,
- 'output' => \$outdata,
- 'errors' => \@errors,
- 'debug' => $defaultdebug,
- }) ;
- $t_exec += HTML::Embperl::Clock () - $t1 ;
-
- $err = CheckError ($errcnt) if ($err == 0) ;
-
- if (@errors != 0)
- {
- print "\n\n\@errors does not return correct number of errors
(is " . scalar(@errors) . ", should 0)\n" ;
- $err = 1 ;
- }
-
- open FH, ">$outfile" or die "Cannot open $outfile ($!)" ;
- print FH $outdata ;
- close FH ;
- $err = CmpFiles ($outfile, $org) if ($err == 0) ;
- print "ok\n" unless ($err) ;
- }
-
- $txt = 'error.htm' ;
- $org = "$cmppath/$txt" ;
- $src = "$inpath/$txt" ;
-
- $notseen = $seen{"o:$src"}?0:1 ;
- $seen{"o:$src"} = 1 ;
-
-
- if ($err == 0)
- {
- $txt2 = "$txt to memory...";
- $txt2 .= ' ' x (30 - length ($txt2)) ;
- print $txt2 ;
-
- my $outdata ;
- my @errors ;
- unlink ($outfile) ;
- $t1 = HTML::Embperl::Clock () ;
- $err = HTML::Embperl::Execute ({'inputfile' => $src,
- 'mtime' => 1,
- 'output' => \$outdata,
- 'debug' => $defaultdebug,
- 'errors' => \@errors,
- }) ;
- $t_exec += HTML::Embperl::Clock () - $t1 ;
-
- $err = CheckError (7) if ($err == 0) ;
-
- if (@errors != 2)
- {
- print "\n\n\@errors does not return correct number of errors
(is " . scalar(@errors) . ", should 2)\n" ;
- $err = 1 ;
- }
-
- open FH, ">$outfile" or die "Cannot open $outfile ($!)" ;
- print FH $outdata ;
- close FH ;
- $err = CmpFiles ($outfile, $org) if ($err == 0) ;
- print "ok\n" unless ($err) ;
- }
-
- HTML::Embperl::Term () ;
- }
- }
-
- if ((($opt_execute) || ($opt_offline)) && $looptest == 0)
- {
- close STDERR ;
- open (STDERR, ">&SAVEERR") ;
- }
-
- #############
- #
- # mod_perl & cgi
- #
- #############
-
- if ($opt_modperl)
- { $loc = $embploc ; }
- elsif ($opt_cgi)
- { $loc = $cgiloc ; }
- else
- { $loc = '' ; }
-
-
- if ($loc ne '' && $err == 0 && $loopcnt == 0 && !$opt_nostart)
- {
- #### Configure httpd conf file
- $EPDEBUG = $defaultdebug ;
-
- my $cf ;
- my $rs = $/ ;
- undef $/ ;
-
- $ENV{EMBPERL_LOG} = $logfile ;
- open IFH, $httpdconfsrc or die "***Cannot open $httpconfsrc" ;
- $cf = <IFH> ;
- close IFH ;
- open OFH, ">$httpdconf" or die "***Cannot open $httpconf" ;
- eval $cf ;
- die "***Cannot eval $httpconf ($@)" if ($@) ;
- close OFH ;
- $/ = $rs ;
-
- #### Start httpd
- print "\n\nStarting httpd... " ;
- unlink "$tmppath/httpd.pid" ;
- chmod 0666, $logfile ;
- $XX = $opt_multchild?'':'-X' ;
-
-
- if ($EPWIN32)
- {
- $ENV{PATH} .= ";$EPHTTPDDLL" if ($EPWIN32) ;
- $ENV{PERL_STARTUP_DONE} = 1 ;
-
- Win32::Process::Create($HttpdObj, $EPHTTPD,
- "Apache -s $XX -f $EPPATH/$httpdconf ", 0,
- # NORMAL_PRIORITY_CLASS,
- 0,
- ".") or die "***Cannot start $EPHTTPD" ;
- }
- else
- {
- system ("$EPHTTPD $XX -f $EPPATH/$httpdconf &") and die "***Cannot start
$EPHTTPD" ;
- }
- sleep (3) ;
- if (!open FH, "$tmppath/httpd.pid")
- {
- sleep (7) ;
- if (!open FH, "$tmppath/httpd.pid")
- {
- sleep (7) ;
- if (!open FH, "$tmppath/httpd.pid")
- {
- open (FERR, "$httpderr") ;
- print $_ while (<FERR>) ;
- close FERR ;
- die "Cannot open $tmppath/httpd.pid" ;
- }
- }
-
- }
- $httpdpid = <FH> ;
- chop($httpdpid) ;
- close FH ;
- print "pid = $httpdpid ok\n" ;
-
- close ERR ;
- open (ERR, "$httpderr") ;
- <ERR> ; # skip first line
-
- $httpduid = getpwnam ($EPUSER) if (!$EPWIN32) ;
- }
- elsif ($err == 0 && $EPHTTPD eq '')
- {
- print "\n\nSkiping tests for mod_perl, because Embperl is not build for it.\n"
;
- print "Embperl can still be used as CGI-script, but 'make test' cannot test
it\n" ;
- print "without apache httpd installed.\n" ;
- }
-
-
- while ($loc ne '' && $err == 0)
- {
- if ($loc eq $embploc)
- { print "\nTesting mod_perl mode...\n\n" ; }
- else
- { print "\nTesting cgi mode...\n\n" ; }
-
- $cookie = undef ;
- $t_req = 0 ;
- $n_req = 0 ;
- $n = 0 ;
- $testnum = -1 ;
- foreach $url (@tests)
- {
- $testnum++ ;
- ($file, $query_info, $debug, $errcnt) = split (/\?/, $url) ;
-
- next if ($file =~ /\// && $loc eq $cgiloc) ;
- next if ($file eq 'taint.htm' && $loc eq $cgiloc) ;
- next if ($file eq 'reqrec.htm' && $loc eq $cgiloc) ;
- next if (($file =~ /^exit.htm/) && $loc eq $cgiloc) ;
- #next if ($file eq 'error.htm' && $loc eq $cgiloc && $errcnt < 16) ;
- next if ($file eq 'varerr.htm' && $loc eq $cgiloc && $errcnt > 0) ;
- next if ($file eq 'varerr.htm' && $looptest) ;
- next if (($file =~ /registry/) && $loc eq $cgiloc) ;
- next if (($file =~ /match/) && $loc eq $cgiloc) ;
- #next if ($file eq 'http.htm' && $loc eq $cgiloc) ;
- next if ($file eq 'chdir.htm' && $EPWIN32) ;
- next if ($file eq 'notfound.htm' && $loc eq $cgiloc && $EPWIN32) ;
- #next if ($file eq 'notallow.xhtm' && $loc eq $cgiloc && $EPWIN32) ;
- next if ($file =~ /opmask/ && $EPSTARTUP =~ /_dso/) ;
- next if ($file eq 'clearsess.htm' && !$looptest) ;
- next if (($file =~ /EmbperlObject/) && $loc eq $cgiloc) ;
- $errcnt = 7 if ($file eq 'varerr.htm' && $^V && $^V ge v5.6.0) ;
- if ($file =~ /sess\.htm/)
- {
- next if ($loc eq $cgiloc && $EPSESSIONCLASS ne 'Embperl') ;
- if (!$EPSESSIONVERSION)
- {
- $txt2 = "$file...";
- $txt2 .= ' ' x (29 - length ($txt2)) ;
- print "#$testnum $txt2 skip on this plattform\n" ;
- next ;
- }
- }
-
- $debug ||= $defaultdebug ;
- $errcnt ||= 0 ;
- $errcnt = -1 if ($EPWIN32 && $loc eq $cgiloc) ;
- $page = "$inpath/$file" ;
- if ($opt_nostart)
- {
- $notseen = 0 ;
- }
- elsif ($loc eq $embploc)
- {
- $notseen = $seen{"$loc:$page"}?0:1 ;
- $seen{"$loc:$page"} = 1 ;
- $notseen = 0 if ($file eq 'registry/errpage.htm') ;
- }
- else
- {
- $notseen = 1 ;
- }
-
- $txt = "#$testnum $file" . ($debug != $defaultdebug ?"-d $debug ":"") .
'...' ;
- $txt .= ' ' x (30 - length ($txt)) ;
- print $txt ;
- unlink ($outfile) ;
-
- $content = undef ;
- $content = "f1=abc1&f2=1234567890&f3=" . 'X' x 8192 if ($file eq
'post.htm') ;
- $upload = undef ;
- if ($file eq 'upload.htm')
- {
- $upload = "f1=abc1\r\n&f2=1234567890&f3=" . 'X' x 8192 ;
- $content = "Hi there!" ;
- }
-
- if (!$EPWIN32 && $loc eq $embploc && $file ne 'notfound.htm')
- {
- print "ERROR: Missing read permission for file $inpath/$file\n" if
(!-r "$inpath/$file") ;
- local $> = $httpduid ;
- print "ERROR: $inpath/$file must be readable by $EPUSER
(uid=$httpduid)\n" if (!-r "$inpath/$file") ;
- }
-
- $n_req++ ;
- $t1 = HTML::Embperl::Clock () ;
- $m = REQ ($loc, $file, $query_info, $outfile, $content, $upload) ;
- $t_req += HTML::Embperl::Clock () - $t1 ;
-
- if ($opt_memcheck)
- {
- my $vmsize = GetMem ($httpdpid) ;
- $vmhttpdinitsize = $vmsize if $loopcnt == 2 ;
- print "\#$loopcnt size=$vmsize init=$vmhttpdinitsize " ;
- print "GROWN! at iteration = $loopcnt " if ($vmsize > $vmhttpdsize) ;
- die "\n\nMemory problem (Total memory)" if ($opt_exitonmem && $loopcnt
> 2 && $vmsize > $vmhttpdsize) ;
- $vmhttpdsize = $vmsize if ($vmsize > $vmhttpdsize) ;
- CheckSVs ($loopcnt, $n) ;
-
- }
- if (($m || '') ne 'ok' && $errcnt == 0)
- {
- $err = 1 ;
- print "ERR:$m\n" ;
- last ;
- }
-
- #$errcnt++ if ($loc eq $cgiloc && $file eq 'notallow.xhtm') ;
- $err = CheckError ($errcnt) if (($err == 0 || $file eq 'notfound.htm' ||
$file eq 'notallow.xhtm')) ;
- if ($err == 0 && $file ne 'notfound.htm' && $file ne 'notallow.xhtm')
- {
- $page =~ /.*\/(.*)$/ ;
- $org = "$cmppath/$1" ;
- $org .= '56' if ($file eq 'varerr.htm' && $^V && $^V ge v5.6.0) ;
-
- #print "Compare $page with $org\n" ;
- $err = CmpFiles ($outfile, $org) ;
- }
-
- print "ok\n" unless ($err) ;
- $err = 0 if ($opt_ignoreerror) ;
- last if ($err) ;
- $n++ ;
- }
-
- if ($loc ne $cgiloc)
- {
- $t_mp = $t_req ;
- $n_mp = $n_req ;
- }
- else
- {
- $t_cgi = $t_req ;
- $n_cgi = $n_req ;
- }
-
- if ($opt_cgi && $err == 0 && $loc ne $cgiloc && $loopcnt == 0)
- {
- $loc = $cgiloc ;
- $loc = '' ; # currently disable cgi mode at all
- }
- else
- {
- $loc = '' ;
- }
- }
-
- if ($defaultdebug == 0)
- {
- print "\n" ;
- print "Offline: $n_offline tests takes $t_offline sec = ", int($t_offline /
$n_offline * 1000) / 1000.0, " sec per test\n" if ($t_offline) ;
- print "mod_perl: $n_mp tests takes $t_mp sec = ", int($t_mp / $n_mp * 1000) /
1000.0 , " sec per test\n" if ($t_mp) ;
- print "CGI: $n_cgi tests takes $t_cgi sec = ", int($t_cgi / $n_cgi *
1000) / 1000.0 , " sec per test\n" if ($t_cgi) ;
- }
-
- $loopcnt++ ;
- }
-until ($looptest == 0 || $err != 0 || ($loopcnt >= $opt_loop && $opt_loop > 0))
;
-
-
-if ($err)
- {
- $page ||= '???' ;
- $org ||= '???' ;
- print "Input:\t\t$page\n" ;
- print "Output:\t\t$outfile\n" ;
- print "Compared to:\t$org\n" ;
- print "Log:\t\t$logfile\n" ;
- print "\n ERRORS detected! NOT all test have been passed successfully\n\n" ;
- }
-else
- {
- print "\nAll test have been passed successfully!\n\n" ;
- }
-
-if (defined ($line = <ERR>))
- {
- print "\nFound unexpected output in httpd errorlog:\n" ;
- print $line ;
- }
-while (defined ($line = <ERR>))
- { print $line ; }
-close ERR ;
-
-$fatal = 0 ;
-
-
-if ($EPWIN32)
- {
- $HttpdObj->Kill(-1) if ($HttpdObj) ;
- }
-else
- {
- system "kill `cat $tmppath/httpd.pid` 2> /dev/null" if ($EPHTTPD ne '' &&
!$opt_nokill) ;
- }
-
-exit ($err) ;
-
-
-############################################################################################################
-
-sub find_error
-
- {
- my $max = @tests ;
- my $min = 0 ;
- my $n = $max ;
-
- my $ret ;
- my $cmd ;
- my $opt = " -h "if (!$opt_modperl && !$opt_cgi && !$opt_offline &&
!$opt_execute) ;
-
- while ($min + 1 < $max)
- {
- $cmd = "perl test.pl --testlib @ARGVSAVE $opt -l10 -v --exitonsv -- -$n" ;
- print "---> min = $min max = $max\n$cmd\n" ;
- $ret = system ($cmd) ;
- last if ($ret == 0 && $n == $max) ;
- $min = $n if ($ret == 0) ;
- $max = $n if ($ret != 0) ;
-
- $n = $min + int (($max - $min) / 2) ;
- }
-
- if ($max < @tests)
- {
- print "############## -> error at #$max $tests[$max]\n" ;
- $cmd = "perl test.pl --testlib @ARGVSAVE $opt -l10 -v --exitonsv -- $max" ;
- print "---> min = $min max = $max\n$cmd\n" ;
- $ret = system ($cmd) ;
- print "############## -> error at #$max $tests[$max]\n" ;
- }
-
- return ($max == @tests)?0:1 ;
- }
-
+#!/usr/bin/perl --
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+
+@tests = (
+ 'ascii',
+# 'tmp/header.htm',
+ 'pure.htm',
+## 'plainlong.htm',
+## 'plainlong.htm',
+## 'plainlong.htm',
+## 'plainlong.htm',
+ 'plain.htm',
+ 'plain.htm',
+ 'plain.htm',
+ 'plainblock.htm',
+ 'plainblock.htm',
+ 'error.htm???7',
+ 'error.htm???7',
+ 'error.htm???7',
+ 'errormismatch.htm???1',
+ 'errormismatchcmd.htm???1',
+ 'unclosed.htm???1',
+# 'errorright.htm???1',
+ 'notfound.htm???1',
+ 'notallow.xhtm???1',
+## 'noerr/noerrpage.htm???6?2',
+## 'errdoc/errdoc.htm???8?262144',
+## 'rawinput/rawinput.htm????16',
+ 'var.htm',
+ 'varerr.htm???-1',
+## 'varerr.htm???2',
+ 'escape.htm',
+ 'escape.htm',
+## 'spaces.htm',
+ 'tagscan.htm',
+ 'tagscan.htm??1',
+ 'if.htm',
+ 'ifperl.htm',
+
'loop.htm?erstes=Hallo&zweites=Leer+zeichen&drittes=%21%22%23%2a%2B&erstes=Wert2',
+
'loop.htm?erstes=Hallo&zweites=Leer+zeichen&drittes=%21%22%23%2a%2B&erstes=Wert2',
+ 'loopperl.htm?erstes=Hallo&zweites=Leer+zeichen&drittes=%21%22%23&erstes=Wert2',
+ 'table.htm',
+ 'table.htm??1',
+ 'lists.htm?sel=2&SEL1=B&SEL3=D&SEL4=cc',
+ 'lists.htm?sel=2&SEL1=B&SEL3=D&SEL4=cc',
+ 'mix.htm',
+## 'nesting.htm',
+ 'object.htm',
+## 'discard.htm???12',
+
'input.htm?feld5=Wert5&feld6=Wert6&feld7=Wert7&feld8=Wert8&cb5=cbv5&cb6=cbv6&cb7=cbv7&cb8=cbv8&cb9=ncbv9&cb10=ncbv10&cb11=ncbv11&mult=Wert3&mult=Wert6&esc=a<b&escmult=a>b&escmult=Wert3',
+ 'hidden.htm?feld1=Wert1&feld2=Wert2&feld3=Wert3&feld4=Wert4',
+ 'java.htm',
+ 'inputjava.htm',
+ 'post.htm',
+ 'upload.htm?multval=A&multval=B&multval=C&single=S',
+ 'reqrec.htm',
+ 'reqrec.htm',
+ 'rawinput/include.htm????16',
+ 'includeerr1.htm???1',
+ 'includeerr2.htm???1',
+ 'registry/Execute.htm',
+## 'registry/errpage.htm???16',
+ 'registry/tied.htm???3',
+ 'registry/tied.htm???3',
+## 'callsub.htm',
+## 'callsub.htm',
+## 'importsub.htm',
+## 'importsub.htm',
+## 'importsub2.htm',
+## 'importmodule.htm',
+## 'recursexec.htm',
+ 'nph/div.htm????64',
+## 'nph/npherr.htm???8?64',
+ 'nph/nphinc.htm????64',
+ 'sub.htm',
+ 'sub.htm',
+## 'exit.htm',
+## 'exit2.htm',
+## 'exit3.htm',
+ 'chdir.htm?a=1&b=2&c=&d=&f=5&g&h=7&=8&=',
+ 'chdir.htm?a=1&b=2&c=&d=&f=5&g&h=7&=8&=',
+ 'allform/allform.htm?a=1&b=2&c=&d=&f=5&g&h=7&=8&=???8192',
+## 'stdout/stdout.htm????16384',
+ 'nochdir/nochdir.htm?a=1&b=2???384',
+ 'match/div.htm',
+ 'match/div.asc',
+## 'http.htm',
+ 'div.htm',
+ 'taint.htm???1',
+ 'ofunc/div.htm',
+## 'safe/safe.htm???-1?4',
+## 'safe/safe.htm???-1?4',
+## 'safe/safe.htm???-1?4',
+## 'opmask/opmask.htm???-1?12?TEST',
+## 'opmask/opmasktrap.htm???2?12?TEST',
+ 'mdatsess.htm?cnt=0',
+ 'setsess.htm?a=1',
+ 'mdatsess.htm?cnt=1',
+ 'getnosess.htm?nocookie=2',
+ 'mdatsess.htm?cnt=2',
+ 'getsess.htm',
+ 'mdatsess.htm?cnt=3',
+ 'execgetsess.htm',
+ 'clearsess.htm',
+ 'EmbperlObject/epopage1.htm',
+## 'EmbperlObject/sub/epopage2.htm',
+ ) ;
+
+
+# avoid some warnings:
+
+use vars qw ($httpconfsrc $httpconf $EPPORT $EPPORT2 *SAVEERR *ERR $EPHTTPDDLL
$EPSTARTUP $EPDEBUG
+ $EPSESSIONDS $EPSESSIONCLASS $EPSESSIONVERSION
+ $opt_offline $opt_ep1 $opt_cgi $opt_modperl $opt_execute $opt_nokill
$opt_loop
+ $opt_multchild $opt_memcheck $opt_exitonmem $opt_exitonsv $opt_config
$opt_nostart $opt_uniquefn
+ $opt_quite $opt_ignoreerror $opt_tests $opt_blib $opt_help
$opt_dbgbreak $opt_finderr) ;
+
+ {
+ local $^W = 0 ;
+ eval " use Win32::Process; " ;
+ $win32loaderr = $@ ;
+ eval " use Win32; " ;
+ $win32loaderr ||= $@ ;
+ }
+
+BEGIN
+ {
+ $fatal = 1 ;
+ $^W = 1 ;
+ $| = 1;
+
+ if ($ARGV[0] eq '--testlib')
+ {
+ eval 'use ExtUtils::testlib' ;
+ shift @ARGV ;
+ $opt_testlib = 1 ;
+ }
+
+ #### install handler which kill httpd when terminating ####
+
+ $SIG{__DIE__} = sub {
+ return unless $_[0] =~ /^\*\*\*/ ;
+ return if ($opt_nokill) ;
+ if ($EPWIN32)
+ {
+ $HttpdObj->Kill(-1) if ($HttpdObj) ;
+ }
+ else
+ {
+ system "kill `cat $tmppath/httpd.pid` 2> /dev/null" if ($EPHTTPD ne '') ;
+ }
+ } ;
+
+ print "\nloading... ";
+
+
+ $defaultdebug = 0x1f85ffd ;
+ #$defaultdebug = 1 ;
+
+ #### setup paths #####
+
+ $inpath = 'test/html' ;
+ $tmppath = 'test/tmp' ;
+ $cmppath = 'test/cmp' ;
+
+ $logfile = "$tmppath/test.log" ;
+
+ $ENV{EMBPERL_LOG} = $logfile ;
+ $ENV{EMBPERL_DEBUG} = $defaultdebug ;
+
+ unlink ($logfile) ;
+ }
+
+END
+ {
+ print "\nTest terminated with fatal error\n" if ($fatal) ;
+ system "kill `cat $tmppath/httpd.pid` 2> /dev/null" if ($EPHTTPD ne '' &&
!$opt_nokill && !$EPWIN32) ;
+ $? = $fatal || $err ;
+ }
+
+
+use Getopt::Long ;
+
+@ARGVSAVE = @ARGV ;
+
+Getopt::Long::Configure ('bundling') ;
+$ret = GetOptions ("offline|o", "ep1|1", "cgi|c", "modperl|httpd|h", "execute|e",
"nokill|r", "loop|l:i",
+ "multchild|m", "memcheck|v", "exitonmem|g", "exitonsv", "config|f=s",
"nostart|x", "uniquefn|u",
+ "quite|q", "ignoreerror|i", "tests|t", "blib|b", "help|?", "dbgbreak",
"finderr") ;
+
+$opt_help = 1 if ($ret == 0) ;
+
+
+
+$confpath = 'test/conf' ;
+
+
+#### read config ####
+
+do ($opt_config || "$confpath/config.pl") ;
+
+die $@ if ($@) ;
+
+
+$EPPORT2 = ($EPPORT || 0) + 1 ;
+$EPSESSIONCLASS = $ENV{EMBPERL_SESSION_CLASS} || (($EPSESSIONVERSION =~
/^0\.17/)?'Win32':'0') || ($EPSESSIONVERSION > 1.00?'Embperl':'0') ;
+$EPSESSIONDS = $ENV{EMBPERL_SESSION_DS} || 'dbi:mysql:session' ;
+
+die "You must install libwin32 first" if ($EPWIN32 && $win32loaderr && $EPHTTPD) ;
+
+
+#### setup files ####
+
+$httpdconfsrc = "$confpath/httpd.conf.src" ;
+$httpdconf = "$confpath/httpd.conf" ;
+$httpderr = "$tmppath/httpd.err.log" ;
+$offlineerr = "$tmppath/test.err.log" ;
+$outfile = "$tmppath/out.htm" ;
+
+#### setup path in URL ####
+
+$embploc = 'embperl/' ;
+$cgiloc = 'cgi-bin/' ;
+
+$port = $EPPORT ;
+$host = 'localhost' ;
+$httpdpid = 0 ;
+
+if ($opt_help)
+ {
+ print "\n\n" ;
+ print "test.pl [options] [files]\n" ;
+ print "files: <filename>|<testnumber>|-<testnumber>\n\n" ;
+ print "options:\n" ;
+ print "-o test offline\n" ;
+ print "-1 test Embperl 1.x compatibility\n" ;
+ print "-c test cgi\n" ;
+ print "-h test mod_perl\n" ;
+ print "-e test execute\n" ;
+ print "-r don't kill httpd at end of test\n" ;
+ print "-l loop forever\n" ;
+ print "-m start httpd with mulitple childs\n" ;
+ print "-v memory check\n" ;
+ print "-g exit if httpd grows after 2 loop\n" ;
+ print "-f file to use for config.pl\n" ;
+ print "-x do not start httpd\n" ;
+ print "-u use unique filenames\n" ;
+ print "-n do not check httpd errorlog\n" ;
+ print "-q set debug to 0\n" ;
+ print "-i ignore errors\n" ;
+ print "-t list tests\n" ;
+# print "-b use uninstalled version (from blib/..)\n" ;
+ print "\n\n" ;
+ print "path\t$EPPATH\n" ;
+ print "httpd\t$EPHTTPD\n" ;
+ print "port\t$port\n" ;
+ $fatal = 0 ;
+ exit (1) ;
+ }
+
+if ($opt_tests)
+ {
+ $i = 0 ;
+ foreach $t (@tests)
+ {
+ print "$i = $t\n" ;
+ $i++ ;
+ }
+ $fatal = 0 ;
+ exit (1) ;
+ }
+
+if ($opt_finderr && !$opt_testlib)
+ {
+ my $x = find_error () ;
+ $fatal = 0 ;
+ exit ($x) ;
+ }
+
+
+
+$vmmaxsize = 0 ;
+$vminitsize = 0 ;
+$vmhttpdsize = 0 ;
+$vmhttpdinitsize = 0 ;
+
+
+#####################################################
+
+sub chompcr
+
+ {
+ local $^W = 0 ;
+
+ chomp ($_[0]) ;
+ if ($_[0] =~ /(.*?)\s*\r$/)
+ {
+ $_[0] = $1
+ }
+ elsif ($_[0] =~ /(.*?)\s*$/)
+ {
+ $_[0] = $1
+ }
+ }
+
+#####################################################
+
+sub CmpFiles
+ {
+ my ($f1, $f2, $errin) = @_ ;
+ my $line = 1 ;
+ my $err = 0 ;
+
+ open F1, $f1 || die "***Cannot open $f1" ;
+ if (!$errin)
+ {
+ open F2, $f2 || die "***Cannot open $f2" ;
+ }
+
+ while (defined ($l1 = <F1>))
+ {
+ chompcr ($l1) ;
+ if (!$errin)
+ {
+ $l2 = <F2> ;
+ chompcr ($l2) ;
+ }
+ if (!defined ($l2))
+ {
+ print "\nError in Line $line\nIs:\t$l1\nShould:\t<EOF>\n" ;
+ return $line ;
+ }
+
+
+ $eq = 0 ;
+ while (((!$notseen && ($l2 =~ /^\^\^(.*?)$/)) || ($l2 =~ /^\^\-(.*?)$/)) &&
!$eq)
+ {
+ $l2 = $1 ;
+ if (($l1 =~ /^\s*$/) && ($l2 =~ /^\s*$/))
+ {
+ $eq = 1 ;
+ }
+ else
+ {
+ $eq = $l1 =~ /$l2/ ;
+ }
+ $l2 = <F2> if (!$eq) ;
+ chompcr ($l2) ;
+ }
+
+ if (!$eq)
+ {
+ if ($l2 =~ /^\^(.*?)$/)
+ {
+ $l2 = $1 ;
+ $eq = $l1 =~ /$l2/ ;
+ }
+ else
+ {
+ $eq = lc ($l1) eq lc ($l2) ;
+ }
+ }
+
+ if (!$eq)
+ {
+ print "\nError in Line $line\nIs:\t>$l1<\nShould:\t>$l2<\n" ;
+ return $line ;
+ }
+ $line++ ;
+ }
+
+ if (!$errin)
+ {
+ while (defined ($l2 = <F2>))
+ {
+ chompcr ($l2) ;
+ if (!($l2 =~ /^\s*$/))
+ {
+ print "\nError in Line $line\nIs:\t\nShould:\t$l2\n" ;
+ return $line ;
+ }
+ $line++ ;
+ }
+ }
+
+ close F1 ;
+ close F2 ;
+
+ return $err ;
+ }
+
+#########################
+#
+# GET/POST via HTTP.
+#
+
+sub REQ
+
+ {
+ my ($loc, $file, $query, $ofile, $content, $upload) = @_ ;
+
+ eval 'require LWP::UserAgent' ;
+
+
+ if ($@)
+ {
+ return "LWP not installed\n" ;
+ }
+
+ eval 'use HTTP::Request::Common' ;
+ if ($@)
+ {
+ return "HTTP::Request::Common not installed\n" ;
+ }
+
+
+ $query ||= '' ;
+
+ my $ua = new LWP::UserAgent; # create a useragent to test
+
+ my($request,$response,$url);
+
+
+ if (!$upload)
+ {
+ $url = new URI::URL("http://$host:$port/$loc$file?$query");
+
+ $request = new HTTP::Request($content?'POST':'GET', $url);
+ $request -> header ('Cookie' => $cookie) if ($cookie && !($query =~
/nocookie/)) ;
+
+ $request -> content ($content) if ($content) ;
+ }
+ else
+ {
+ my @q = split (/\&|=/, $query) ;
+
+ $request = POST ("http://$host:$port/$loc$file",
+ Content_Type => 'form-data',
+ Content => [ upload => [undef,
'12upload-filename',
+ 'Content-type' =>
'test/plain',
+ Content =>
$upload],
+ content => $content,
+ @q ]) ;
+ }
+
+ #print "Request: " . $request -> as_string () ;
+
+
+ $response = $ua->request($request, undef, undef);
+
+ open FH, ">$ofile" ;
+ print FH $response -> content ;
+ close FH ;
+
+ my $c = $response -> header ('Set-Cookie') || '' ;
+ $cookie = $c if (!$cookie && ($c =~ /EMBPERL_UID/)) ;
+ #print "Got Cookie $cookie\n" ;
+
+ #print $response -> headers -> as_string () ;
+
+ return $response -> message if (!$response->is_success) ;
+
+ return "ok" ;
+ }
+
+###########################################################################
+#
+# Get Memory from /proc filesystem
+#
+
+sub GetMem
+ {
+ my ($pid) = @_ ;
+
+ my @status ;
+
+ open FH, "/proc/$pid/status" or die "Cannot open /proc/$pid/status" ;
+ @status = <FH> ;
+ close FH ;
+
+ my @line = grep (/VmSize/, @status) ;
+ $line[0] =~ /^VmSize\:\s+(\d+)\s+/ ;
+ my $vmsize = $1 ;
+
+ return $vmsize ;
+ }
+
+###########################################################################
+#
+# Get output in error log
+#
+
+sub CheckError
+
+ {
+ my ($cnt) = @_ ;
+ my $err = 0 ;
+ my $ic ;
+
+ $cnt ||= 0 ;
+ $ic = $cnt ;
+
+ while (<ERR>)
+ {
+ chomp ;
+ if (!($_ =~ /^\s*$/) &&
+ !($_ =~ /\-e /) &&
+ !($_ =~ /Warning/) &&
+ !($_ =~ /mod_ssl\:/) &&
+ !($_ =~ /SES\:/) &&
+ $_ ne 'Use of uninitialized value.')
+ {
+ $cnt-- ;
+ if ($cnt < 0)
+ {
+ print "\n\n" if ($cnt == -1) ;
+ print "[$cnt]$_\n" ;
+ $err = 1 ;
+ }
+ }
+ }
+
+ if ($cnt > 0)
+ {
+ $err = 1 ;
+ print "\n\nExpected $cnt more error(s) in logfile\n" ;
+ }
+
+ print "\n" if $err ;
+
+ return $err ;
+ }
+
+#########################
+
+
+sub CheckSVs
+
+ {
+ my ($loopcnt, $n) = @_ ;
+
+ open SVLOG, $logfile or die "Cannot open $logfile ($!)" ;
+
+ seek SVLOG, -3000, 2 ;
+
+ while (<SVLOG>)
+ {
+ if (/Exit-SVs: (\d+)/)
+ {
+ $num_sv = $1 || 0;
+ $last_sv[$n] ||= 0 ;
+ print "SVs=$num_sv/$last_sv[$n]/$max_sv " ;
+ if ($num_sv > $max_sv)
+ {
+ print "GROWN " ;
+ $max_sv = $num_sv ;
+
+ }
+ die "\n\nMemory problem (SVs)" if ($opt_exitonsv && $loopcnt > 2 &&
$last_sv[$n] < $num_sv && $last_sv[$n] != 0 && $num_sv != 0) ;
+ $last_sv[$n] = $num_sv ;
+ last ;
+ }
+ }
+
+ close SVLOG ;
+ }
+
+
+
+######################### We start with some black magic to print on failure.
+
+
+#use Config qw (myconfig);
+#print myconfig () ;
+
+
+##################
+
+
+use HTML::Embperl;
+require HTML::Embperl::Module ;
+
+print "ok\n";
+
+#### check commandline options #####
+
+if (!$opt_modperl && !$opt_cgi && !$opt_offline && !$opt_execute)
+ {
+ if ($EPHTTPD ne '')
+ { $opt_modperl = $opt_cgi = $opt_offline = $opt_execute = 1 }
+ else
+ { $opt_offline = $opt_execute = 1 }
+ }
+
+$opt_nokill = 1 if ($opt_nostart) ;
+$looptest = defined ($opt_loop)?1:0 ; # endless loop tests
+
+$outfile .= ".$$" if ($opt_uniquefn) ;
+$defaultdebug = 0 if ($opt_quite) ;
+
+
+if ($#ARGV >= 0)
+ {
+ if ($ARGV[0] =~ /^-/)
+ {
+ $#tests = - $ARGV[0] ;
+ }
+ elsif ($ARGV[0] =~ /^(\d+)-/)
+ {
+ my $i = $1 ;
+ shift @tests while ($i-- > 0) ;
+ }
+ elsif ($ARGV[0] =~ /^\d/)
+ {
+ @savetests = @tests ;
+ @tests = () ;
+ while ($t = shift @ARGV)
+ {
+ push @tests, $savetests[$t] ;
+ }
+ }
+ else
+ {
+ @tests = @ARGV ;
+ }
+ }
+
+
+
+#### preparefile systems stuff ####
+
+$um = umask 0 ;
+mkdir $tmppath, 0777 ;
+chmod 0777, $tmppath ;
+umask $um ;
+
+unlink ($outfile) ;
+unlink ($httpderr) ;
+unlink ($offlineerr) ;
+
+-w $tmppath or die "***Cannot write to $tmppath" ;
+
+#### some more init #####
+
+$DProf = $INC{'Devel/DProf.pm'}?1:0 ;
+$err = 0 ;
+$loopcnt = 0 ;
+$notseen = 1 ;
+%seen = () ;
+$max_sv = 0 ;
+
+$cp = HTML::Embperl::AddCompartment ('TEST') ;
+
+$cp -> deny (':base_loop') ;
+
+$ENV{EMBPERL_ALLOW} = 'asc|\\.htm$|\\.htm-1$' ;
+
+do
+ {
+ #############
+ #
+ # OFFLINE
+ #
+ #############
+
+ if ($opt_offline || $opt_ep1)
+ {
+ print "\nTesting offline mode...\n\n" ;
+
+ if ($loopcnt == 0)
+ {
+ open (SAVEERR, ">&STDERR") || die "Cannot save stderr" ;
+ open (STDERR, ">$offlineerr") || die "Cannot redirect stderr" ;
+ open (ERR, "$offlineerr") || die "Cannot open redirected stderr
($offlineerr)" ; ;
+ }
+
+ $n = 0 ;
+ $t_offline = 0 ;
+ $n_offline = 0 ;
+ $testnum = -1 ;
+ foreach $ep1compat (0, 1)
+ {
+ next if (($ep1compat && !($opt_ep1)) || (!$ep1compat &&
!($opt_offline)));
+
+ $ENV{EMBPERL_EP1COMPAT} = $ep1compat ;
+ print "\nTesting Embperl 1.x compatibility mode...\n\n" if ($ep1compat) ;
+
+ foreach $url (@tests)
+ {
+ $testnum++ ;
+ ($file, $query_info, $debug, $errcnt, $option, $ns) = split (/\?/,
$url) ;
+ next if ($file eq 'http.htm') ;
+ next if ($file eq 'taint.htm') ;
+ next if ($file eq 'reqrec.htm') ;
+ next if ($file eq 'http.htm') ;
+ next if ($file eq 'post.htm') ;
+ next if ($file eq 'upload.htm') ;
+ next if ($file =~ /^exit.htm/) ;
+ next if ($file =~ /registry/) ;
+ next if ($file =~ /match\//) ;
+ next if ($file =~ /sess\.htm/) ;
+ next if ($file =~ /EmbperlObject/) ;
+ next if ($DProf && ($file =~ /safe/)) ;
+ next if ($DProf && ($file =~ /opmask/)) ;
+ $errcnt = 7 if ($file eq 'varerr.htm' && $^V && $^V ge v5.6.0) ;
+
+ $debug ||= $defaultdebug ;
+ $page = "$inpath/$file" ;
+ $page .= '-1' if ($ep1compat && -e "$page-1") ;
+ $errcnt ||= 0 ;
+
+ $notseen = $seen{"o:$page"}?0:1 ;
+ $seen{"o:$page"} = 1 ;
+
+ delete $ENV{EMBPERL_OPTIONS} if (defined ($ENV{EMBPERL_OPTIONS})) ;
+ $ENV{EMBPERL_OPTIONS} = $option if (defined ($option)) ;
+ $ENV{EMBPERL_COMPARTMENT} = $ns if (defined ($ns)) ;
+ @testargs = ( '-o', $outfile ,
+ '-l', $logfile,
+ '-d', $debug,
+ $page, $query_info || '') ;
+ unshift (@testargs, 'dbgbreak') if ($opt_dbgbreak) ;
+
+ $txt = "#$testnum ". $file . ($debug != $defaultdebug ?"-d $debug
":"") . '...' ;
+ $txt .= ' ' x (30 - length ($txt)) ;
+ print $txt ;
+
+
+ unlink ($outfile) ;
+
+ $n_offline++ ;
+ $t1 = HTML::Embperl::Clock () ;
+ $err = HTML::Embperl::run (@testargs) ;
+ $t_offline += HTML::Embperl::Clock () - $t1 ;
+
+ if ($opt_memcheck)
+ {
+ my $vmsize = GetMem ($$) ;
+ $vminitsize = $vmsize if $loopcnt == 2 ;
+ print "\#$loopcnt size=$vmsize init=$vminitsize " ;
+ print "GROWN! at iteration = $loopcnt " if ($vmsize > $vmmaxsize)
;
+ $vmmaxsize = $vmsize if ($vmsize > $vmmaxsize) ;
+ CheckSVs ($loopcnt, $n) ;
+ }
+
+ $errin = $err ;
+ $err = CheckError ($errcnt) if ($err == 0 || ($errcnt > 0 && $err ==
500) || $file eq 'notfound.htm' || $file eq 'notallow.xhtm') ;
+
+
+ if ($err == 0 && $errin != 500 && $file ne 'notfound.htm' && $file ne
'notallow.xhtm')
+ {
+ $page =~ /.*\/(.*)$/ ;
+ $org = "$cmppath/$1" ;
+ $org .= '56' if ($file eq 'varerr.htm' && $^V && $^V ge v5.6.0)
;
+ $org .= '-1' if ($ep1compat && -e "$org-1") ;
+
+ $err = CmpFiles ($outfile, $org, $errin) ;
+ }
+
+ print "ok\n" unless ($err) ;
+ $err = 0 if ($opt_ignoreerror) ;
+ last if $err ;
+ $n++ ;
+ }
+ last if $err ;
+ }
+ }
+
+ if ($opt_execute)
+ {
+ #############
+ #
+ # Execute
+ #
+ #############
+
+ if ($err == 0)
+ {
+ print "\nTesting Execute function...\n\n" ;
+
+
+ HTML::Embperl::Init ($logfile) ;
+
+ $notseen = 1 ;
+ $txt = 'div.htm' ;
+ $org = "$cmppath/$txt" ;
+ $src = "$inpath/$txt" ;
+ $errcnt = 0 ;
+
+ {
+ local $/ = undef ;
+ open FH, $src or die "Cannot open $src ($!)" ;
+ binmode FH ;
+ $indata = <FH> ;
+ close FH ;
+ }
+
+
+ $txt2 = "$txt from file...";
+ $txt2 .= ' ' x (30 - length ($txt2)) ;
+ print $txt2 ;
+
+ unlink ($outfile) ;
+ $t1 = HTML::Embperl::Clock () ;
+ $err = HTML::Embperl::Execute ({'inputfile' => $src,
+ 'mtime' => 1,
+ 'outputfile' => $outfile,
+ 'debug' => $defaultdebug,
+ }) ;
+
+ $t_exec += HTML::Embperl::Clock () - $t1 ;
+
+ $err = CheckError ($errcnt) if ($err == 0) ;
+ $err = CmpFiles ($outfile, $org) if ($err == 0) ;
+ print "ok\n" unless ($err) ;
+
+ if ($err == 0)
+ {
+ $txt2 = "$txt from memory...";
+ $txt2 .= ' ' x (30 - length ($txt2)) ;
+ print $txt2 ;
+
+ unlink ($outfile) ;
+ $t1 = HTML::Embperl::Clock () ;
+ $err = HTML::Embperl::Execute ({'input' => \$indata,
+ 'inputfile' => 'i1',
+ 'mtime' => 1,
+ 'outputfile' => $outfile,
+ 'debug' => $defaultdebug,
+ }) ;
+ $t_exec += HTML::Embperl::Clock () - $t1 ;
+
+ $err = CheckError ($errcnt) if ($err == 0) ;
+ $err = CmpFiles ($outfile, $org) if ($err == 0) ;
+ print "ok\n" unless ($err) ;
+ }
+
+ if ($err == 0)
+ {
+ $txt2 = "$txt to memory...";
+ $txt2 .= ' ' x (30 - length ($txt2)) ;
+ print $txt2 ;
+
+ my $outdata ;
+ my @errors ;
+ unlink ($outfile) ;
+ $t1 = HTML::Embperl::Clock () ;
+ $err = HTML::Embperl::Execute ({'inputfile' => $src,
+ 'mtime' => 1,
+ 'output' => \$outdata,
+ 'debug' => $defaultdebug,
+ }) ;
+ $t_exec += HTML::Embperl::Clock () - $t1 ;
+
+ $err = CheckError ($errcnt) if ($err == 0) ;
+
+ open FH, ">$outfile" or die "Cannot open $outfile ($!)" ;
+ print FH $outdata ;
+ close FH ;
+ $err = CmpFiles ($outfile, $org) if ($err == 0) ;
+ print "ok\n" unless ($err) ;
+ }
+
+ if ($err == 0)
+ {
+ $txt2 = "$txt from/to memory...";
+ $txt2 .= ' ' x (30 - length ($txt2)) ;
+ print $txt2 ;
+
+ my $outdata ;
+ unlink ($outfile) ;
+ $t1 = HTML::Embperl::Clock () ;
+ $err = HTML::Embperl::Execute ({'input' => \$indata,
+ 'inputfile' => $src,
+ 'mtime' => 1,
+ 'output' => \$outdata,
+ 'errors' => \@errors,
+ 'debug' => $defaultdebug,
+ }) ;
+ $t_exec += HTML::Embperl::Clock () - $t1 ;
+
+ $err = CheckError ($errcnt) if ($err == 0) ;
+
+ if (@errors != 0)
+ {
+ print "\n\n\@errors does not return correct number of errors
(is " . scalar(@errors) . ", should 0)\n" ;
+ $err = 1 ;
+ }
+
+ open FH, ">$outfile" or die "Cannot open $outfile ($!)" ;
+ print FH $outdata ;
+ close FH ;
+ $err = CmpFiles ($outfile, $org) if ($err == 0) ;
+ print "ok\n" unless ($err) ;
+ }
+
+ $txt = 'error.htm' ;
+ $org = "$cmppath/$txt" ;
+ $src = "$inpath/$txt" ;
+
+ $notseen = $seen{"o:$src"}?0:1 ;
+ $seen{"o:$src"} = 1 ;
+
+
+ if ($err == 0)
+ {
+ $txt2 = "$txt to memory...";
+ $txt2 .= ' ' x (30 - length ($txt2)) ;
+ print $txt2 ;
+
+ my $outdata ;
+ my @errors ;
+ unlink ($outfile) ;
+ $t1 = HTML::Embperl::Clock () ;
+ $err = HTML::Embperl::Execute ({'inputfile' => $src,
+ 'mtime' => 1,
+ 'output' => \$outdata,
+ 'debug' => $defaultdebug,
+ 'errors' => \@errors,
+ }) ;
+ $t_exec += HTML::Embperl::Clock () - $t1 ;
+
+ $err = CheckError (7) if ($err == 0) ;
+
+ if (@errors != 2)
+ {
+ print "\n\n\@errors does not return correct number of errors
(is " . scalar(@errors) . ", should 2)\n" ;
+ $err = 1 ;
+ }
+
+ open FH, ">$outfile" or die "Cannot open $outfile ($!)" ;
+ print FH $outdata ;
+ close FH ;
+ $err = CmpFiles ($outfile, $org) if ($err == 0) ;
+ print "ok\n" unless ($err) ;
+ }
+
+ HTML::Embperl::Term () ;
+ }
+ }
+
+ if ((($opt_execute) || ($opt_offline)) && $looptest == 0)
+ {
+ close STDERR ;
+ open (STDERR, ">&SAVEERR") ;
+ }
+
+ #############
+ #
+ # mod_perl & cgi
+ #
+ #############
+
+ if ($opt_modperl)
+ { $loc = $embploc ; }
+ elsif ($opt_cgi)
+ { $loc = $cgiloc ; }
+ else
+ { $loc = '' ; }
+
+
+ if ($loc ne '' && $err == 0 && $loopcnt == 0 && !$opt_nostart)
+ {
+ #### Configure httpd conf file
+ $EPDEBUG = $defaultdebug ;
+
+ my $cf ;
+ my $rs = $/ ;
+ undef $/ ;
+
+ $ENV{EMBPERL_LOG} = $logfile ;
+ open IFH, $httpdconfsrc or die "***Cannot open $httpconfsrc" ;
+ $cf = <IFH> ;
+ close IFH ;
+ open OFH, ">$httpdconf" or die "***Cannot open $httpconf" ;
+ eval $cf ;
+ die "***Cannot eval $httpconf ($@)" if ($@) ;
+ close OFH ;
+ $/ = $rs ;
+
+ #### Start httpd
+ print "\n\nStarting httpd... " ;
+ unlink "$tmppath/httpd.pid" ;
+ chmod 0666, $logfile ;
+ $XX = $opt_multchild?'':'-X' ;
+
+
+ if ($EPWIN32)
+ {
+ $ENV{PATH} .= ";$EPHTTPDDLL" if ($EPWIN32) ;
+ $ENV{PERL_STARTUP_DONE} = 1 ;
+
+ Win32::Process::Create($HttpdObj, $EPHTTPD,
+ "Apache -s $XX -f $EPPATH/$httpdconf ", 0,
+ # NORMAL_PRIORITY_CLASS,
+ 0,
+ ".") or die "***Cannot start $EPHTTPD" ;
+ }
+ else
+ {
+ system ("$EPHTTPD $XX -f $EPPATH/$httpdconf &") and die "***Cannot start
$EPHTTPD" ;
+ }
+ sleep (3) ;
+ if (!open FH, "$tmppath/httpd.pid")
+ {
+ sleep (7) ;
+ if (!open FH, "$tmppath/httpd.pid")
+ {
+ sleep (7) ;
+ if (!open FH, "$tmppath/httpd.pid")
+ {
+ open (FERR, "$httpderr") ;
+ print $_ while (<FERR>) ;
+ close FERR ;
+ die "Cannot open $tmppath/httpd.pid" ;
+ }
+ }
+
+ }
+ $httpdpid = <FH> ;
+ chop($httpdpid) ;
+ close FH ;
+ print "pid = $httpdpid ok\n" ;
+
+ close ERR ;
+ open (ERR, "$httpderr") ;
+ <ERR> ; # skip first line
+
+ $httpduid = getpwnam ($EPUSER) if (!$EPWIN32) ;
+ }
+ elsif ($err == 0 && $EPHTTPD eq '')
+ {
+ print "\n\nSkiping tests for mod_perl, because Embperl is not build for it.\n"
;
+ print "Embperl can still be used as CGI-script, but 'make test' cannot test
it\n" ;
+ print "without apache httpd installed.\n" ;
+ }
+
+
+ while ($loc ne '' && $err == 0)
+ {
+ if ($loc eq $embploc)
+ { print "\nTesting mod_perl mode...\n\n" ; }
+ else
+ { print "\nTesting cgi mode...\n\n" ; }
+
+ $cookie = undef ;
+ $t_req = 0 ;
+ $n_req = 0 ;
+ $n = 0 ;
+ $testnum = -1 ;
+ foreach $url (@tests)
+ {
+ $testnum++ ;
+ ($file, $query_info, $debug, $errcnt) = split (/\?/, $url) ;
+
+ next if ($file =~ /\// && $loc eq $cgiloc) ;
+ next if ($file eq 'taint.htm' && $loc eq $cgiloc) ;
+ next if ($file eq 'reqrec.htm' && $loc eq $cgiloc) ;
+ next if (($file =~ /^exit.htm/) && $loc eq $cgiloc) ;
+ #next if ($file eq 'error.htm' && $loc eq $cgiloc && $errcnt < 16) ;
+ next if ($file eq 'varerr.htm' && $loc eq $cgiloc && $errcnt > 0) ;
+ next if ($file eq 'varerr.htm' && $looptest) ;
+ next if (($file =~ /registry/) && $loc eq $cgiloc) ;
+ next if (($file =~ /match/) && $loc eq $cgiloc) ;
+ #next if ($file eq 'http.htm' && $loc eq $cgiloc) ;
+ next if ($file eq 'chdir.htm' && $EPWIN32) ;
+ next if ($file eq 'notfound.htm' && $loc eq $cgiloc && $EPWIN32) ;
+ #next if ($file eq 'notallow.xhtm' && $loc eq $cgiloc && $EPWIN32) ;
+ next if ($file =~ /opmask/ && $EPSTARTUP =~ /_dso/) ;
+ next if ($file eq 'clearsess.htm' && !$looptest) ;
+ next if (($file =~ /EmbperlObject/) && $loc eq $cgiloc) ;
+ $errcnt = 7 if ($file eq 'varerr.htm' && $^V && $^V ge v5.6.0) ;
+ if ($file =~ /sess\.htm/)
+ {
+ next if ($loc eq $cgiloc && $EPSESSIONCLASS ne 'Embperl') ;
+ if (!$EPSESSIONVERSION)
+ {
+ $txt2 = "$file...";
+ $txt2 .= ' ' x (29 - length ($txt2)) ;
+ print "#$testnum $txt2 skip on this plattform\n" ;
+ next ;
+ }
+ }
+
+ $debug ||= $defaultdebug ;
+ $errcnt ||= 0 ;
+ $errcnt = -1 if ($EPWIN32 && $loc eq $cgiloc) ;
+ $page = "$inpath/$file" ;
+ if ($opt_nostart)
+ {
+ $notseen = 0 ;
+ }
+ elsif ($loc eq $embploc)
+ {
+ $notseen = $seen{"$loc:$page"}?0:1 ;
+ $seen{"$loc:$page"} = 1 ;
+ $notseen = 0 if ($file eq 'registry/errpage.htm') ;
+ }
+ else
+ {
+ $notseen = 1 ;
+ }
+
+ $txt = "#$testnum $file" . ($debug != $defaultdebug ?"-d $debug ":"") .
'...' ;
+ $txt .= ' ' x (30 - length ($txt)) ;
+ print $txt ;
+ unlink ($outfile) ;
+
+ $content = undef ;
+ $content = "f1=abc1&f2=1234567890&f3=" . 'X' x 8192 if ($file eq
'post.htm') ;
+ $upload = undef ;
+ if ($file eq 'upload.htm')
+ {
+ $upload = "f1=abc1\r\n&f2=1234567890&f3=" . 'X' x 8192 ;
+ $content = "Hi there!" ;
+ }
+
+ if (!$EPWIN32 && $loc eq $embploc && $file ne 'notfound.htm')
+ {
+ print "ERROR: Missing read permission for file $inpath/$file\n" if
(!-r "$inpath/$file") ;
+ local $> = $httpduid ;
+ print "ERROR: $inpath/$file must be readable by $EPUSER
(uid=$httpduid)\n" if (!-r "$inpath/$file") ;
+ }
+
+ $n_req++ ;
+ $t1 = HTML::Embperl::Clock () ;
+ $m = REQ ($loc, $file, $query_info, $outfile, $content, $upload) ;
+ $t_req += HTML::Embperl::Clock () - $t1 ;
+
+ if ($opt_memcheck)
+ {
+ my $vmsize = GetMem ($httpdpid) ;
+ $vmhttpdinitsize = $vmsize if $loopcnt == 2 ;
+ print "\#$loopcnt size=$vmsize init=$vmhttpdinitsize " ;
+ print "GROWN! at iteration = $loopcnt " if ($vmsize > $vmhttpdsize) ;
+ die "\n\nMemory problem (Total memory)" if ($opt_exitonmem && $loopcnt
> 2 && $vmsize > $vmhttpdsize) ;
+ $vmhttpdsize = $vmsize if ($vmsize > $vmhttpdsize) ;
+ CheckSVs ($loopcnt, $n) ;
+
+ }
+ if (($m || '') ne 'ok' && $errcnt == 0)
+ {
+ $err = 1 ;
+ print "ERR:$m\n" ;
+ last ;
+ }
+
+ #$errcnt++ if ($loc eq $cgiloc && $file eq 'notallow.xhtm') ;
+ $err = CheckError ($errcnt) if (($err == 0 || $file eq 'notfound.htm' ||
$file eq 'notallow.xhtm')) ;
+ if ($err == 0 && $file ne 'notfound.htm' && $file ne 'notallow.xhtm')
+ {
+ $page =~ /.*\/(.*)$/ ;
+ $org = "$cmppath/$1" ;
+ $org .= '56' if ($file eq 'varerr.htm' && $^V && $^V ge v5.6.0) ;
+
+ #print "Compare $page with $org\n" ;
+ $err = CmpFiles ($outfile, $org) ;
+ }
+
+ print "ok\n" unless ($err) ;
+ $err = 0 if ($opt_ignoreerror) ;
+ last if ($err) ;
+ $n++ ;
+ }
+
+ if ($loc ne $cgiloc)
+ {
+ $t_mp = $t_req ;
+ $n_mp = $n_req ;
+ }
+ else
+ {
+ $t_cgi = $t_req ;
+ $n_cgi = $n_req ;
+ }
+
+ if ($opt_cgi && $err == 0 && $loc ne $cgiloc && $loopcnt == 0)
+ {
+ $loc = $cgiloc ;
+ $loc = '' ; # currently disable cgi mode at all
+ }
+ else
+ {
+ $loc = '' ;
+ }
+ }
+
+ if ($defaultdebug == 0)
+ {
+ print "\n" ;
+ print "Offline: $n_offline tests takes $t_offline sec = ", int($t_offline /
$n_offline * 1000) / 1000.0, " sec per test\n" if ($t_offline) ;
+ print "mod_perl: $n_mp tests takes $t_mp sec = ", int($t_mp / $n_mp * 1000) /
1000.0 , " sec per test\n" if ($t_mp) ;
+ print "CGI: $n_cgi tests takes $t_cgi sec = ", int($t_cgi / $n_cgi *
1000) / 1000.0 , " sec per test\n" if ($t_cgi) ;
+ }
+
+ $loopcnt++ ;
+ }
+until ($looptest == 0 || $err != 0 || ($loopcnt >= $opt_loop && $opt_loop > 0))
;
+
+
+if ($err)
+ {
+ $page ||= '???' ;
+ $org ||= '???' ;
+ print "Input:\t\t$page\n" ;
+ print "Output:\t\t$outfile\n" ;
+ print "Compared to:\t$org\n" ;
+ print "Log:\t\t$logfile\n" ;
+ print "\n ERRORS detected! NOT all test have been passed successfully\n\n" ;
+ }
+else
+ {
+ print "\nAll test have been passed successfully!\n\n" ;
+ }
+
+if (defined ($line = <ERR>))
+ {
+ print "\nFound unexpected output in httpd errorlog:\n" ;
+ print $line ;
+ }
+while (defined ($line = <ERR>))
+ { print $line ; }
+close ERR ;
+
+$fatal = 0 ;
+
+
+if ($EPWIN32)
+ {
+ $HttpdObj->Kill(-1) if ($HttpdObj) ;
+ }
+else
+ {
+ system "kill `cat $tmppath/httpd.pid` 2> /dev/null" if ($EPHTTPD ne '' &&
!$opt_nokill) ;
+ }
+
+exit ($err) ;
+
+
+############################################################################################################
+
+sub find_error
+
+ {
+ my $max = @tests ;
+ my $min = 0 ;
+ my $n = $max ;
+
+ my $ret ;
+ my $cmd ;
+ my $opt = " -h "if (!$opt_modperl && !$opt_cgi && !$opt_offline &&
!$opt_execute) ;
+
+ while ($min + 1 < $max)
+ {
+ $cmd = "perl test.pl --testlib @ARGVSAVE $opt -l10 -v --exitonsv -- -$n" ;
+ print "---> min = $min max = $max\n$cmd\n" ;
+ $ret = system ($cmd) ;
+ last if ($ret == 0 && $n == $max) ;
+ $min = $n if ($ret == 0) ;
+ $max = $n if ($ret != 0) ;
+
+ $n = $min + int (($max - $min) / 2) ;
+ }
+
+ if ($max < @tests)
+ {
+ print "############## -> error at #$max $tests[$max]\n" ;
+ $cmd = "perl test.pl --testlib @ARGVSAVE $opt -l10 -v --exitonsv -- $max" ;
+ print "---> min = $min max = $max\n$cmd\n" ;
+ $ret = system ($cmd) ;
+ print "############## -> error at #$max $tests[$max]\n" ;
+ }
+
+ return ($max == @tests)?0:1 ;
+ }
+
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]