I had this problem recently and after having taken a look at Gisle Aas HTTP::Daemon tests, I came up with this structure.
The two main files (runWebTest.pl, localHttpServer.pl) need not to be touched.
runWebTest.pl defines a subroutine (runWebTest) which takes two parameters.
The first parameter is a reference to a test routine to execute (defined in sampletest.t). This test sub will receive the server URL as parameter.
The second one is a file which should contains a subroutine named "handler" which will receive two parameters (HTTP::Request, HTTP::Daemon::ClientConn) and must supply the HTTP server logic for our test.
Here is the code with a sample test:
File: sampletest.t
use strict;
use Test::More tests => 2;
sub test {
my $baseUrl = shift;
use LWP::UserAgent;
my $ua = new LWP::UserAgent;
my $response = $ua->get($baseUrl."sample");
ok($response->is_success, "get ok");
like ($response->content, qr/expected text/, "sample test");
}
require 'runWebTest.pl';
runWebTest(\&test, 'sampleHandler.pl');
File: sampleHandler.pl
sub handler {
my ($r, $c) = @_;
if ($r->method eq 'GET' and $r->url->path eq "/sample") {
$c->send_basic_header(200);
print $c "Content-Type: text/plain\015\012";
$c->send_crlf;
print $c "this is the expected text";
} else {
$c->send_error(404);
}
}
1;
File: runWebTest.pl
use strict;
use Config;
sub runWebTest {
my ($testSub, $handlerScript) = @_;
my $perl = $Config{'perlpath'};
$perl = $^X if $^O eq 'VMS' or -x $^X and $^X =~ m,^([a-z]:)?/,i;
open(DAEMON, "$perl localHttpServer.pl $handlerScript |") or die "
+Can't exec daemon: $!";
my $serverUrl = <DAEMON>;
($serverUrl) = $serverUrl =~ /<([^>]+)>/;
sleep(2);
$testSub->($serverUrl);
quitWebServer($serverUrl);
}
sub quitWebServer {
my $baseUrl = shift;
use LWP::UserAgent;
my $ua = new LWP::UserAgent;
return $ua->get($baseUrl."quit");
}
1;
File: localHttpServer.pl
use strict;
$| = 1; # autoflush
require IO::Socket;
require HTTP::Daemon;
my $handlerScript = shift || die "no handler given";
my $d = HTTP::Daemon->new() || die;
print "HTTP Server started at: <", $d->url, ">\n";
open(STDOUT, $^O eq 'VMS'? ">nl: " : ">/dev/null");
print STDERR "HTTP Server started\n";
while (my $c = $d->accept) {
while (my $r = $c->get_request) {
if ($r) {
if ($r->method eq 'GET' and $r->url->path eq "/quit") {
$c->send_error(503, "Bye, bye");
print STDERR "HTTP Server terminated\n";
exit; # terminate HTTP server
} else {
require $handlerScript;
handler($r, $c);
}
}
}
$c->close;
$c = undef; # close connection
}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.