emailrelay/test/Helper.pm
Graeme Walker c957ef5cf5 v2.0
2018-06-15 12:00:00 +00:00

138 lines
2.9 KiB
Perl

#!/usr/bin/perl
#
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# ===
#
# Helper.pm
#
# A wrapper for running test helper programs such as
# "emailrelay-test-scanner".
#
# Synopsis:
#
# $Helper::bin_dir = "." ;
# my $helper = new Helper( "emailrelay-test-scanner" ) ;
# $helper->run() ;
# $helper->kill() ;
# open $helper->logfile() ;
# $helper->cleanup() ;
# kill 15 , @Helper::pid_list() ;
#
use strict ;
use FileHandle ;
use System ;
package Helper ;
our @pid_list = () ;
our $bin_dir = "." ;
sub new
{
my ( $classname , $exe , $port ) = @_ ;
die if !defined($exe) ;
$port ||= 10010 ;
( my $short_name = $exe ) =~ s/emailrelay-test-// ;
$short_name =~ s/\.[a-z]*$// ;
my $this = bless {
m_short_name => $short_name ,
m_exe_name => $exe ,
m_port => $port ,
m_logfile => ".tmp.$short_name.out.$$" ,
m_pidfile => ".tmp.$short_name.pid.$$" ,
m_pid => undef ,
} , $classname ;
$this->_check() ;
return $this ;
}
sub port
{
my ( $this ) = @_ ;
return $this->{'m_port'} ;
}
sub logfile
{
my ( $this ) = @_ ;
return $this->{'m_logfile'} ;
}
sub _check
{
my ( $this ) = @_ ;
if( ! -x $this->exe() )
{
my $name = $this->{m_short_name} ;
die "no $name executable [".$this->exe()."]" ;
}
}
sub exe
{
my ( $this ) = @_ ;
return System::exe( $bin_dir , $this->{m_exe_name} ) ;
}
sub run
{
my ( $this ) = @_ ;
my $port = $this->{'m_port'} ;
my $pidfile = $this->{'m_pidfile'} ;
my $logfile = $this->{'m_logfile'} ;
my $exe = $this->exe() ;
my $cmd = System::mangledpath($exe) . " --port $port --log --log-file $logfile --debug --pid-file $pidfile" ;
my $full = System::commandline( $cmd , { background => 1 } ) ;
System::log_( "[$full]" ) ;
system( $full ) ;
for( my $i = 0 ; $i < 200 ; $i++ )
{
System::sleep_cs( 2 ) ;
if( -f $pidfile ) { next }
}
my $f = new FileHandle("< $pidfile") ;
my $line = <$f> ; chomp $line ;
$this->{'m_pid'} = $line ;
push @pid_list , $this->{'m_pid'} ;
}
sub pid
{
my ( $this ) = @_ ;
return $this->{'m_pid'} ;
}
sub kill
{
# kill and wait to die
my ( $this , $signal__not_used , $timeout_cs ) = @_ ;
System::kill_( $this->pid() , $timeout_cs ) ;
System::waitpid( $this->pid() ) ;
}
sub cleanup
{
my ( $this ) = @_ ;
System::unlink( $this->{'m_pidfile'} ) ;
System::unlink( $this->{'m_logfile'} ) ;
}
1 ;