Test-HTTP-Server-Simple-0.10/0000755000175000017500000000000011147425775014646 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.10/MANIFEST0000644000175000017500000000023510723336245015767 0ustar chmrrchmrrChanges lib/Test/HTTP/Server/Simple.pm Makefile.PL MANIFEST This list of files META.yml README SIGNATURE t/00.load.t t/01.basic.t t/pod-coverage.t t/pod.t Test-HTTP-Server-Simple-0.10/META.yml0000644000175000017500000000100611147425775016114 0ustar chmrrchmrr# http://module-build.sourceforge.net/META-spec.html #XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# name: Test-HTTP-Server-Simple version: 0.10 version_from: lib/Test/HTTP/Server/Simple.pm installdirs: site requires: HTTP::Server::Simple: 0 NEXT: 0 Test::Builder: 0 Test::Builder::Tester: 1.04 Test::More: 0 distribution_type: module generated_by: ExtUtils::MakeMaker version 6.30 Test-HTTP-Server-Simple-0.10/SIGNATURE0000644000175000017500000000244511147424417016127 0ustar chmrrchmrrThis file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.55. To verify the content in this distribution, first make sure you have Module::Signature installed, then type: % cpansign -v It will check each file's integrity, as well as the signature's validity. If "==> Signature verified OK! <==" is not displayed, the distribution may already have been compromised, and you should not run its Makefile.PL or Build.PL. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 SHA1 93793c21a7cc3cd2aa546fac076c2107d0efc679 Changes SHA1 fde2e498ced242649142d34769cdb32ec5ba17dd MANIFEST SHA1 2c76cb02a449f0c4dcbc22d23f4f05c6a77ce6ae META.yml SHA1 bc05af0bffcf1216bc552bd0e62608902e7b15bf Makefile.PL SHA1 fa0e7c54e60cea400aab16e8f4b3044958a87790 README SHA1 8cb3d05920af2055065e8fd586857b7c85a9825f lib/Test/HTTP/Server/Simple.pm SHA1 6c3fc19c093bda0b4e8077ebb7ceec2f8944b7d2 t/00.load.t SHA1 1bdea5dc9c47d345d49089a684f2c59190ad4747 t/01.basic.t SHA1 6da39b48ce64b584e4c3274bff96fc76ff484820 t/pod-coverage.t SHA1 0190346d7072d458c8a10a45c19f86db641dcc48 t/pod.t -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEARECAAYFAkmeKQ8ACgkQMflWJZZAbqCMVgCghssDRM2pCi1rbcwm7aRcA0dm +TsAnAwtOYOt6Y+7TRGyRA6Mh1RRY1VT =IvMA -----END PGP SIGNATURE----- Test-HTTP-Server-Simple-0.10/Changes0000644000175000017500000000214411147424365016134 0ustar chmrrchmrrRevision history for Test-HTTP-Server-Simple 0.10 Thu Feb 19 22:51:02 EST 2009 Remove StashWarnings and move into its own dist (removes Storable dep) Fix long-standing bug where, when under 'prove', servers didn't get killed Deal better with having multiple child PIDs 0.09 Tue May 6 18:05:17 EDT 2008 Better bulletproofing for reaping kids 0.08 Tue May 6 14:14:13 EDT 2008 Releng fixups 0.07 Tue May 6 14:00:50 EST 2008 Be more insistent about sending signals on END Also don't assume all children processes are ours 0.06 Tue Nov 13 16:38:40 EST 2007 META.yml SHA1 SUM issue 0.05 Tue May 8 12:30:09 EDT 2007 No functionality changes. Just some releng cleanups 0.04 Patch from SMUELLER to add Win32 Support - http://rt.cpan.org/Public/Bug/Display.html?id=19564 0.03 Wed Jul 5 22:55:39 2006 Kill "waiting for child to start up" message. 0.02 Tue Aug 02 18:16:00 2005 Change API to make it a mixin. Make child signal parent when it's ready, and make the parent-killing-child be much nicer than a -9. 0.01 Thu Jun 16 18:16:56 2005 Initial release. Test-HTTP-Server-Simple-0.10/lib/0000755000175000017500000000000011147425775015414 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.10/lib/Test/0000755000175000017500000000000011147425775016333 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.10/lib/Test/HTTP/0000755000175000017500000000000011147425775017112 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.10/lib/Test/HTTP/Server/0000755000175000017500000000000011147425775020360 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.10/lib/Test/HTTP/Server/Simple.pm0000644000175000017500000001674711147422727022160 0ustar chmrrchmrrpackage Test::HTTP::Server::Simple; our $VERSION = '0.10'; use warnings; use strict; use Carp; use NEXT; use Test::Builder; my $Tester = Test::Builder->new; use constant WIN32 => $^O =~ /win32/i; my $Event; # used on win32 only if (WIN32) { require Win32::Event; $Event = Win32::Event->new(); } =head1 NAME Test::HTTP::Server::Simple - Test::More functions for HTTP::Server::Simple =head1 SYNOPSIS package My::WebServer; use base qw/Test::HTTP::Server::Simple HTTP::Server::Simple/; package main; use Test::More tests => 42; my $s = My::WebServer->new; my $url_root = $s->started_ok("start up my web server); # connect to "$url_root/cool/site" and test with Test::WWW::Mechanize, # Test::HTML::Tidy, etc =head1 DESCRIPTION This mixin class provides methods to test an L-based web server. Currently, it provides only one such method: C. =head2 started_ok [$text] C takes an optional test description. The server needs to have been configured (specifically, its port needs to have been set), but it should not have been run or backgrounded. C calls C on the server, which forks it to run in the background. L takes care of killing the server when your test script dies, even if you kill your test script with an interrupt. C returns the URL C which you can use to connect to your server. Note that if the child process dies, or never gets around to listening for connections, this just hangs. (This may be fixed in a future version.) Also, it probably won't work if you use a custom L in your server. =cut my @CHILD_PIDS; # If an interrupt kills perl, END blocks are not run. This # essentially converts interrupts (like CTRL-C) into a standard # perl exit (even if we're inside an eval {}). $SIG{INT} = sub { exit }; # In case the surrounding 'prove' or similar harness got the SIGINT # before we did, and hence STDERR is closed. $SIG{PIPE} = 'IGNORE'; END { local $?; if (WIN32) { # INT won't do since the server is doing a blocking read # which isn't interrupted by anything but KILL on win32. kill 9, $_ for @CHILD_PIDS; sleep 1; foreach (@CHILD_PIDS) { sleep 1 while kill 0, $_; } } else { @CHILD_PIDS = grep {kill 0, $_} @CHILD_PIDS; if (@CHILD_PIDS) { kill 'USR1', @CHILD_PIDS; local $SIG{ALRM} = sub { use POSIX ":sys_wait_h"; my @last_chance = grep { waitpid($_, WNOHANG) == -1 } grep { kill 0, $_ } @CHILD_PIDS; die 'uncleaned Test::HTTP::Server::Simple processes: '.join(',',@last_chance) if @last_chance; }; alarm(5); eval { my $pid; @CHILD_PIDS = grep {$_ != $pid} @CHILD_PIDS while $pid = wait and $pid > 0 and @CHILD_PIDS; @CHILD_PIDS = () if $pid == -1; }; die $@ if $@; alarm(0); } } } sub started_ok { my $self = shift; my $text = shift; $text = 'started server' unless defined $text; my $port = $self->port; my $pid; $self->{'test_http_server_simple_parent_pid'} = $$; my $child_loaded_yet = 0; # So this is a little complicated. The following signal handler does two # ENTIRELY DIFFERENT things: # # In the parent, it just sets $child_loaded_yet, which breaks out of the # while loop below. It's activated by the kid sending it a SIGUSR1 after # it runs setup_listener # # In the kid, it sets the variable, but that's basically pointless since # the call to ->background doesn't actually return in the kid. But also, # it exits. And when you actually exit with 'exit' (as opposed to being # killed by a signal) END blocks get run. Which means that you can use # Devel::Cover to test the kid's coverage. This one is activated by the # parent's END block in this file. local %SIG; if (not WIN32) { $SIG{'USR1'} = sub { $child_loaded_yet = 1; exit unless $self->{'test_http_server_simple_parent_pid'} == $$ } } # XXX TODO FIXME should somehow not have the signal handler around in the # kid # Comment: How about if ($pid) { $SIG{'USR1'} = ... }? eval { $pid = $self->background; }; if ($@) { my $error_text = $@; # In case the next line changes it. $Tester->ok(0, $text); $Tester->diag("HTTP::Server::Simple->background failed: $error_text"); return; } unless ($pid =~ /^-?\d+$/) { $Tester->ok(0, $text); $Tester->diag("HTTP::Server::Simple->background didn't return a valid PID"); return; } push @CHILD_PIDS, $pid; if (WIN32) { $Event->wait(); } else { 1 while not $child_loaded_yet; } $Tester->ok(1, $text); return "http://localhost:$port"; } =begin private =head2 setup_listener We send a signal to the parent here. We need to use NEXT because this is a mixin. =end private =cut sub setup_listener { my $self = shift; $self->NEXT::setup_listener; if (WIN32) { $Event->pulse(); } else { kill 'USR1', $self->{'test_http_server_simple_parent_pid'}; } } =head2 pids Returns the PIDs of the processes which have been started. Since multiple test servers can be running at one, be aware that this returns a list. =cut sub pids { return @CHILD_PIDS; } =head1 DEPENDENCIES L, L, L. =head1 INCOMPATIBILITIES None reported. =head1 BUGS AND LIMITATIONS Installs an interrupt signal handler, which may override any that another part of your program has installed. Please report any bugs or feature requests to C, or through the web interface at L. =head1 AUTHOR David Glasser C<< >> =head1 LICENCE AND COPYRIGHT Copyright (c) 2005, Best Practical Solutions, LLC. All rights reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See L. =head1 DISCLAIMER OF WARRANTY BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. =cut 1; Test-HTTP-Server-Simple-0.10/t/0000755000175000017500000000000011147425775015111 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.10/t/pod.t0000644000175000017500000000021410723336245016045 0ustar chmrrchmrr#!perl -T use Test::More; eval "use Test::Pod 1.14"; plan skip_all => "Test::Pod 1.14 required for testing POD" if $@; all_pod_files_ok(); Test-HTTP-Server-Simple-0.10/t/01.basic.t0000644000175000017500000000236611010143107016554 0ustar chmrrchmrr#!/usr/bin/perl use Test::More tests => 6; use Test::Builder::Tester; test_out("not ok 1 - baz"); test_fail(+2); test_diag("HTTP::Server::Simple->background failed: random failure"); THSS::FailOnBackground->new(1234)->started_ok("baz"); test_test("detect background failure"); test_out("not ok 1 - blop"); test_fail(+2); test_diag("HTTP::Server::Simple->background didn't return a valid PID"); THSS::ReturnInvalidPid->new(4194)->started_ok("blop"); test_test("detect bad pid"); test_out("ok 1 - beep"); my $URL = THSS::Good->new(9583)->started_ok("beep"); test_test("start up correctly"); is($URL, "http://localhost:9583"); test_out("ok 1 - started server"); $URL = THSS::Good->new(9384)->started_ok; test_test("start up correctly (with default message)"); is($URL, "http://localhost:9384"); # unfortunately we do not test the child-killing properties of THHS, # even though that's the main point of the module package THSS::FailOnBackground; use base qw/Test::HTTP::Server::Simple HTTP::Server::Simple/; sub background { die "random failure\n" } package THSS::ReturnInvalidPid; use base qw/Test::HTTP::Server::Simple HTTP::Server::Simple/; sub background { return "" } package THSS::Good; use base qw/Test::HTTP::Server::Simple HTTP::Server::Simple::CGI/; Test-HTTP-Server-Simple-0.10/t/00.load.t0000644000175000017500000000024210723336245016421 0ustar chmrrchmrruse Test::More tests => 1; BEGIN { use_ok( 'Test::HTTP::Server::Simple' ); } diag( "Testing Test::HTTP::Server::Simple $Test::HTTP::Server::Simple::VERSION" ); Test-HTTP-Server-Simple-0.10/t/pod-coverage.t0000644000175000017500000000025410723336245017642 0ustar chmrrchmrr#!perl -T use Test::More; eval "use Test::Pod::Coverage 1.04"; plan skip_all => "Test::Pod::Coverage 1.04 required for testing POD coverage" if $@; all_pod_coverage_ok(); Test-HTTP-Server-Simple-0.10/Makefile.PL0000644000175000017500000000122511147423436016610 0ustar chmrrchmrruse strict; use warnings; use ExtUtils::MakeMaker; WriteMakefile( NAME => 'Test::HTTP::Server::Simple', AUTHOR => 'David Glasser ', VERSION_FROM => 'lib/Test/HTTP/Server/Simple.pm', ABSTRACT_FROM => 'lib/Test/HTTP/Server/Simple.pm', PL_FILES => {}, PREREQ_PM => { 'Test::More' => 0, 'Test::Builder' => 0, 'Test::Builder::Tester' => 1.04, 'HTTP::Server::Simple' => 0, 'NEXT' => 0, }, dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, clean => { FILES => 'Test-HTTP-Server-Simple-*' }, ); Test-HTTP-Server-Simple-0.10/README0000644000175000017500000000122310723336245015514 0ustar chmrrchmrrTest-HTTP-Server-Simple version 0.03 Provides some very basic test functions for HTTP::Server::Simple. Currently, just deals with cleanly backgrounding and killing a child server process. INSTALLATION To install this module, run the following commands: perl Makefile.PL make make test make install Alternatively, to install with Module::Build, you can use the following commands: perl Build.PL ./Build ./Build test ./Build install COPYRIGHT AND LICENCE Copyright (C) 2005, Best Practical Solutions LLC. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.