#! /usr/bin/perl # hacked together by bsharma@netscape.com and phillip@netscape.com use Cwd; use FileHandle; use Benchmark; #some vars that depend on the location of apprunner. $layout_time = 4; # seconds after document is loaded successfully before apprunner is killed $test_duration = 30; # seconds before i deem this url timed out # TODO: get apprunner working with relative paths. the problem with # this is LD_LIBRARY_PATH and MOZILLA_FIVE_HOME want absolute # paths, so we need to get the pwd and replace 'tools/tests/unix' # with 'dist/bin' -- then we're golden. #$apprunner_bin = '/u/phillip/seamonkey/linux/package'; chop($start_dir = `pwd`); $apprunner_bin = '../../../dist/bin'; chdir($apprunner_bin); # need the absolute path, not the relative one chop($apprunner_bin = `pwd`); #nothing else needs to be changed $apprunner = "$apprunner_bin/apprunner"; $apprunner_samples = "$apprunner_bin/res/samples"; $apprunner_log = $start_dir . '/smoketest.log'; #$mail_log = '/tmp/maillog.txt'; #open (LOG_FILE, ">> $apprunner_log"); #print LOG_FILE "Starting directory is $start_dir \n"; #print LOG_FULE "apprunner binary is $apprunner \n"; #print LOG_FULE "Samples directory is $apprunner_samples \n"; #close (LOG_FILE); # we fork and launch apprunner in a few spots around here, so let's define # this just once: $ENV{'MOZILLA_FIVE_HOME'}="$apprunner_bin"; $ENV{'LD_LIBRARY_PATH'}="/usr/lib:/lib:$apprunner_bin"; # here are a few subroutines we use: # get_build_date - look through navigator.xul for the build id (1999-04-18-08) # returns the string # get_date - returns a preformatted string containing the date and time # test_url - takes a string url as an optional parameter $t0 = new Benchmark; &main(); $t1 = new Benchmark; $launchtimea = timediff($t1,$t0); @launchtime = split (/ /, timestr($launchtimea)); $sec = $launchtime[0]; use integer; $hours = $sec / 3600; $sec -= $hours * 3600; $mins = $sec / 60; $sec -= $mins * 60; print "the whole Smoketest took $hours hours, $mins mins, and $sec seconds.\n"; # so it begins sub main { open (REPORT_FILE, '>report.html'); REPORT_FILE->autoflush(); print (REPORT_FILE "Smoke Test Report File \n"); print (REPORT_FILE "\n"); print (REPORT_FILE "

Seamonkey Build Smoke Tests Report\n"); print (REPORT_FILE "
Linux

