hi all...

michael schwern is very close to releasing Test::More 0.49, which is the
first version of Test::More that we can use as the server-backend for
Apache::Test.

I would like to integrate the Test::More foo into A-T as soon as 0.49 comes
out.  so, if you are interested in Test::More support and have some free
tuits, I would appreciate some feedback on the work I have thus far.

the first thing to do is download the latest Test::More

http://search.cpan.org/CPAN/authors/id/M/MS/MSCHWERN/Test-Simple-0.48_02.tar.gz

which schwern said is really the release candidate for 0.49.

then, apply the attached patch and let me know how the tests turn out.
really, I know that the Apache/Test.pm patch works, so if you have test
failures it is more likely due to the test setup itself - I didn't want to
move from Apache::TestRun to Apache::TestRunPerl so I needed to set up some
of the mod_perl specific things myself.  hopefully I got most of them right :)

the tests pass successfully for me for apache 1.3 and 2.0, both with and
without mod_perl installed (well, they don't run with without mod_perl but
they don't implode either ;)

anyway, as I've mentioned before, I've been using Test::More as the backend
for a while now on a corporate project and it rocks, so I'm excited to port
it over when 0.49 is official.  feedback welcome.

--Geoff
Index: lib/Apache/Test.pm
===================================================================
RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/Test.pm,v
retrieving revision 1.90
diff -u -r1.90 Test.pm
--- lib/Apache/Test.pm	4 Aug 2004 19:07:06 -0000	1.90
+++ lib/Apache/Test.pm	5 Aug 2004 14:20:06 -0000
@@ -17,7 +17,6 @@
 use strict;
 use warnings FATAL => 'all';
 
-use Test qw(ok skip);
 use Exporter ();
 use Config;
 use Apache::TestConfig ();
@@ -52,6 +51,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;
@@ -67,7 +108,7 @@
 
     if (%SubTests and not $SubTests{ $Test::ntest }) {
         for my $n (1..$nok) {
-            skip "skipping this subtest", 0;
+            skip("skipping this subtest", 0);
         }
         return;
     }
@@ -84,10 +125,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 {
@@ -177,7 +234,7 @@
     }
     @SkipReasons = (); # reset
 
-    Test::plan(@_);
+    $real_plan->(@_, @testmore);
 
     # add to Test.pm verbose output
     print "# Using Apache/Test.pm version $VERSION\n";
@@ -826,6 +883,41 @@
     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::Builder> 0.18_01, available in I<Test::Simple>
+version 0.48_01 on CPAN, 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
 
Index: lib/Apache/TestHarness.pm
===================================================================
RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestHarness.pm,v
retrieving revision 1.18
diff -u -r1.18 TestHarness.pm
--- lib/Apache/TestHarness.pm	4 Mar 2004 05:51:31 -0000	1.18
+++ lib/Apache/TestHarness.pm	5 Aug 2004 14:20:06 -0000
@@ -63,8 +63,13 @@
 sub run_t {
     my($self, $file) = @_;
     my $ran = 0;
-    my $lib = catfile Apache::Test::vars('top_dir'), qw(Apache-Test lib);
-    my $cmd = qq[$^X -Mlib="$lib" $file];
+    # so we can find Apache/Test.pm from both the perl-framework
+    # and Apache-Test.  note that IS_APACHE_TEST_BUILD returns
+    # true for the perl-framework as well
+    my $lib = join ':',
+        catfile(Apache::Test::vars('top_dir'), qw(Apache-Test lib)),
+        catfile(Apache::Test::vars('top_dir'), 'lib');
+    my $cmd = qq[PERL5LIB="$lib" $^X $file];
 
     my $h = Symbol::gensym();
     open $h, "$cmd|" or die "open $cmd: $!";
Index: t/conf/extra.conf.in
===================================================================
RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/t/conf/extra.conf.in,v
retrieving revision 1.3
diff -u -r1.3 extra.conf.in
--- t/conf/extra.conf.in	27 Jun 2004 18:38:57 -0000	1.3
+++ t/conf/extra.conf.in	5 Aug 2004 14:20:06 -0000
@@ -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>
+
+

--- /dev/null	2003-09-15 06:40:47.000000000 -0700
+++ t/more/all.t	2004-08-05 07:17:47.000000000 -0700
@@ -0,0 +1,28 @@
+# 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/.

--- /dev/null	2003-09-15 06:40:47.000000000 -0700
+++ t/more/01testpm.t	2004-08-05 07:17:22.000000000 -0700
@@ -0,0 +1,8 @@
+# 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";
+

--- /dev/null	2003-09-15 06:40:47.000000000 -0700
+++ t/more/02testmore.t	2004-08-05 07:17:27.000000000 -0700
@@ -0,0 +1,8 @@
+# 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";
+

--- /dev/null	2003-09-15 06:40:47.000000000 -0700
+++ t/more/03testpm.t	2004-08-05 07:17:31.000000000 -0700
@@ -0,0 +1,8 @@
+# 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";
+

--- /dev/null	2003-09-15 06:40:47.000000000 -0700
+++ t/more/04testmore.t	2004-08-05 07:17:35.000000000 -0700
@@ -0,0 +1,8 @@
+# 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";
+

--- /dev/null	2003-09-15 06:40:47.000000000 -0700
+++ t/response/TestMore/testmorepm.pm	2004-08-05 06:43:16.000000000 -0700
@@ -0,0 +1,21 @@
+package TestMore::testmorepm;
+
+use strict;
+use warnings FATAL => qw(all);
+
+use Test::More;
+use Apache::Test qw(-withtestmore);
+
+sub handler {
+
+  plan shift, tests => 2;
+
+  is (1, 1, 'called Test::More::is()');
+
+  like ('wow', qr/wow/, 'called Test::More::like()');
+
+  0;
+
+}
+
+1;

--- /dev/null	2003-09-15 06:40:47.000000000 -0700
+++ t/response/TestMore/testpm.pm	2004-08-05 06:40:14.000000000 -0700
@@ -0,0 +1,18 @@
+package TestMore::testpm;
+
+use strict;
+use warnings FATAL => qw(all);
+
+use Apache::Test;
+use Apache::TestUtil;
+
+sub handler {
+
+  plan shift, tests => 1;
+
+  ok t_cmp(1, 1, 'called Apache::Test::ok()');
+
+  0;
+}
+
+1;

--- /dev/null	2003-09-15 06:40:47.000000000 -0700
+++ t/conf/modperl_extra.pl.in	2004-08-05 07:12:54.000000000 -0700
@@ -0,0 +1,13 @@
+use strict;
+use warnings FATAL => qw(all);
+
+use File::Spec ();
+
+use lib ();  # empty so we can calculate the lib to use
+
+my @libs = (File::Spec->catfile('@ServerRoot@', 'response'),
+            File::Spec->catfile('@ServerRoot@', qw(.. lib)));
+
+lib->import(@libs);
+
+1;

Reply via email to