clean up forking/cleanup for clean harness testing
[scpubgit/Test-Harness-Selenium.git] / lib / Test / Harness / Selenium.pm
CommitLineData
676409e6 1package Test::Harness::Selenium;
2use strictures 1;
3
a5dd2803 4use File::Find::Rule;
3749d2e5 5use Socialtext::WikiFixture::Selenese;
676409e6 6use HTML::TableExtract;
7use IO::All;
a5dd2803 8use Alien::SeleniumRC;
9use LWP::Simple;
676409e6 10
799fcc50 11use Test::More;
676409e6 12BEGIN {
13 package Test::Builder;
14
15 use Class::Method::Modifiers;
16 use ExtUtils::MakeMaker qw(prompt);
17
18 if (!$ENV{AUTOMATED_TESTING}) {
19 around ok => sub {
20 my ($orig, $self) = (shift, shift);
21 my $res = $self->$orig(@_);
22 unless ($res) {
23 if ('y' eq prompt "Well that didn't work, did it. Bail out?", 'y') {
24 exit 255;
25 }
26 }
27 return $res;
28 };
29 }
30}
31
3749d2e5 32sub new {
33 my ($class, $self) = @_;
34 bless $self, $class;
35}
36
a5dd2803 37sub start_server {
38 my($self) = @_;
17ccdf07 39 $self->{server_pid} = fork();
40 if(!defined $self->{server_pid}) {
41 die "can't fork: $!";
42 }
43 if($self->{server_pid} > 0) {
a5dd2803 44 my $tries = 0;
45 while($tries < 5) {
46 eval {
47 $self->{src} = Socialtext::WikiFixture::Selenese->new(
48 host => $self->{host},
49 port => $self->{port},
50 browser => $self->{browser},
51 browser_url => $self->{browser_url},
52 );
53 };
54 $tries++;
55 if(!defined $self->{src}) {
56 sleep 10;
57 }
58 else {
59 last;
60 }
61 }
62 die "timed out waiting for selenium server to start" if $tries == 5;
63 }
17ccdf07 64 elsif($self->{server_pid} == 0) {
a5dd2803 65 # muttermutter, can't specify a host for selenium
17ccdf07 66 exec("$^X -MAlien::SeleniumRC -e 'Alien::SeleniumRC::start(q{-port $self->{port}})'");
a5dd2803 67 }
68}
69
70sub stop_server {
71 my($self) = @_;
72 # okay, we're done, kill the server.
73 get("http://localhost:$self->{port}/selenium-server/driver/?cmd=shutDownSeleniumServer");
17ccdf07 74 delete $self->{src};
a5dd2803 75 wait;
76}
77
676409e6 78sub test_directory {
3749d2e5 79 my ($self, $dir) = @_;
80 my @tests = File::Find::Rule->file()->name('*.html')->in($dir);
a5dd2803 81 for my $test (@tests) {
82 $self->start_server;
83 $self->run_tests_for($test);
84 $self->stop_server;
85 }
676409e6 86}
87
88sub run_tests_for {
89 my ($self, $html_file) = @_;
90 my $rows = $self->get_rows_for($html_file);
17ccdf07 91 $self->{src}->run_test_table($rows);
676409e6 92}
93
94my $te = HTML::TableExtract->new;
95sub get_rows_for {
96 my ($self, $html_file) = @_;
97 my $html = io($html_file)->all;
98 $te->parse($html);
99 my $table = ($te->tables)[0];
100 my @rows = map {
799fcc50 101 [ map { (!defined $_ or $_ eq "\240") ? () : $_ } @$_ ]
102 } grep { defined $_->[1] } $table->rows;
676409e6 103 return \@rows;
104}
105
1061;