8 use Test::WWW::Mechanize;
11 use Catalyst::Runtime 5.7;
12 use Catalyst::Devel 1.0;
14 use Catalyst::Authentication::User::Hash;
15 use Catalyst::Plugin::Session::State::Cookie;
16 use Catalyst::Plugin::Session::Store::FastMmap;
17 use Class::Accessor::Fast;
19 use ExtUtils::MakeMaker;
22 use Net::OpenID::Consumer;
23 use Net::OpenID::Server;
24 use Test::WWW::Mechanize;
27 plan skip_all => 'Test application dependencies not satisfied' if $@;
31 # One port for consumer app, one for provider.
32 my $consumer_port = 10000 + int rand(1 + 10000);
33 my $provider_port = $consumer_port;
34 $provider_port = 10000 + int rand(1 + 10000) until $consumer_port != $provider_port;
36 my $provider_pipe = "perl -I$FindBin::Bin/../lib -I$FindBin::Bin/Provider/lib $FindBin::Bin/Provider/script/testapp_server.pl -p $consumer_port |";
38 my $consumer_pipe = "perl -I$FindBin::Bin/../lib -I$FindBin::Bin/Consumer/lib $FindBin::Bin/Consumer/script/testapp_server.pl -p $provider_port |";
40 my $provider_pid = open my $provider, $provider_pipe
41 or die "Unable to spawn standalone HTTP server for Provider: $!";
43 diag("Started Provider with pid $provider_pid");
45 my $consumer_pid = open my $consumer, $consumer_pipe
46 or die "Unable to spawn standalone HTTP server for Consumer: $!";
48 diag("Started Consumer with pid $consumer_pid");
50 # How long to wait for test server to start and timeout for UA.
53 diag("Waiting (up to $seconds seconds) for application servers to start...");
56 local $SIG{ALRM} = sub { die "Servers took too long to start\n" }; # NB: \n required
58 sleep 1 while check_port( 'localhost', $provider_port ) != 1;
59 sleep 1 while check_port( 'localhost', $consumer_port ) != 1;
66 die "Could not run test: $@";
69 my $openid_consumer = $ENV{CATALYST_SERVER} = "http://localhost:$consumer_port";
70 my $openid_server = "http://localhost:$provider_port";
72 # Tests start --------------------------------------------
73 diag("Started...") if $ENV{TEST_VERBOSE};
75 my $mech = Test::WWW::Mechanize->new(timeout => $seconds);
77 $mech->get_ok($openid_consumer, "GET $openid_consumer");
79 $mech->content_contains("You are not signed in.", "Content looks right");
81 $mech->get_ok("$openid_consumer/signin_openid", "GET $openid_consumer/signin_openid");
84 my $claimed_uri = "$openid_server/provider/paco";
86 $mech->submit_form_ok({ form_name => "openid",
87 fields => { openid_identifier => $claimed_uri,
90 "Trying OpenID login, 'openid' realm");
92 $mech->content_contains("You're not signed in so you can't be verified",
93 "Can't use OpenID, not signed in at provider");
98 my $claimed_uri = "gopher://localhost:443/what?";
100 $mech->submit_form( form_name => "openid",
101 fields => { openid_identifier => $claimed_uri,
105 diag("Trying OpenID with ridiculous URI")
106 if $ENV{TEST_VERBOSE};
108 # no_identity_server: The provided URL doesn't declare its OpenID identity server.
110 is( $mech->status, 500,
111 "Can't use OpenID: bogus_url" );
116 my $claimed_uri = "localhost/some/path";
118 $mech->submit_form( form_name => "openid",
119 fields => { openid_identifier => $claimed_uri,
123 diag("Trying OpenID with phony URI")
124 if $ENV{TEST_VERBOSE};
126 # no_identity_server: The provided URL doesn't declare its OpenID identity server.
127 is( $mech->status, 500,
128 "Can't use OpenID: no_identity_server");
134 $mech->get_ok("$openid_server/login", "GET $openid_consumer/login");
136 # diag($mech->content);
138 $mech->submit_form_ok({ form_name => "login",
139 fields => { username => "paco",
140 password => "l4s4v3n7ur45",
143 "Trying cleartext login, 'memebers' realm");
145 $mech->content_contains("signed in", "Signed in successfully");
147 $mech->get_ok("$openid_consumer/signin_openid", "GET $openid_consumer/signin_openid");
149 $mech->content_contains("Sign in with OpenID", "Content looks right");
151 my $claimed_uri = "$openid_server/provider/paco";
153 $mech->submit_form_ok({ form_name => "openid",
154 fields => { openid_identifier => $claimed_uri,
157 "Trying OpenID login, 'openid' realm");
159 $mech->content_contains("You did it with OpenID!",
160 "Successfully signed in with OpenID");
162 $mech->get_ok($openid_consumer, "GET $openid_consumer");
164 $mech->content_contains("provider/paco", "OpenID info is in the user");
168 $mech->get_ok("$openid_consumer/logout", "GET $openid_consumer/logout");
170 $mech->get_ok("$openid_consumer/signin_openid", "GET $openid_consumer/signin_openid");
172 $mech->content_contains("Sign in with OpenID", "Content looks right");
174 $mech->submit_form_ok({ form_name => "openid",
175 fields => { openid_identifier => $claimed_uri,
178 "Trying OpenID login, 'openid' realm");
180 $mech->content_contains("can't be verified",
181 "Proper failure for unauthenticated memember.");
187 # Tests end ----------------------------------------------
190 kill INT => $provider_pid, $consumer_pid;
196 my ( $host, $port ) = @_;
198 my $remote = IO::Socket::INET->new(