Hi,
    Below is a modified diff to allow for preferences
to be saved to an Apache::TestConfigData for later use
within Apache::Test. In this version, a user can create
a $HOME/.apache-test/Apache/TestConfigData.pm to specify
the preferences; this will be used, if it exists, before
a system Apache::TestConfigData. The diff is applied
against the cvs Apache-Test sources; as well, an
empty Apache-Test/lib/Apache/TestConfigData.pm file
should be created:
=======================================================
package Apache::TestConfigData;
use strict;
use warnings;
use vars qw($vars);

$vars = {

};
1;

=head1 NAME

Apache::TestConfigData - Configuration file for Apache::Test

=cut
====================================================================
The intent of how this is supposed to work is in the pod
of Apache::TestRun.
===================================================================
Index: lib/Apache/TestRun.pm
===================================================================
RCS file: 
/home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestRun.pm,v
retrieving revision 1.114
diff -u -r1.114 TestRun.pm
--- lib/Apache/TestRun.pm       12 Sep 2003 02:21:32 -0000      1.114
+++ lib/Apache/TestRun.pm       24 Sep 2003 21:52:08 -0000
@@ -10,20 +10,24 @@
 use Apache::TestRequest ();
 use Apache::TestHarness ();
 use Apache::TestTrace;
+use Apache::TestUtil qw(expand_path);

+use Cwd;
 use File::Find qw(finddepth);
-use File::Spec::Functions qw(catfile);
+use File::Spec::Functions qw(catfile catdir);
 use Getopt::Long qw(GetOptions);
+use File::Basename qw(dirname);
 use Config;

 use constant STARTUP_TIMEOUT => 300; # secs (good for extreme debug cases)
+
 use subs qw(exit_shell exit_perl);

 my %core_files  = ();
 my %original_t_perms = ();

 my @std_run      = qw(start-httpd run-tests stop-httpd);
-my @others       = qw(verbose configure clean help ssl http11);
+my @others       = qw(verbose configure clean help ssl http11 save);
 my @flag_opts    = (@std_run, @others);
 my @string_opts  = qw(order trace);
 my @ostring_opts = qw(proxy ping);
@@ -55,9 +59,22 @@
    'ssl'             => 'run tests through ssl',
    'proxy'           => 'proxy requests (default proxy is localhost)',
    'trace=T'         => 'change tracing default to: warning, notice, info, 
debug, ...',
+   'save'            => 'save test paramaters into Apache::TestConfigData',
    (map { $_, "\U$_\E url" } @request_opts),
 );

+# variables stored in $Apache::TestConfigData::vars
+my @data_vars = qw(httpd port user group apxs);
+# mapping from $Apache::TestConfigData::vars to $ENV settings
+my %vars_to_env = (httpd => 'APACHE',
+                   user  => 'APACHE_USER',
+                   group => 'APACHE_GROUP',
+                   apxs  => 'APXS',
+                   port  => 'APACHE_PORT',
+                   );
+my $IN_APACHE_TEST = in_apache_test();
+my $CONFIG_DATA = config_data();
+
 sub fixup {
     #make sure we use an absolute path to perl
     #else Test::Harness uses the perl in our PATH
@@ -407,6 +424,8 @@
     $test_config->cmodules_configure;
     $test_config->generate_httpd_conf;
     $test_config->save;
+    $self->write_config() if
+        ($IN_APACHE_TEST or $self->{opts}->{save});
 }

 sub try_exit_opts {
@@ -509,6 +528,10 @@

 sub new_test_config {
     my $self = shift;
+    for (@data_vars) {
+        next unless $Apache::TestConfigData::vars->{$_};
+        $self->{conf_opts}->{$_} ||= $Apache::TestConfigData::vars->{$_};
+    }
     Apache::TestConfig->new($self->{conf_opts});
 }

@@ -953,6 +976,102 @@
     CORE::exit $_[0];
 }

