#!/usr/bin/perl # Test the ability of naming of commands. # $Id: 19-name.t 10901 2008-05-01 20:21:28Z victor $ use strict; use FindBin qw($Bin); use File::Basename; use File::Which; use lib ("$Bin/../lib"); use Log::Log4perl qw(:easy); use Test::More; use Grid::Request; use Grid::Request::Test; Log::Log4perl->init("$Bin/testlogger.conf"); my $req = Grid::Request::Test->get_test_request(); # Skip the tests if we are not using SGE. # Get the configured DRM type my $drm = $req->_config()->val($Grid::Request::HTC::config_section, "drm"); if ($drm ne "SGE") { plan skip_all => "Test written for SGE. The 'drm' is set to another grid type: $drm."; } else { my $qacct = which("qacct"); if (! defined $qacct) { plan skip_all => "Couldn't find qacct in the PATH."; } else { plan tests => 4; } } my $name = "drmaaname"; $req->command(which("echo")); $req->name($name); my @ids; eval { @ids = $req->submit_and_wait(); }; ok(! $@, "No exceptions when job is submitted via submit_and_wait().") or Grid::Request::Test->diagnose(); is(scalar(@ids), 1, "Got a single id from submit_and_wait()."); my $id = $ids[0]; if ($id) { analyze_job($id); } else { fail("Unable to determine job name because no job was submitted."); fail("Unable to check that the job name had the correct value."); } ########################################################################### sub analyze_job { my $id = shift; # TODO: From here down, the logic to determine if setting the # name really worked, is DRM dependent, specifically SGE dependent. # Skip the tests if we are not using SGE. # SGE exhibits a lag between the time the job finishes (per drmaa) # and the time the data about the job is available to qacct. We # therefore poll and wait for the results to be available. my $ready = wait_for_qacct($id); if ($ready) { my $qacct = `qacct -j $id`; my @q_output = split(/\n/, $qacct); my @name = grep { m/jobname/ } @q_output; ok(scalar(@name) == 1, "Got only one line with job name."); my $qacct_name_line = $name[0]; chomp($qacct_name_line); my @out = split(/\s/, $qacct_name_line); my $out_name = $out[-1]; is($out_name, $name, "Job got the correct name."); } else { print STDERR "Unable to query results of job using qacct.\n"; } } sub wait_for_qacct { my $id = shift; sleep 1; my $ready = 0; for my $attempt qw(1 2 3 4) { sleep $attempt; system("qacct -j $id 1>/dev/null 2>/dev/null"); my $exit_value = $? >> 8; if ($exit_value == 0) { $ready = 1; last; } } return $ready; }