httpd-test-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stas Bekman <s...@stason.org>
Subject Re: need help to add per-user config to Apache::Test
Date Tue, 02 Sep 2003 20:31:12 GMT
Randy Kobes wrote:
> [ trimmed mod_perl mailing list from cc ]
> 
> On Fri, 29 Aug 2003, Randy Kobes wrote:
> 
> 
>>On Thu, 28 Aug 2003, Stas Bekman wrote:
>>
>>
>>>Several people have asked for having a new feature in
>>>Apache::Test: they want to configure it once (where the
>>>server, apxs, etx are) and run Apache::Test without
>>>needing to pass any arguments. Matt suggested that it
>>>should remember the values passed the first time it's used
>>>and then re-use them. However on a system with several
>>>users and different preferences, this won't work.
>>>Therefore we need to be able to support per-user
>>>preferences. CPAN.pm's setup seems to provide a good
>>>solution to the same problem (CPAN/Config.pm and
>>>~user/.cpan/CPAN/Config.pm). So I thought that someone
>>>would like to port the functionality from CPAN.pm to
>>>Apache::Test and send the patches here. It's all pure
>>>perl, so you have no excuses that it's XS/C ;)
>>
>>I have a mostly functional version of this, save for
>>the ability to use a $HOME/.apache-test/Config.pm, which
>>shouldn't be too hard to add. I'll try to finish it
>>off this weekend.
> 
> 
> A stab at this follows ... It's rough, as I wanted to
> make sure this was on the right track; basically, what's
> supposed to happen is
> - if a Apache::MyTestConfig is found, use the values for

Apache::TestMyConfig? so that we keep all Apache/Test*.pm and it's My Config, 
not My Test... but see below

> apxs, httpd, user, group, and port stored in there. These
> values get overridden if they appear as arguments to 'perl
> Makefile.PL'.

which embeds them in t/TEST, so in effect if they are passed to the code that 
runs a subclass of Apache::TestRun

> - if no Apache::MyTestConfig is present, or a '-save'
> option is passed to 'perl t/TEST', Apache::MyTestConfig
> is created, and then installed.
> - the location of Apache::MyTestConfig is, first of all,
> under $HOME/.apache-test/, or if this is not present,
> under the system @INC.

If it's under system-wide @INC, it probably should be called My because it's 
not user specific (I'm trying to mimic CPAN.pm here. BTW, I haven't been using 
CPANPLUS, how do they do it?) But then it'll collide with the existing 
Apache/TestConfig.pm. So may be we just have Apache/TestConfigData.pm (or 
something like that) and then we don't need My at all, as we will just look 
first under $HOME/.apache-test and then under @INC?

I think when Apache::Test is installed, the config data module should go into 
@INC's location. when it's used for the first time it should go into 
$HOME/.apache-test/.

Won't ~/.apache-test have probs on some filesystems? Is it a safe path?

> I'm not sure I'm putting the values of
> Apache::MyTestConfig in the right, or best, place;
> I haven't tested it extensively, as my linux box
> is a live server.
> 
> =========================================================
> Index: TestConfig.pm
> ===================================================================
> RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestConfig.pm,v
> retrieving revision 1.171
> diff -u -r1.171 TestConfig.pm
> --- TestConfig.pm	13 Aug 2003 19:02:51 -0000	1.171
> +++ TestConfig.pm	1 Sep 2003 03:51:13 -0000
> @@ -3,6 +3,22 @@
>  use strict;
>  use warnings FATAL => 'all';
> 
> +require File::Spec;
> +sub has_config {
> +    my $has_config = 0;
> +    if ($ENV{HOME}) {
> +        eval
> +            {require File::Spec->catfile($ENV{HOME},
> +                                         '.apache-test', 'MyTestConfig.pm');};

That won't work when invoked from the server side, since HOME isn't normally 
propogated. Probably need to detect whether we are running under mod_perl 2.0 
and then retrieve the username the server is running under, but wait, normally 
it runs under 'nobody' or a such, so it won't have this setup...

in any case for now you probably need to check first whether $ENV{HOME} exists 
and put some XXX to fix it later so it'll work under mod_perl as well...

> @@ -24,8 +40,8 @@
>  use File::Path ();
>  use File::Spec::Functions qw(catfile abs2rel splitdir canonpath
>                               catdir file_name_is_absolute);
> -use Cwd qw(fastcwd);
> 
> +use Cwd qw(fastcwd);

weird...

>  use Apache::TestConfigPerl ();
>  use Apache::TestConfigParse ();
>  use Apache::TestTrace;
> @@ -34,6 +50,8 @@
> 
>  use vars qw(%Usage);
> 
> +use constant HAS_CONFIG => has_config();
> +
>  %Usage = (
>     top_dir       => 'top-level directory (default is $PWD)',
>     t_dir         => 'the t/ test directory (default is $top_dir/t)',
> @@ -72,6 +90,12 @@
> 
>  sub filter_args {
>      my($args, $wanted_args) = @_;
> +    if (HAS_CONFIG) {
> +        for (qw(group user apxs port httpd)) {
> +            next unless defined $Apache::MyTestConfig->{$_};
> +            unshift @$args, "-$_", $Apache::MyTestConfig->{$_};
> +        }
> +    }

may be it's better to do it at a later stage? this just used to generate 
t/TEST and similar scripts. If MyConfig has changed since t/TEST was generated 
the changes won't affect t/TEST.

>      my(@pass, %keep);
> 
>      my @filter = @$args;
> Index: TestRun.pm
> ===================================================================
[...]
> +    $self->write_config() if
> +        ($self->{opts}->{save} || not HAS_CONFIG);

Do you mind to have 'or not' or '|| !' ;)

> +
>  }
> 
>  my @oh = qw(jeez golly gosh darn shucks dangit rats nuts dangnabit crap);
> @@ -915,6 +924,75 @@
>  #    require Carp;
>  #    Carp::cluck('exiting');
>      CORE::exit $_[0];
> +}
> +
> +sub write_config {
> +    my $self = shift;
> +    my $dir;
> +    for (@INC) {
> +        my $candidate = catfile($_, 'Apache', 'Test.pm');
> +        if (-e $candidate) {
> +            $dir = dirname($candidate);
> +            last;
> +        }
> +    }
> +    unless (-w $dir) {
> +        $dir = catdir($ENV{HOME}, '.apache-test');
> +        unless (-d $dir) {
> +            mkdir $dir or do {
> +                warn "Cannot mkdir $dir: $!";
> +                return;
> +            };
> +        }
> +    }

Probably this should be an explicit attempt to write to ~/.apache-test if run 
as non-root, since it'll most likely fail to write to the system-wide @INC. Of 
course it may have a local non-root libs, in @INC.  And we can simplify this 
further by creating  Apache/TestConfigData.pm (or whatever we call it), when 
we install Apache::Test for the first time. So we don't have to look for 
Apache/Test.pm. So it'll just have:

+    my $pkg = << "EOC";
+package Apache::MyTestConfig;
+\$Apache::MyTestConfig = {
+};
+1;
+
+=head1 NAME
+
+Apache::MyTestConfig - Configuration file for Apache::Test
+
+=cut
+EOC

or may be having all the keys, but just no values?

+    for (qw(group user apxs port httpd)) {
+        next unless $vars->{$_};
+        $config_dump .= "$_ => ''\n";
+    }

__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com


Mime
View raw message