geoff 2004/10/14 21:11:39
Modified: perl-framework/Apache-Test Changes perl-framework/Apache-Test/lib/Apache Test.pm perl-framework/Apache-Test/t/conf extra.conf.in Added: perl-framework/Apache-Test/t/more 01testpm.t 02testmore.t 03testpm.t 04testmore.t all.t Log: add -withtestmore import action, which allows Test::More >= 0.49 to replace Test.pm as the engine for server-side tests for Revision Changes Path 1.179 +4 -0 httpd-test/perl-framework/Apache-Test/Changes Index: Changes =================================================================== RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/Changes,v retrieving revision 1.178 retrieving revision 1.179 diff -u -r1.178 -r1.179 --- Changes 12 Oct 2004 19:20:07 -0000 1.178 +++ Changes 15 Oct 2004 04:11:39 -0000 1.179 @@ -14,6 +14,10 @@ add 'testcover' make target for running tests with Devel::Cover [Geoffrey Young] +add -withtestmore import action, which allows Test::More >= 0.49 +to replace Test.pm as the engine for server-side tests for +[Geoffrey Young] + 1.104 +100 -7 httpd-test/perl-framework/Apache-Test/lib/Apache/Test.pm Index: Test.pm =================================================================== RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/Test.pm,v retrieving revision 1.103 retrieving revision 1.104 diff -u -r1.103 -r1.104 --- Test.pm 12 Oct 2004 12:32:34 -0000 1.103 +++ Test.pm 15 Oct 2004 04:11:39 -0000 1.104 @@ -17,7 +17,6 @@ use strict; use warnings FATAL => 'all'; -use Test qw(ok skip); use Exporter (); use Config; use Apache::TestConfig (); @@ -51,6 +50,48 @@ } my $Config; +my $real_plan; +my @testmore; + +sub import { + my $class = shift; + + # once Test::More always Test::More until plan() is called + if (($_[0] and $_[0] =~ m/^-withtestmore/) || @testmore) { + # special hoops for Test::More support + + $real_plan = eval { + + require Test::More; + + no warnings qw(numeric); + Test::Builder->VERSION('0.18_01'); + + # required for Test::More::import() and Apache::Test::plan() + # if we don't do this, Test::More exports plan() anyway + # and we get collisions. go figure. + @testmore = (import => [qw(!plan)]); + + Test::More->import(@testmore); + + \&Test::More::plan; + } or die "-withtestmore error: $@"; + + # clean up arguments to export_to_level + shift; + @EXPORT = (@test_more_exports, @Test::More::EXPORT); + } + else { + # the default - Test.pm support + + require Test; + Test->import(qw(ok skip)); + @testmore = (); # reset, just in case. + $real_plan = \&Test::plan; + } + + $class->export_to_level(1, undef, @_ ? @_ : @EXPORT); +} sub config { $Config ||= Apache::TestConfig->thaw->httpd_config; @@ -73,7 +114,7 @@ if (%SubTests and not $SubTests{ $Test::ntest }) { for my $n (1..$nok) { - skip "skipping this subtest", 0; + skip("skipping this subtest", 0); } return; } @@ -90,10 +131,26 @@ #so Perl's Test.pm can be run inside mod_perl sub test_pm_refresh { - $Test::TESTOUT = \*STDOUT; - $Test::planned = 0; - $Test::ntest = 1; - %Test::todo = (); + if (@testmore) { + + Test::Builder->reset; + + Test::Builder->output(\*STDOUT); + Test::Builder->todo_output(\*STDOUT); + + # this is STDOUT because Test::More seems to put + # most of the stuff we want on STDERR, so it ends + # up in the error_log instead of where the user can + # see it. consider leaving it alone based on + # later user reports. + Test::Builder->failure_output(\*STDOUT); + } + else { + $Test::TESTOUT = \*STDOUT; + $Test::planned = 0; + $Test::ntest = 1; + %Test::todo = (); + } } sub init_test_pm { @@ -183,7 +240,7 @@ } @SkipReasons = (); # reset - Test::plan(@_); + $real_plan->(@_, @testmore); # add to Test.pm verbose output print "# Using Apache/Test.pm version $VERSION\n"; @@ -862,6 +919,42 @@ plan tests => 1; # Test::More::plan() ok ('yes', 'testing ok'); # Test::More::ok() + +Now, while this works fine for standard client-side tests +(such as C<t/basic.t>), the more advanced features of I<Apache::Test> +require using I<Test::More> as the sole driver behind the scenes. + +Should you choose to use I<Test::More> as the backend for +server-based tests (such as C<t/response/TestMe/basic.pm>) you will +need to use the C<-withtestmore> action tag: + + use Apache::Test qw(-withtestmore); + + sub handler { + + my $r = shift; + + plan $r, tests => 1; # Test::More::plan() with + # Apache::Test features + + ok ('yes', 'testing ok'); # Test::More::ok() + } + +C<-withtestmore> tells I<Apache::Test> to use I<Test::More> +instead of I<Test.pm> behind the scenes. Note that you are not +required to C<use Test::More> yourself with the C<-withtestmore> +option and that the C<use Test::More tests =E<gt> 1> syntax +may have unexpected results. + +Note that I<Test::More> version 0.49, available within the +I<Test::Simple> 0.49 distribution on CPAN, or greater is required +to use this feature. + +Because I<Apache:Test> was initially developed using I<Test> as +the framework driver, complete I<Test::More> integration is +considered experimental at this time - it is supported as best as +possible but is not guaranteed to be as stable as the default I<Test> +interface at this time. =head1 Apache::TestToString Class 1.4 +28 -0 httpd-test/perl-framework/Apache-Test/t/conf/extra.conf.in Index: extra.conf.in =================================================================== RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/t/conf/extra.conf.in,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- extra.conf.in 27 Jun 2004 18:38:57 -0000 1.3 +++ extra.conf.in 15 Oct 2004 04:11:39 -0000 1.4 @@ -4,3 +4,31 @@ <IfModule mod_alias.c> Redirect /redirect http://@ServerName@/redirected/ </IfModule> + +<IfModule mod_perl.c> + <IfDefine APACHE2> + PerlModule Apache2 + </IfDefine> + + <Location /TestMore__testpm> + SetHandler perl-script + <IfDefine APACHE2> + PerlResponseHandler TestMore::testpm + </IfDefine> + <IfDefine APACHE1> + PerlHandler TestMore::testpm + </IfDefine> + </Location> + + <Location /TestMore__testmorepm> + SetHandler perl-script + <IfDefine APACHE2> + PerlResponseHandler TestMore::testmorepm + </IfDefine> + <IfDefine APACHE1> + PerlHandler TestMore::testmorepm + </IfDefine> + </Location> +</IfModule> + + 1.1 httpd-test/perl-framework/Apache-Test/t/more/01testpm.t Index: 01testpm.t =================================================================== # see the description in t/more/all.t use strict; use warnings FATAL => qw(all); use Apache::TestRequest 'GET_BODY_ASSERT'; print GET_BODY_ASSERT "/TestMore__testpm"; 1.1 httpd-test/perl-framework/Apache-Test/t/more/02testmore.t Index: 02testmore.t =================================================================== # see the description in t/more/all.t use strict; use warnings FATAL => qw(all); use Apache::TestRequest 'GET_BODY_ASSERT'; print GET_BODY_ASSERT "/TestMore__testmorepm"; 1.1 httpd-test/perl-framework/Apache-Test/t/more/03testpm.t Index: 03testpm.t =================================================================== # see the description in t/more/all.t use strict; use warnings FATAL => qw(all); use Apache::TestRequest 'GET_BODY_ASSERT'; print GET_BODY_ASSERT "/TestMore__testpm"; 1.1 httpd-test/perl-framework/Apache-Test/t/more/04testmore.t Index: 04testmore.t =================================================================== # see the description in t/more/all.t use strict; use warnings FATAL => qw(all); use Apache::TestRequest 'GET_BODY_ASSERT'; print GET_BODY_ASSERT "/TestMore__testmorepm"; 1.1 httpd-test/perl-framework/Apache-Test/t/more/all.t Index: all.t =================================================================== # skip all the Test::More tests if Test::More is # not of a sufficient version; use strict; use warnings FATAL => 'all'; use Apache::Test; plan tests => 1, (need_min_module_version(qw(Test::More 0.48_01)) && need_module('mod_perl.c')); ok 1; # the t/more/ directory is testing a few things. # # first, it is testing that the special # Apache::Test qw(-withtestmore); # import works, which allows Apache::Test to use # Test::More as the backend (in place of Test.pm) # for server-side tests. # # secondly, it is testing that we can intermix # scripts that use Test.pm and Test::More as the # backend, which was a bug that needed to be worked # around in early implementations of -withtestmore. # hence the reason for the specific ordering of the # tests in t/more/.