+# Are we building things within Apache-Test?
+sub in_apache_test {
+    my $cwd =  expand_path(cwd);
+    return ($cwd =~ m{Apache-Test}) ? 1 : 0;
+}
+
+# routine to determine where the configuration file
+# Apache::TestConfigData lives. The order searched is
+# 1) a path within Apache-Test, if we are building things there
+# 2) an $ENV{HOME}/.apache-test/ directory;
+# 3) somewhere in @INC, other than a path within Apache-Test.
+sub config_data {
+    my $config;
+    my $file = 'TestConfigData.pm';
+    # XXX $ENV{HOME} isn't propagated in mod_perl
+    unshift @INC, catdir($ENV{HOME}, '.apache-test') if $ENV{HOME};
+    for (@INC) {
+        my $candidate = catfile($_, 'Apache', $file);
+        if (-e $candidate) {
+            eval {require $candidate};
+            next if $@;
+            if (config_has_data()) {
+                $config = $candidate;
+                last;
+            }
+        }
+    }
+    unless ($IN_APACHE_TEST) {
+        die 'Could not find a valid Apache::TestConfigData'
+            unless config_has_data();
+    }
+    shift @INC if $ENV{HOME};
+    # preferentially use environment variables
+    for (@data_vars) {
+        next unless my $value = $ENV{$vars_to_env{$_}};
+        $Apache::TestConfigData::vars->{$_} = $value;
+    }
+
+    return $config;
+}
+
+sub config_has_data {
+    return ($Apache::TestConfigData::vars and
+            %{$Apache::TestConfigData::vars}) ? 1 : 0;
+}
+
+sub write_config {
+    my $self = shift;
+    my $vars = $self->{test_config}->{vars};
+    my $conf_opts = $self->{conf_opts};
+    my $config_dump = '';
+    if ($vars->{httpd} or $Apache::TestConfigData::vars->{httpd}) {
+        for (@data_vars) {
+           next unless my $var = $vars->{$_} || $conf_opts->{$_} ||
+                $Apache::TestConfigData::vars->{$_};
+            $config_dump .= qq{    '$_' => } . qq{'$var',\n};
+        }
+    }
+    my $pkg = << "EOC";
+package Apache::TestConfigData;
+use strict;
+use warnings;
+use vars qw(\$vars);
+
+\$vars = {
+$config_dump
+};
+1;
+
+=head1 NAME
+
+Apache::TestConfigData - Configuration file for Apache::Test
+
+=cut
+EOC
+
+    my $fh = Symbol::gensym;
+    my $file;
+    if ($IN_APACHE_TEST) {
+        $file = catfile($vars->{top_dir}, 'lib/Apache/TestConfigData.pm');
+        die "Cannot open $file: $!" unless (open($fh, ">$file"));
+        warn "Writing $file.\n";
+        print $fh $pkg;
+        close $fh;
+    }
+
+    if ($CONFIG_DATA) {
+        $file = $CONFIG_DATA;
+        die "Cannot open $file: $!" unless (open($fh, ">$file"));
+        warn "Writing $file.\n";
+        print $fh $pkg;
+        close $fh;
+    }
+    return 1;
+}
+
 1;

 __END__
@@ -999,5 +1118,42 @@

 Notice that the extension is I<.c>, and not I<.so>.

+=head1 Saving options
+
+When C<Apache::Test> is first installed, it will save the
+values of C<httpd>, C<port>, C<apxs>, C<user>, and C<group>,
+if set, to a configuration file C<Apache::TestConfigData>.
+This information will then be used in setting these options
+for subsequent uses.
+
+The values stored in C<Apache::TestConfigData> can be overriden
+temporarily either by setting the appropriate environment
+variable or by giving the relevant option when the C<TEST>
+script is run. If you want to save these options to
+C<Apache::TestConfigData>, use the C<-save> flag when
+running C<TEST>.
+
+If you are running C<Apache::Test> as a
+user who does not have permission to alter the system
+C<Apache::TestConfigData>, you can place your
+own private configuration file F<TestConfigData.pm>
+under C<$ENV{HOME}/.apache-test/Apache/>,
+which C<Apache::Test> will use, if present. An example
+of such a configuration file is
+
+  # file $ENV{HOME}/.apache-test/Apache/TestConfigData.pm
+  package Apache::TestConfigData;
+  use strict;
+  use warnings;
+  use vars qw($vars);
+
+  $vars = {
+      'group' => 'me',
+      'user' => 'myself',
+      'port' => '8529',
+      'httpd' => '/usr/local/apache/bin/httpd',
+
+  };
+  1;

 =cut

========================================================================
-- 
best regards,
randy

Reply via email to