#!/usr/bin/perl # # Copyright (C) 2001-2018 Graeme Walker # # 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 . # === # # TestServer.pm # # A wrapper for running the "emailrelay-test-server" program. # # See also: emailrelay_test_server.cpp # # Synopsis: # # $TestServer::bin_dir = "." ; # my $ts = new TestServer( 10025 ) ; # $ts->run() ; # $ts->kill() ; # $ts->cleanup() ; # kill 15 , @TestServer::pid_list ; # use strict ; use FileHandle ; use System ; package TestServer ; our @pid_list = () ; our $bin_dir = "." ; sub new { my ( $classname , $port ) = @_ ; $port = defined($port) ? $port : 10025 ; my %me = ( m_port => $port , m_exe => System::exe( $bin_dir , "emailrelay-test-server" ) , m_logfile => System::tempfile("test-server.out") , m_pidfile => System::tempfile("test-server.pid") , m_pid => undef , ) ; my $this = bless \%me , $classname ; $this->_check() ; return $this ; } sub exe { return shift->{m_exe} } sub pid { return shift->{m_pid} } sub port { return shift->{m_port} } sub _check { my ( $this ) = @_ ; if( ! -x $this->exe() ) { die "invalid test server executable [".$this->exe()."]" ; } System::unlink( $this->{m_pidfile} ) if -f $this->{m_pidfile} ; if( -f $this->{m_pidfile} ) { die "cannot remove old pidfile [".$this->{m_pidfile}."]" ; } } sub run { my ( $this , $sw , $wait_cs ) = @_ ; $sw = "" if !defined($sw) ; $wait_cs ||= 50 ; my $log = $this->{m_logfile} ; my $cmd = System::mangledpath($this->exe()) . " --port " . $this->port() . " --pid-file " . $this->{m_pidfile} . " $sw" ; my $full_cmd = System::commandline( $cmd , { stdout => $log , stderr => $log , background => 1 } ) ; System::log_( "running [$full_cmd]" ) ; system( $full_cmd ) ; $this->{m_pid} = System::waitForPid( $this->{m_pidfile} ) ; return $this->{m_pid} && System::processIsRunning($this->{m_pid}) ; } sub kill { my ( $this ) = @_ ; Check::numeric( $this->pid() ) ; System::kill_( $this->pid() ) ; } sub cleanup { my ( $this ) = @_ ; if( $this->pid() ) { $this->kill() } System::unlink( $this->{m_pidfile} ) ; System::unlink( $this->{m_logfile} ) ; } 1 ;