\n"); print (REPORT_FILE "
\n"); print (REPORT_FILE &get_date); print (REPORT_FILE "
\n
\n
\n Build Number: " . &get_build_date . "
\n
\n
\n"); print "testing launch"; $load_result = ""; $ret = &test_url; $load_result = "NOT" if ( $ret eq 'E1-FAILED' ); $load_result = "NOT" if ( $ret eq 'E2-FAILED' ); $load_result = "NOT" if ( $ret eq 'E3-FAILED' ); $load_result = "NOT" if ( $ret eq 'E4-FAILED' ); if ( $load_result eq "NOT" ) { print "FAILED\n"; } else { print "OK\n"; } print (REPORT_FILE "
\n"); # load_result tells you if the test failed print (REPORT_FILE "Apprunner $load_result Loaded Successfully"); print (REPORT_FILE "
\n"); print (REPORT_FILE "
\n"); print (REPORT_FILE "
\n"); print (REPORT_FILE "
\n"); print (REPORT_FILE "Loading Sites Results"); print (REPORT_FILE "
\n"); &get_url_list; my $i; my $style; # launch apprunner once for every browser test in the url_list ################################################################################ foreach $cur_url (@url_list) { $load_result = ""; print "$cur_url"; $ret = &test_url( $cur_url ); $load_result = "NOT" if ( $ret eq 'E1-FAILED' ); $load_result = "NOT" if ( $ret eq 'E2-FAILED' ); $load_result = "NOT" if ( $ret eq 'E3-FAILED' ); $load_result = "NOT" if ( $ret eq 'E4-FAILED' ); # print in red if there's a failure if ( $load_result eq "NOT" ) { $style = "style='color: red;'"; print "FAILED\n"; } else { $style = ""; print "OK\n"; } print (REPORT_FILE "\n$cur_url $load_result Loaded Successfully\n
\n"); } # now it's time to check mail # not yet functional ################################################################################ #open (LOG_FILE, "< $mail_log"); #while () #{ # chop; # $load_result = "NOT"; # if (/Mailbox Done/){ # $load_result = ""; # } # print (REPORT_FILE "\n$load_result\n
\n"); #} # close the report, and we're done! ################################################################################ print (REPORT_FILE "
\n
\n
\n
\n"); print (REPORT_FILE &get_date()); print (REPORT_FILE "
\n"); print (REPORT_FILE "
\n
\n
\n
\n
\n"); print (REPORT_FILE "\n"); print (REPORT_FILE "\n"); close (REPORT_FILE); } ################################################################################ ################################################################################ ##### Subroutines go here . . . ################################################ ################################################################################ ################################################################################ # # my_kill -- takes a pid or the string "apprunner". # essentially calls `kill -9 $pid`. # the reason this exists is because i can't figure # out how to kill apprunner yet, since i can't grab # it's pid. (it's harder than you think.) # when i figure it out, i'll fix it here, then all will # be great. until then, all apprunners are killed!) ################################################################ sub my_kill{ local $pid = shift || ""; if ($pid eq ""){ return; } elsif ($pid eq "apprunner"){ system ("killall -9 apprunner"); } else { kill 9, $pid; } } # # test_url -- takes a url as a parameter and launches apprunner # with it. returns the page-loading-performance as # a string of numbers with a floating point *IF* # the page actually loads. if the page doesn't load, # it returns the string 'En-FAILED', with n in 1..3 ################################################################ sub test_url { $| = 1; # gotta love autoflushing local $reaperchild; local $url = shift || ""; if( $url ne "" ) { $url = "-url " . $url; } local $run_time = 'E2-FAILED'; if ( $reaperchild = fork ) { ## ok, the parent spins until apprunner ## loads a doc successfully or unsuccessfully, or ## until the reaperchild kills apprunner open STATUS, "$apprunner $url 2>&1 |"; open LOG_FILE, ">> $apprunner_log"; LOG_FILE->autoflush(); unless ($url eq ""){ print LOG_FILE "testing url: $url\n" } while (){ print LOG_FILE; # Document: Done (7.918 secs) if (/Document: Done \((\d*\.\d*) secs/) { $run_time = $1; last; # we can quit if we get a Document: Done message } if (/loaded successfully/) { if ($run_time eq 'E2-FAILED') { $run_time = -1 ; } last; # we can quit if we get a loaded successfully message } $run_time = 'E3-FAILED' and last if (/Error loading URL/); } # now that the testing ugliness is over, we make # sure everybody is dead. then we can return our # performance findings. print "|"; sleep $layout_time; &my_kill( $reaperchild ); &my_kill( "apprunner" ); # wait for reaperchild to die if ( kill 0 => $reaperchild ){ waitpid $reaperchild, 0; } if ( -f "timeout.txt" ) { unlink "timeout.txt"; $run_time = 'E1-FAILED'; } if ( $run_time eq "0" ){ print "error, runtime == 0. this is a problem with Timer:Init() being called with a bogus value"; $run_time = 'E4-FAILED'; } unless ($url eq ""){ print LOG_FILE "done testing url: $url\n" } close LOG_FILE; return $run_time; } else { # child waits for a while, then kills apprunner # the test must go on. for( $j=0; $j<$test_duration; $j++){ sleep 1 && print "."; } print "don't fear the reaper, man\n" and sleep 1; # yuck. killall is very bad for solaris. system ("killall -9 apprunner"); system ("echo timeout > timeout.txt"); exit 0; } } # # get_date -- returns a string of the current time and date # formatted for your enjoyment. ################################################################ sub get_date { ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)= localtime; %weekday= ( "1", "Monday", '2', 'Tuesday', '3', 'Wednesday', '4', 'Thursday', '5', 'Friday', '6', 'Saturday', '7', 'Sunday', ); $mon += 1; return sprintf "%s %02d/%02d/19%02d %02d:%02d:%02d", $weekday{$wday},$mon,$mday,$year,$hour,$min,$sec; } # # get_build_date -- returns apprunner's build string, # e.g. '1999-05-18-07' ################################################################ sub get_build_date { open (XUL_FILE, "< $apprunner_samples/navigator.xul"); $BuildNo = ""; $LineList; while () { chop; if (/Build ID/) { @LineList = split / /; $BuildNo = $LineList[5]; } } close( XUL_FILE ); $BuildNo =~ s/[<>]/ /g; return $BuildNo; } # # get_url_list -- opens the $url file and loads up all the urls. ################################################################ sub get_url_list { local $url = shift || $start_dir . "/url.txt"; my $i = 0; open (URL_FILE, "< $url"); while () { chop; $url_list[$i++] = $_; } } __END__