The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*-Perl-*- Test Harness script for Bioperl
# 	$Id$	

# malcolm_cook@stowers.org: this test is in a separate file from
# RemoteBlast.t (on which it is modelled) since there is some sort of
# side-effecting between the multiple remote blasts that is causing
# this test to fail, if it comes last, or the other test to fail, if
# this one comes first.  THIS IS A BUG EITHER IN REMOTE BLAST OR MY
# UNDERSTANDING, i.e. of how to initialize it.

use strict;

BEGIN {
    use lib '.';
    use Bio::Root::Test;

    test_begin(-tests => 7,
               -requires_modules => [qw(IO::String LWP LWP::UserAgent)],
               -requires_networking => 1);

    use_ok('Bio::Tools::Run::RemoteBlast');
}

my $v = test_debug();
my $inputfilename = test_input_file('ecolitst.fa');
ok( -e $inputfilename);	

my $remote_rpsblast = Bio::Tools::Run::RemoteBlast->new
  ('-verbose'    => test_debug(),
   '-prog'       => 'blastp',
   '-data'       => 'cdsearch/cdd',
   '-readmethod' => 'blasttable',
   '-expect'     => '1e-10',
  );

$remote_rpsblast->retrieve_parameter('ALIGNMENT_VIEW', 'Tabular');

# This is the key to getting job run using rpsblast:
$Bio::Tools::Run::RemoteBlast::HEADER{'SERVICE'} = 'rpsblast'; 

my $attempt = 1;

SKIP: {
    my $status;
    eval{
	$status = $remote_rpsblast->submit_blast($inputfilename);
    };
    
    ok($status,'rpsblast blasttable submitted');
    
    skip("Error accessing remote BLAST interface: $@", 3) if $@;
    
    my @rids = $remote_rpsblast->each_rid;
    is(@rids, 1, 'should only be one RID');
    skip("Wrong number of RIDs: ".scalar(@rids), 2) if @rids != 1;
    
    print STDERR "waiting [$rids[0]]..." if( $v > 0 );
    my $rc;
    while (defined($rc = $remote_rpsblast->retrieve_blast($rids[0]))) {
	if ( !ref($rc) ) {
	    if ( $rc < 0 ) {
		skip("need a better solution for when 'Server failed to return any data'",2);
	    }
	    sleep 5;
	    print STDERR "Retrieval attempt: $attempt\n" if ( $v > 0 );
	    $attempt++ < 10 ? next : last;
	} else {
	    last
	}
    }
    $remote_rpsblast->remove_rid($rids[0]);
    
    if ($rc) {
	ok(1,'retrieve_blast succeeded');
	$remote_rpsblast->remove_rid($rids[0]);
	my $count = 0;
	isa_ok($rc, 'Bio::SearchIO');
	while (my $result = $rc->next_result) {
	    while ( my $hit = $result->next_hit ) {
		$count++;
		next unless ( $v > 0);
		print "sbjct name is ", $hit->name, "\n";
		while ( my $hsp = $hit->next_hsp ) {
		    print "score is ", $hsp->bits, "\n";
		} 
	    }
	}
	cmp_ok($count, '>=', 45, 'HSPs returned');
    } elsif ($attempt > 10) {
	# have a test fail here (there should not be repeated failed attempts to
	# get reports)
	
	ok(0,'Exceeded maximum attempts on server to retrieve report');
	skip("Timeout, did not return report after ".($attempt - 1)." attempts", 2);
    } else {
	# have a test fail here (whatever is returned should be eval as true and
	# be a SearchIO)
	
	ok(0,"Other problem on remote server, no report returned: $rc");
	skip('Possible remote server problems', 1);
    }
}

# To be a good citizen, we should restore the default NCBI service
# ('plain') for future tests
$Bio::Tools::Run::RemoteBlast::HEADER{'SERVICE'} = 'plain';