Commit | Line | Data |
676409e6 |
1 | package Test::Harness::Selenium; |
2 | use strictures 1; |
3 | |
a5dd2803 |
4 | use File::Find::Rule; |
3749d2e5 |
5 | use Socialtext::WikiFixture::Selenese; |
676409e6 |
6 | use HTML::TableExtract; |
7 | use IO::All; |
a5dd2803 |
8 | use Alien::SeleniumRC; |
9 | use LWP::Simple; |
676409e6 |
10 | |
799fcc50 |
11 | use Test::More; |
676409e6 |
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 | |
3749d2e5 |
32 | sub new { |
33 | my ($class, $self) = @_; |
34 | bless $self, $class; |
35 | } |
36 | |
a5dd2803 |
37 | sub 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 | |
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"); |
17ccdf07 |
74 | delete $self->{src}; |
a5dd2803 |
75 | wait; |
76 | } |
77 | |
676409e6 |
78 | sub 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 | |
88 | sub 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 | |
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 { |
799fcc50 |
101 | [ map { (!defined $_ or $_ eq "\240") ? () : $_ } @$_ ] |
102 | } grep { defined $_->[1] } $table->rows; |
676409e6 |
103 | return \@rows; |
104 | } |
105 | |
106 | 1; |