#!/usr/bin/perl select STDOUT; $|=1; $ps = "/bin/ps"; $usr{"hollingd"} = "Dave H."; $username = `whoami`; chomp ($username); #$testbase = "/cs/hollingd/public.html/netprog/hw/hw2/testcode"; #$testbase = "/Users/hollingd/Desktop/Netprog/proj2/testcode/testcode"; $testbase = "/cs/hollingd/netprog/hw2/testcode"; $wrap = "$testbase/wrap.pl"; $testclient = "$testbase/testclient"; $testdir = "$testbase/tests"; # clear zombie processes first $tmp=`$ps -U $username -o rss,pid,state | grep Z | awk '{print \$2}'`; chomp ($tmp); if ($tmp) { print ("Zombie processes exist. Clean them first.\n"); exit; } my $grader = $usr{$username}; my $i; if (-e "grading.results") { system ("mv grading.results grading.results.old"); } open(G,">grading.results") || die $!; $zombie = 0; $memleak = 0; sub logout { print @_; print G @_; } sub DoTest { my $pid; my $pid2; my $tmp; my $pass = 0; my $failonce = 0; my $test = shift; # clean up in case logout ("Cleaning proxy processes before running test.\n"); my $t1 = `$ps -U $username -o pid,comm | grep proxy | awk '{print \$1}'`; chomp ($t1); my @t2 = split (/\s+/, $t1); for (@t2) { system ("kill", "-9", "$_") if $_; } logout "Doing test $test ... \n"; $port = int (rand (64000)) + 1025; system ("./proxy $port $filter &"); $username=`whoami`; chomp ($username); # wait for proxy to start my $try = 0; do { logout ("Waiting for proxy to start ... "); $pid = `$ps -U $username -o comm,pid | grep proxy | awk '{print \$2}'`; chomp ($pid); sleep 1 if (! $pid); ++ $try; } while (! $pid && $try < 20); if ($try == 20) { logout ("Proxy failed to start.\n"); return -1; } else { logout ("OK.\n"); } # $memsize=`/usr/bin/ps -p $pid -o vsz=`; # chomp ($memsize); if ($pid2 = open(CHILD, "-|")) { while () { logout $_; } close (CHILD); waitpid ($pid2, 0); } else { die "== Proj 2 grading test cannot fork: $!" unless defined $pid2; $SIG{INT} = "IGNORE"; exec("$wrap $testclient 127.0.0.1 $port $testdir/$test") or die "== Proj 2 grading test cannot exec program: $!\n"; } sleep 1; if ($test eq "image") { $memsize=`$ps -p $pid -o vsz=`; chomp ($memsize); } # Check for mem and zombie only if test is stress if ($test eq "stress") { $memsize2=`$ps -p $pid -o vsz=`; chomp ($memsize2); if ($memsize2 > $memsize + 200) { $memleak = 1; logout "== Proj 2 grading test : memory leak found. $memsize, $memsize2\n"; } $tmp=`$ps -U $username -o pid,comm,state | grep Z`; chomp ($tmp); if ($tmp) { $zombie = 1; logout "== Proj 2 grading test : zombie process found.\n"; logout "$tmp\n"; } } # clean up in case # print ("Cleaning proxy processes.\n"); kill 9 => $pid; $t1 = `$ps -U $username -o pid,comm | grep proxy | awk '{print \$1}'`; chomp ($t1); @t2 = split (/\s+/, $t1); for (@t2) { system ("kill", "-9", "$_") if $_; } sleep 1; return $pass if ($pass < 0) ; if ($test =~ /stress/) { return $failonce ? 0 : $pass; } return $pass; } if ($ARGV[0]) { printf("Test $ARGV[0]\n"); $filter = "yahoo.com www.google.com"; DoTest($ARGV[0]); exit; } @tests = ( "doc", "image", "error", "tcpread", "epipe", "smallpost", "bigpost", "garbage", "badmethod", "nonsense", "servernostat", "servernulls", "stress" ); foreach $i (@tests) { $filter = "yahoo.com www.google.com"; DoTest($i); } $filter = "yahoo.com www.google.com"; DoTest("filterallow"); DoTest("filterdeny"); close(G); exit;