clean up forking/cleanup for clean harness testing
[scpubgit/Test-Harness-Selenium.git] / lib / Test / Harness / Selenium.pm
1 package Test::Harness::Selenium;
2 use strictures 1;
3
4 use File::Find::Rule;
5 use Socialtext::WikiFixture::Selenese;
6 use HTML::TableExtract;
7 use IO::All;
8 use Alien::SeleniumRC;
9 use LWP::Simple;
10
11 use Test::More;
12 BEGIN {
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
32 sub new {
33   my ($class, $self) = @_;
34   bless $self, $class;
35 }
36
37 sub start_server {
38   my($self) = @_;
39   $self->{server_pid} = fork();
40   if(!defined $self->{server_pid}) {
41     die "can't fork: $!";
42   }
43   if($self->{server_pid} > 0) {
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   }
64   elsif($self->{server_pid} == 0) {
65     # muttermutter, can't specify a host for selenium
66     exec("$^X -MAlien::SeleniumRC -e 'Alien::SeleniumRC::start(q{-port $self->{port}})'");
67   }
68 }
69
70 sub stop_server {
71   my($self) = @_;
72   # okay, we're done, kill the server.
73   get("http://localhost:$self->{port}/selenium-server/driver/?cmd=shutDownSeleniumServer");
74   delete $self->{src};
75   wait;
76 }
77
78 sub test_directory {
79   my ($self, $dir) = @_;
80   my @tests = File::Find::Rule->file()->name('*.html')->in($dir);
81   for my $test (@tests) {
82     $self->start_server;
83     $self->run_tests_for($test);
84     $self->stop_server;
85   }
86 }
87
88 sub run_tests_for {
89   my ($self, $html_file) = @_;
90   my $rows = $self->get_rows_for($html_file);
91   $self->{src}->run_test_table($rows);
92 }
93
94 my $te = HTML::TableExtract->new;
95 sub 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 {
101     [ map { (!defined $_ or $_ eq "\240") ? () : $_ } @$_ ]
102   } grep { defined $_->[1] } $table->rows;
103   return \@rows;
104 }
105
106 1;