X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FTest%2FHarness%2FSelenium.pm;h=f57419d414358e27dd461978902e0eb66c6c80ae;hb=69c0369b864049fc6ab7ee2622f1f24d7db1c21d;hp=ecaf6655dea5b6140dab9ef9c55d16e69717b119;hpb=799fcc5076c6cd9c24354e3f44ef6000543ad703;p=scpubgit%2FTest-Harness-Selenium.git diff --git a/lib/Test/Harness/Selenium.pm b/lib/Test/Harness/Selenium.pm index ecaf665..f57419d 100644 --- a/lib/Test/Harness/Selenium.pm +++ b/lib/Test/Harness/Selenium.pm @@ -1,10 +1,12 @@ package Test::Harness::Selenium; use strictures 1; -use File::Find; +use File::Find::Rule; use Socialtext::WikiFixture::Selenese; use HTML::TableExtract; use IO::All; +use Alien::SeleniumRC; +use LWP::Simple; use Test::More; BEGIN { @@ -29,26 +31,77 @@ BEGIN { sub new { my ($class, $self) = @_; + if($self->{xvnc}) { + $ENV{DISPLAY} = $self->{xvnc}; + my $xvnc_pid = fork(); + if(!defined $xvnc_pid) { + die "couldn't fork xvnc: $!"; + } + elsif($xvnc_pid) { + $self->{xvnc_pid} = $xvnc_pid; + } + else { + exec("vncserver", $self->{xvnc}); + } + } bless $self, $class; } +sub start_server { + my($self) = @_; + $self->{server_pid} = fork(); + if(!defined $self->{server_pid}) { + die "can't fork: $!"; + } + if($self->{server_pid} > 0) { + my $tries = 0; + while($tries < 5) { + eval { + $self->{src} = Socialtext::WikiFixture::Selenese->new( + host => $self->{host}, + port => $self->{port}, + browser => $self->{browser}, + browser_url => $self->{browser_url}, + ); + }; + $tries++; + if(!defined $self->{src}) { + sleep 10; + } + else { + last; + } + } + die "timed out waiting for selenium server to start" if $tries == 5; + } + elsif($self->{server_pid} == 0) { + # muttermutter, can't specify a host for selenium + exec("$^X -MAlien::SeleniumRC -e 'Alien::SeleniumRC::start(q{-port $self->{port}})'"); + } +} + +sub stop_server { + my($self) = @_; + # okay, we're done, kill the server. + get("http://localhost:$self->{port}/selenium-server/driver/?cmd=shutDownSeleniumServer"); + delete $self->{src}; + wait; +} + sub test_directory { my ($self, $dir) = @_; my @tests = File::Find::Rule->file()->name('*.html')->in($dir); - $self->run_tests_for($_) for @tests; + for my $test (@tests) { + $self->start_server; + $self->run_tests_for($test); + $self->stop_server; + } } sub run_tests_for { my ($self, $html_file) = @_; my $rows = $self->get_rows_for($html_file); - my $src = Socialtext::WikiFixture::Selenese->new( - host => $self->{host}, - port => $self->{port}, - browser => $self->{browser}, - browser_url => $self->{browser_url}, - ); - $src->run_test_table($rows); - done_testing; + $self->{src}->run_test_table($rows); } my $te = HTML::TableExtract->new; @@ -63,4 +116,11 @@ sub get_rows_for { return \@rows; } +sub DESTROY { + my($self) = @_; + if(exists $self->{xvnc_pid}) { + kill("KILL", $self->{xvnc_pid}); + } +} + 1;