Test-HTTP-Server-Simple-0.11/0000755000175000017500000000000011276335773014650 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.11/MANIFEST0000644000175000017500000000023511176747532016000 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.11/META.yml0000644000175000017500000000130711276335773016122 0ustar chmrrchmrr--- #YAML:1.0 name: Test-HTTP-Server-Simple version: 0.11 abstract: Test::More functions for HTTP::Server::Simple author: - David Glasser license: unknown distribution_type: module configure_requires: ExtUtils::MakeMaker: 0 build_requires: ExtUtils::MakeMaker: 0 requires: HTTP::Server::Simple: 0 NEXT: 0 Test::Builder: 0 Test::Builder::Tester: 1.04 Test::More: 0 no_index: directory: - t - inc generated_by: ExtUtils::MakeMaker version 6.54 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 Test-HTTP-Server-Simple-0.11/SIGNATURE0000644000175000017500000000244611276335654016140 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 a0deb5d3a0e829ae29db92a374377c1fb34aa744 Changes SHA1 fde2e498ced242649142d34769cdb32ec5ba17dd MANIFEST SHA1 271940d31d1d718f07ac70f2d85482979d9a03d2 META.yml SHA1 9372046daadab1527350ae4181d36ef72f5d1864 Makefile.PL SHA1 fa0e7c54e60cea400aab16e8f4b3044958a87790 README SHA1 146919eac1088d1423faf043e0b4f81cb6fa2dbb 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.13 (GNU/Linux) iEYEARECAAYFAkr5u6wACgkQMflWJZZAbqDnFgCdGYwPxiHYkttwoorKVM+OoqhC 99wAn13oV20dCOCP0e4gQW629Qm9Ht6y =MiMC -----END PGP SIGNATURE----- Test-HTTP-Server-Simple-0.11/Changes0000644000175000017500000000230711276335645016143 0ustar chmrrchmrrRevision history for Test-HTTP-Server-Simple 0.11 Tue Nov 10 14:14:17 EST 2009 No code changes; add Win32::Event dep for windows platforms 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.11/lib/0000755000175000017500000000000011276335772015415 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.11/lib/Test/0000755000175000017500000000000011276335772016334 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.11/lib/Test/HTTP/0000755000175000017500000000000011276335772017113 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.11/lib/Test/HTTP/Server/0000755000175000017500000000000011276335772020361 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.11/lib/Test/HTTP/Server/Simple.pm0000644000175000017500000001674711276335361022161 0ustar chmrrchmrrpackage Test::HTTP::Server::Simple; our $VERSION = '0.11'; 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.11/t/0000755000175000017500000000000011276335772015112 5ustar chmrrchmrrTest-HTTP-Server-Simple-0.11/t/pod.t0000644000175000017500000000021411176747532016056 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.11/t/01.basic.t0000644000175000017500000000236611176747532016606 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.11/t/00.load.t0000644000175000017500000000024211176747532016432 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.11/t/pod-coverage.t0000644000175000017500000000025411176747532017653 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.11/Makefile.PL0000644000175000017500000000132011276313525016605 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, ($^O =~ /win32/i ? ( 'Win32::Event' => 0 ) : () ), }, dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, clean => { FILES => 'Test-HTTP-Server-Simple-*' }, ); Test-HTTP-Server-Simple-0.11/README0000644000175000017500000000122311176747532015525 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.