#-*-Perl-*-
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.t'
use strict;
use warnings;
use Module::Build;
use Bio::Root::IO;
use File::Path 'rmtree';
use IO::String;
use CGI;
use FindBin '$Bin';
use constant TEST_COUNT => 47;
use constant CONF_FILE => "$Bin/testdata/conf/GBrowse.conf";
use constant DEBUG => 0;
my $PID;
BEGIN {
print STDERR "Sometimes this test gets 'stuck'. If this happens, kill the test and Build test again.\n";
# to handle systems with no installed Test module
# we include the t dir (where a copy of Test.pm is located)
# as a fallback
eval { require Test; };
if( $@ ) {
use lib 't';
}
use Test;
plan test => TEST_COUNT;
$PID = $$;
rmtree "/tmp/gbrowse_testing";
rmtree "/tmp/gbrowse";
}
$SIG{INT} = sub {exit 0};
%ENV = ();
$ENV{GBROWSE_DOCS} = $Bin;
$ENV{TMPDIR} = '/tmp/gbrowse_testing';
chdir $Bin;
use lib "$Bin/../lib";
use Bio::Graphics::Browser2;
use Bio::Graphics::Browser2::Render::HTML;
use LWP::UserAgent;
use HTTP::Request::Common;
use Storable 'nfreeze','thaw';
use Bio::Graphics::Browser2::Render::Slave;
use lib "$Bin/testdata";
use TemplateCopy; # for the template_copy() function
# alignments requires the server at 8100
my $alignment_server = Bio::Graphics::Browser2::Render::Slave->new(LocalPort=>'dynamic');
$alignment_server->debug(DEBUG);
$alignment_server->run();
# cleavage sites track requires the server at 8101
my $cleavage_server = Bio::Graphics::Browser2::Render::Slave->new(LocalPort=>'dynamic');
$cleavage_server->debug(DEBUG);
$cleavage_server->run();
# rewrite the template config files
for ('volvox_final.conf','yeast_chr1.conf') {
template_copy("testdata/conf/templates/$_",
"testdata/conf/$_",
{'$REMOTE1'=>"http://localhost:".$alignment_server->listen_port,
'$REMOTE2'=>"http://localhost:".$cleavage_server->listen_port});
}
# Test remote rendering
my $server = Bio::Graphics::Browser2::Render::Slave->new(LocalPort=>'dynamic');
ok($server);
$server->debug(DEBUG);
my $server_pid = $server->run;
ok($server_pid);
sleep 1; # give slave renderers a chance to settle down
$ENV{REQUEST_URI} = 'http://localhost/cgi-bin/gbrowse/volvox';
$ENV{PATH_INFO} = '/volvox';
$ENV{REQUEST_METHOD} = 'GET';
$CGI::Q = new CGI('name=ctgA:1..20000;label=Clones-Motifs-Transcripts;cache=1');
# this is the standard initialization, ok?
my $globals = Bio::Graphics::Browser2->new(CONF_FILE);
my $session = $globals->session;
my $source = $globals->create_data_source('volvox');
my $render = Bio::Graphics::Browser2::Render::HTML->new($source,$session);
$render->init_database;
$render->init_plugins;
$render->update_state;
$render->segment; # this sets the segment
# this is what is needed to invoke the remote renderer, ok?
my @labels = $render->detail_tracks;
my $settings = $render->state;
my $lang = $render->language;
my $port = $server->listen_port;
my $request = POST("http://localhost:$port/",
Content_Type => 'form-data',
Content =>
[
tracks => nfreeze(\@labels),
settings => nfreeze($settings),
datasource => nfreeze($source),
data_name => $source->name,
data_mtime => $source->mtime,
language => nfreeze($lang),
panel_args => nfreeze({}),
operation => 'render_tracks',
]);
for (1..3) {
my $ua = LWP::UserAgent->new;
my $response = $ua->request($request);
ok($response->is_success,1,$response->as_string);
my $skipit = !$response->is_success;
skip($skipit,
$response->header('Content-type'),
'application/gbrowse-encoded-genome');
my $content = thaw $response->content;
skip($skipit,ref $content,'HASH');
for (qw(Clones Motifs Transcripts)) {
skip($skipit,exists $content->{$_});
skip($skipit,exists $content->{$_}{imagedata});
skip($skipit,length($content->{$_}{imagedata}) > 0);
}
}
# now we test whether parallel rendering is working
@labels = qw(CleavageSites Alignments Motifs BindingSites);
$render->set_tracks(@labels);
my $view = $render->render_detailview($render->segment);
my @images = $view =~ m!src=\"(/gbrowse/i/volvox/[a-z0-9]+\.png)\"!g;
foreach (@images) {
s!/gbrowse/i!/tmp/gbrowse_testing/images!;
}
for my $img (@images) {
ok (-e $img && -s _);
}
ok (scalar @images,8);
# uncomment to see the images
#warn join ' ',@images;
#sleep 5000;
exit 0;
END {
if ($PID == $$) {
$SIG{CHLD} = 'IGNORE'; # prevent error codes from children propagating to Test::Harness
foreach ($server,$alignment_server,$cleavage_server) {
kill TERM=>$_->pid if $_
}
sleep 1;
unlink 'testdata/conf/volvox_final.conf',
'testdata/conf/yeast_chr1.conf';
rmtree "/tmp/gbrowse_testing" if $$ == $PID;
rmtree "/tmp/gbrowse" if $$ == $PID;
}
}