OK, here is the patch that:

- adds the writefile sub to genfile+throw content in
- adds a scan for APACHE_TEST_CONFIGURE and its execution
- implements the PerlRequire test

the ugly parts:

- I wish PerlSwitches were working with +Parent, so I didn't have to do
  the ugly hack with adding yet another PerlRequire

- +Parent, doesn't worry to load the test INCs so every test has to do it
  manually, would be nice to do it in-core

- +Parent doesn't clean @INC from the main interpreter, run the test:
  ./t/TEST -v directive/perlrequire
  and check the error_log -- you will see that VH includes the INC path
  defined in the main interpreter. I'm talking about:
  /home/stas/apache.org/registry/t/htdocs/testdirectives/main
  generated by:
  +PerlSwitches -Mlib=@documentroot@/testdirectives/main



Index: Apache-Test/lib/Apache/TestConfig.pm
===================================================================
RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestConfig.pm,v
retrieving revision 1.58
diff -u -r1.58 TestConfig.pm
--- Apache-Test/lib/Apache/TestConfig.pm        2001/09/09 18:27:39     1.58
+++ Apache-Test/lib/Apache/TestConfig.pm        2001/09/14 17:59:17
@@ -552,6 +552,29 @@
     return $fh;
 }

+# gen + write file
+sub writefile{
+
+    my($self, $file, $content, $warn) = @_;
+
+    my $name = abs2rel $file, $self->{vars}->{t_dir};
+    $self->trace("generating $name");
+
+    open my $fh, '>', $file or die "open $file: $!";
+
+    if (my $msg = $self->genwarning($warn)) {
+        print $fh $msg, "\n";
+    }
+
+    if ($content) {
+        print $fh $content;
+    }
+
+    $self->{clean}->{files}->{$file} = 1;
+
+    close $fh;
+}
+
 sub cpfile {
     my($self, $from, $to) = @_;
     File::Copy::copy($from, $to);
Index: Apache-Test/lib/Apache/TestConfigPerl.pm
===================================================================
RCS file: 
/home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestConfigPerl.pm,v
retrieving revision 1.22
diff -u -r1.22 TestConfigPerl.pm
--- Apache-Test/lib/Apache/TestConfigPerl.pm    2001/09/06 05:16:25     1.22
+++ Apache-Test/lib/Apache/TestConfigPerl.pm    2001/09/14 17:59:17
@@ -245,11 +245,36 @@
             my @args;

             my $pm = $_;
-            my $module = catfile $File::Find::dir, $pm;
-            $self->add_module_config($module, \@args);
-            $module = abs2rel $module, $dir;
+            my $file = catfile $File::Find::dir, $pm;
+            $self->add_module_config($file, \@args);
+            my $module = abs2rel $file, $dir;
             $module =~ s,\.pm$,,;
             $module = join '::', splitdir $module;
+
+            # We have to test whether tests have
+            # APACHE_TEST_CONFIGURE() in them and run it if found at
+            # this stage, so when the server starts everything is
+            # ready.
+            # XXX: however we cannot use a simple require() because
+            # some tests won't require() outside of mod_perl
+            # environment. Therefore we scan the slurped file in.  and
+            # if APACHE_TEST_CONFIGURE has been found we require the
+            # file and run this function.
+
+            {
+                local $/;
+                open my $fh, $file or die "cannot open $file: $!";
+                my $content = <$fh>;
+                close $fh;
+                if ($content =~ /APACHE_TEST_CONFIGURE/m) {
+                    require $file;
+                    # double check that it's a real sub
+                    if ($module->can('APACHE_TEST_CONFIGURE')) {
+                        eval { $module->APACHE_TEST_CONFIGURE(); };
+                        warn $@ if $@;
+                    }
+                }
+            }

             my($base, $sub) =
               map { s/^test//i; $_ } split '::', $module;

--- /dev/null   Thu Jan  1 07:30:00 1970
+++ t/directive/perlrequire.t   Sat Sep 15 01:47:11 2001
@@ -0,0 +1,32 @@
+# this test tests PerlRequire configuration directive
+########################################################################
+
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Test;
+use Apache::TestUtil;
+use Apache::TestRequest ();
+
+my %checks =
+    (
+     'default'                    => 'Loaded by Parent',
+     'TestDirective::perlrequire' => 'Loaded by Virtual Host',
+    );
+
+plan tests => scalar keys %checks;
+
+for my $module (sort keys %checks) {
+    Apache::TestRequest::module($module);
+
+    my $config   = Apache::Test::config();
+    my $hostport = Apache::TestRequest::hostport($config);
+    print "connecting to $hostport\n";
+
+    my $res =
+    ok t_cmp(
+             $checks{$module},
+             $config->http_raw_get("/TestDirective::perlrequire",undef),
+             "testing PerlRequire in $module",
+            );
+}

--- /dev/null   Thu Jan  1 07:30:00 1970
+++ t/response/TestDirective/perlrequire.pm     Sat Sep 15 01:55:38 2001
@@ -0,0 +1,90 @@
+package TestDirective::perlrequire;
+
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Test ();
+use Apache::TestUtil;
+use Apache::Const -compile => 'OK';
+use File::Spec::Functions;
+
+sub handler {
+    my $r = shift;
+
+    $r->content_type('text/plain');
+    $r->puts($My::PerlRequireTest::MAGIC || '');
+
+    # XXX: debug printing. @INC is inherited when it shouldn't!
+    my $oldfh = select(STDERR); $| = 1; select($oldfh);
+    print STDERR join "\n", @INC, "\n";
+
+    Apache::OK;
+}
+
+sub APACHE_TEST_CONFIGURE{
+
+    my $vars = Apache::Test::vars();
+    my $cfg  = Apache::Test::config();
+
+    my $main_mod = << 'EOF';
+package My::PerlRequireTest;
+$My::PerlRequireTest::MAGIC = 'Loaded by Parent';
+1;
+EOF
+
+    my $vh_mod = << 'EOF';
+package My::PerlRequireTest;
+$My::PerlRequireTest::MAGIC = 'Loaded by Virtual Host';
+1;
+EOF
+
+    my $docroot = $vars->{documentroot};
+
+    my $vh_inc = << "EOF";
+use lib qw($docroot/testdirectives/vh);
+1;
+EOF
+
+    # prepare dirs
+    my $target   = catfile $vars->{documentroot}, 'testdirectives';
+    my $main_dir = catfile $target, "main";
+    my $vh_dir   = catfile $target, "vh";
+
+    $cfg->gendir($target);
+    $cfg->gendir($main_dir);
+    $cfg->gendir($vh_dir);
+
+    # write the modules
+    my $main_file   = catfile $main_dir, "PerlRequireTest.pm";
+    my $vh_file     = catfile $vh_dir,   "PerlRequireTest.pm";
+    my $vh_inc_file = catfile $vh_dir,   "perlrequire_inc.pl";
+
+    $cfg->writefile($main_file,   $main_mod, 1);
+    $cfg->writefile($vh_file,     $vh_mod,   1);
+    $cfg->writefile($vh_inc_file, $vh_inc,   1);
+}
+
+1;
+__END__
+PerlSwitches -Mlib=@documentroot@/testdirectives/main
+PerlRequire "PerlRequireTest.pm"
+
+<VirtualHost TestDirective::perlrequire>
+
+  PerlOptions +Parent
+  # PerlSwitches -Mlib=@documentroot@/testdirectives/vh
+  # instead of switches need to create .pl with
+  # use lib qw(testdirectives/vh); and perlrequire it
+  # the best is to use <Perl> section when these will be available
+
+  # avoid: Can't locate TestHooks/trans.pm problem
+  PerlRequire "conf/modperl_startup.pl"
+  # XXX: somehow @documentroot@/testdirectives/main is staying in @INC!!!
+  PerlRequire "@documentroot@/testdirectives/vh/perlrequire_inc.pl"
+  PerlRequire "PerlRequireTest.pm"
+
+  <Location /TestDirective::perlrequire>
+     SetHandler modperl
+     PerlResponseHandler TestDirective::perlrequire
+  </Location>
+</VirtualHost>



_____________________________________________________________________
Stas Bekman              JAm_pH     --   Just Another mod_perl Hacker
http://stason.org/       mod_perl Guide  http://perl.apache.org/guide
mailto:[EMAIL PROTECTED]   http://apachetoday.com http://eXtropia.com/
http://singlesheaven.com http://perl.apache.org http://perlmonth.com/



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to