add another test, almost working support for selenium RC forking and running multiple...
[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   my $server_pid = fork();
40   if($server_pid > 0) {
41     $self->{server_pid} = $server_pid;
42     my $tries = 0;
43     while($tries < 5) {
44       eval {
45         $self->{src} = Socialtext::WikiFixture::Selenese->new(
46           host => $self->{host},
47           port => $self->{port},
48           browser => $self->{browser},
49           browser_url => $self->{browser_url},
50         );
51       };
52       $tries++;
53       if(!defined $self->{src}) {
54         sleep 10;
55       }
56       else {
57         last;
58       }
59     }
60     die "timed out waiting for selenium server to start" if $tries == 5;
61   }
62   elsif($server_pid == 0) {
63     close STDOUT;
64     close STDERR;
65     # muttermutter, can't specify a host for selenium
66     Alien::SeleniumRC::start("-port $self->{port}");
67   }
68   else {
69     die "can't fork: $!";
70   }
71 }
72
73 sub stop_server {
74   my($self) = @_;
75   # okay, we're done, kill the server.
76   get("http://localhost:$self->{port}/selenium-server/driver/?cmd=shutDownSeleniumServer");
77   wait;
78 }
79
80 sub test_directory {
81   my ($self, $dir) = @_;
82   my @tests = File::Find::Rule->file()->name('*.html')->in($dir);
83   for my $test (@tests) {
84     $self->start_server;
85     $self->run_tests_for($test);
86     $self->stop_server;
87   }
88 }
89
90 sub run_tests_for {
91   my ($self, $html_file) = @_;
92   my $rows = $self->get_rows_for($html_file);
93   eval { $self->{src}->run_test_table($rows); };
94 }
95
96 my $te = HTML::TableExtract->new;
97 sub get_rows_for {
98   my ($self, $html_file) = @_;
99   my $html = io($html_file)->all;
100   $te->parse($html);
101   my $table = ($te->tables)[0];
102   my @rows = map {
103     [ map { (!defined $_ or $_ eq "\240") ? () : $_ } @$_ ]
104   } grep { defined $_->[1] } $table->rows;
105   return \@rows;
106 }
107
108 1;