diff options
Diffstat (limited to 'ACE/bin/PerlACE/ProcessLVRT.pm')
-rw-r--r-- | ACE/bin/PerlACE/ProcessLVRT.pm | 375 |
1 files changed, 0 insertions, 375 deletions
diff --git a/ACE/bin/PerlACE/ProcessLVRT.pm b/ACE/bin/PerlACE/ProcessLVRT.pm deleted file mode 100644 index edd0d9f81a4..00000000000 --- a/ACE/bin/PerlACE/ProcessLVRT.pm +++ /dev/null @@ -1,375 +0,0 @@ -# $Id$ -# -# ProcessLVRT - how to run ACE+TAO tests on a LabVIEW RT target. -# Tests on LabVIEW RT are not executables - LabVIEW RT can't start plain -# executables; the tests are built/packaged as DLLs and loaded and executed -# from a DLL loaded at LabVIEW RT boot time. The DLL on the target listens -# on a TCP port (8888 by default) for connections from the host. Host requests -# actions using text commands to the target. -# -# NOTE: This module requires the Net-Telnet Perl module. -# -# We can FTP files to and from the LabVIEW target, but there's no NFS or -# SMB shares. - -package PerlACE::ProcessLVRT; -our @ISA = "PerlACE::Process"; - -use strict; -use Cwd; -use English; -use File::Basename; -use Net::FTP; -use Net::Telnet; -use POSIX qw(:time_h); - -$PerlACE::ProcessLVRT::ExeSubDir = './'; - -### Check for -ExeSubDir commands, store the last one -my @new_argv = (); - -for(my $i = 0; $i <= $#ARGV; ++$i) { - if ($ARGV[$i] eq '-ExeSubDir') { - if (defined $ARGV[$i + 1]) { - $PerlACE::ProcessLVRT::ExeSubDir = $ARGV[++$i].'/'; - } - else { - print STDERR "You must pass a directory with ExeSubDir\n"; - exit(1); - } - } - else { - push @new_argv, $ARGV[$i]; - } -} -@ARGV = @new_argv; - -### Constructor and Destructor - -sub new -{ - my $proto = shift; - my $class = ref ($proto) || $proto; - my $self = {}; - - $self->{EXECUTABLE} = shift; - $self->{ARGUMENTS} = shift; - $self->{RUNNING} = 0; - $self->{IGNOREEXESUBDIR} = 1; - $self->{FTP} = undef; - $self->{TARGET} = undef; - $self->{REBOOT_CMD} = $ENV{"ACE_REBOOT_LVRT_CMD"}; - if (!defined $self->{REBOOT_CMD}) { - $self->{REBOOT_CMD} = 'I_Need_A_Reboot_Command'; - } - $self->{REBOOT_TIME} = $ENV{"ACE_LVRT_REBOOT_TIME"}; - if (!defined $self->{REBOOT_TIME}) { - $self->{REBOOT_TIME} = 200; - } - - bless ($self, $class); - return $self; -} - -sub DESTROY -{ - my $self = shift; - - if ($self->{RUNNING} == 1) { - print STDERR "ERROR: <", $self->{EXECUTABLE}, - "> still running upon object destruction\n"; - $self->Kill (); - } - - # Reboot if needed; set up clean for the next test. - if ($self->{NEED_REBOOT} == 1 && $self->{REBOOT_CMD}) { - print STDERR "Attempting to reboot target...\n"; - system ($self->{REBOOT_CMD}); - sleep ($self->{REBOOT_TIME}); - } - - if (defined $self->{FTP}) { - $self->{FTP}->close; - } - if (defined $self->{TARGET}) { - $self->{TARGET}->close; - } -} - -############################################################################### - -# Adjust executable name for LabVIEW RT testing needs. These tests are DLLs. - -sub Executable -{ - my $self = shift; - - if (@_ != 0) { - $self->{EXECUTABLE} = shift; - } - - my $executable = $self->{EXECUTABLE}; - - my $basename = basename ($executable); - my $dirname = dirname ($executable). '/'; - - $executable = $dirname.$PerlACE::Process::ExeSubDir.$basename.".DLL"; - $executable =~ s/\//\\/g; # / <- # color coding issue in devenv - - return $executable; -} - -sub Arguments -{ - my $self = shift; - - if (@_ != 0) { - $self->{ARGUMENTS} = shift; - } - - return $self->{ARGUMENTS}; -} - -sub CommandLine () -{ - my $self = shift; - - my $commandline = "run " . basename($self->Executable(), ".dll"); - if (defined $self->{ARGUMENTS}) { - $commandline .= ' '.$self->{ARGUMENTS}; - } - - return $commandline; -} - -############################################################################### - -# Spawn the process and continue. - -sub Spawn () -{ - my $self = shift; - - if ($self->{RUNNING} == 1) { - print STDERR "ERROR: Cannot Spawn: <", $self->Executable (), - "> already running\n"; - return -1; - } - - if (!defined $self->{EXECUTABLE}) { - print STDERR "ERROR: Cannot Spawn: No executable specified\n"; - return -1; - } - - if ($self->{IGNOREEXESUBDIR} == 0) { - if (!-f $self->Executable ()) { - print STDERR "ERROR: Cannot Spawn: <", $self->Executable (), - "> not found\n"; - return -1; - } - } - - my $targethost; - if (defined $ENV{'ACE_RUN_LVRT_TGTHOST'}) { - $targethost = $ENV{'ACE_RUN_LVRT_TGTHOST'}; - } - else { - print STDERR "You must define target hostname/IP with ", - "ACE_RUN_LVRT_TGTHOST\n"; - return -1; - } - my $targetport; - if (defined $ENV{'ACE_RUN_LVRT_TGTPORT'}) { - $targetport = $ENV{'ACE_RUN_LVRT_TGTPORT'}; - } - else { - $targetport = 8888; - } - - my $status = 0; - - my $program = $self->Executable (); - my $cwdrel = dirname ($program); - if (length ($cwdrel) > 0) { - $cwdrel = File::Spec->abs2rel( cwd(), $ENV{"ACE_ROOT"} ); - } - else { - $cwdrel = File::Spec->abs2rel( $cwdrel, $ENV{"ACE_ROOT"} ); - } - - $self->{FTP} = new Net::FTP ($targethost); - if (!defined $self->{FTP}) { - print STDERR "$@\n"; - $self->{NEED_REBOOT} = 1; - return -1; - } - $self->{FTP}->login("",""); - $self->{FTP}->cwd("/ni-rt"); - $self->{FTP}->binary(); - $self->{FTP}->put($program); - - $self->{TARGET} = new Net::Telnet(Timeout => 600, Errmode => 'return'); - if (!$self->{TARGET}->open(Host => $targethost, Port => $targetport)) { - print STDERR "ERROR: target $targethost:$targetport: ", - $self->{TARGET}->errmsg(), "\n"; - $self->{NEED_REBOOT} = 1; - $self->{FTP}->delete($program); - return -1; - } - my $cmdline = $self->CommandLine(); - if (defined $ENV{'ACE_TEST_VERBOSE'}) { - print "-> $cmdline\n"; - } - $self->{TARGET}->print("$cmdline"); - my $reply; - $reply = $self->{TARGET}->getline(); - if (defined $ENV{'ACE_TEST_VERBOSE'}) { - print "<- $reply\n"; - } - if ($reply eq "OK\n") { - $self->{RUNNING} = 1; - return 0; - } - print STDERR "ERROR: can't $cmdline: " . $reply . "\n"; - $self->{FTP}->delete($program); - $self->{NEED_REBOOT} = 1; - return -1; -} - - -# Wait for the process to exit or kill after a time period - -sub WaitKill ($) -{ - my $self = shift; - my $timeout = shift; - - my $status = $self->TimedWait ($timeout); - - if ($status == -1) { - print STDERR "ERROR: $self->{EXECUTABLE} timedout\n"; - $self->{NEED_REBOOT} = 1; - $self->Kill (); - } - - $self->{RUNNING} = 0; - - # Now get the log file from the test, and delete the test from the target. - # The FTP session should still be open. - my $program = $self->Executable (); - my $logname = basename($program,".dll") . ".log"; - $program = basename($program); - $self->{FTP}->delete($program); - $self->{FTP}->cwd("\\ni-rt\\system\\log"); - $self->{FTP}->get($logname,"log\\$logname"); - $self->{FTP}->delete($logname); - - return $status; -} - - -# Do a Spawn and immediately WaitKill - -sub SpawnWaitKill ($) -{ - my $self = shift; - my $timeout = shift; - - if ($self->Spawn () == -1) { - return -1; - } - - return $self->WaitKill ($timeout); -} - -sub TerminateWaitKill ($) -{ - my $self = shift; - my $timeout = shift; - - if ($self->{RUNNING}) { - print STDERR "INFO: $self->{EXECUTABLE} being killed.\n"; - $self->Kill(); - } - - return $self->WaitKill ($timeout); -} - -sub Kill () -{ - my $self = shift; - - if ($self->{RUNNING}) { - if (defined $ENV{'ACE_TEST_VERBOSE'}) { - print "-> kill\n"; - } - $self->{TARGET}->print("kill"); - # Just wait for any reply; don't care what it is. - my $reply = $self->{TARGET}->getline(); - if (defined $ENV{'ACE_TEST_VERBOSE'}) { - print "<- $reply\n"; - } - } - - $self->{RUNNING} = 0; -} - -# Wait until a process exits. -# return -1 if the process is still alive. -sub Wait ($) -{ - my $self = shift; - my $timeout = shift; - if (!defined $timeout || $timeout < 0) { - if (defined $ENV{'ACE_TEST_VERBOSE'}) { - print "-> wait\n"; - } - $self->{TARGET}->print("wait"); - my $reply = $self->{TARGET}->getline(); - $self->{RUNNING} = 0; - if (defined $ENV{'ACE_TEST_VERBOSE'}) { - print "<- $reply\n"; - } - return 0+ $reply; - } else { - return TimedWait($self, $timeout); - } - -} - -sub TimedWait ($) -{ - my $self = shift; - my $timeout = shift; - my $reply; - if (!$self->{RUNNING}) { - return -1; - } - -CHECK: - while ($timeout > 0) { - $self->{TARGET}->print ("status"); - if (defined $ENV{'ACE_TEST_VERBOSE'}) { - print "-> status\n"; - } - $reply = $self->{TARGET}->getline(Timeout => $timeout); - if (!defined $reply) { - last CHECK; - } - if (defined $ENV{'ACE_TEST_VERBOSE'}) { - print "<- $reply\n"; - } - if ($reply =~ /^RUNNING/) { - sleep 2; - $timeout -= 2; - next CHECK; - } - # Have a status; return it. - $self->{RUNNING} = 0; - return 0+ $reply; - } - - return -1; -} - -1; |