perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Fred Moyer <f...@redhotpenguin.com>
Subject [patch] Apache::Test - taking the pain away
Date Thu, 30 Sep 2010 01:39:04 GMT
Here's my attempt at removing the interactive and custom config, and
instead gathering all configuration data from the current environment.
 It should save us a *huge* amount of support headache, and fixup a
lot of false positive failing tests.

I realize this is an enormous paradigm shift, but I think anyone who
has dealt with Apache::TestConfigData knows the pain of persistent
custom config data doing things that you don't expect.  Please take a
look through this patch with an open mind :)

Index: Makefile.PL
===================================================================
--- Makefile.PL	(revision 1002818)
+++ Makefile.PL	(working copy)
@@ -47,12 +47,10 @@
     add_Apache__test_target();
 }

-Apache::TestConfig::custom_config_file_stub_write();
-
 my @clean_files =
-    qw(lib/Apache/TestConfigData.pm
-       .mypacklist
+    qw(.mypacklist
        t/TEST
+       t/REPORT
        Makefile.old
       );

Index: MANIFEST
===================================================================
--- MANIFEST	(revision 1002545)
+++ MANIFEST	(working copy)
@@ -42,15 +42,33 @@
 lib/Apache/TestTrace.pm
 lib/Apache/TestUtil.pm
 lib/Bundle/ApacheTest.pm
-t/TEST.PL
+t/alltest/01bang.t
+t/alltest/all.t
+t/alltest2/01bang.t
+t/alltest2/all.t
 t/bad_coding.t
+t/cgi-bin/cookies.pl
 t/cgi-bin/cookies.pl.PL
+t/cgi-bin/next_available_port.pl
 t/cgi-bin/next_available_port.pl.PL
 t/conf/extra.conf.in
+t/conf/modperl_extra.pl.in
 t/cookies.t
+t/htdocs/index.html
+t/log_watch.t
+t/more/01testpm.t
+t/more/02testmore.t
+t/more/03testpm.t
+t/more/04testmore.t
+t/more/all.t
 t/next_available_port.t
 t/ping.t
 t/redirect.t
 t/request.t
+t/response/TestMore/testmorepm.pm
+t/response/TestMore/testpm.pm
+t/TEST.PL

+
 META.yml                                 Module meta-data (added by MakeMaker)
+
Index: lib/Apache/TestRun.pm
===================================================================
--- lib/Apache/TestRun.pm	(revision 1002818)
+++ lib/Apache/TestRun.pm	(working copy)
@@ -89,7 +89,6 @@
    'proxy'           => 'proxy requests (default proxy is localhost)',
    'trace=T'         => 'change tracing default to: warning, notice, ' .
                         'info, debug, ...',
-   'save'            => 'save test paramaters into Apache::TestConfigData',
    'one-process'     => 'run the server in single process mode',
    (map { $_, "\U$_\E url" } @request_opts),
 );
@@ -506,13 +505,6 @@
     $test_config->generate_httpd_conf;
     $test_config->save;

-    # custom config save if
-    # 1) requested to save
-    # 2) no saved config yet
-    if ($self->{opts}->{save} or
-        !Apache::TestConfig::custom_config_exists()) {
-        $test_config->custom_config_save($self->{conf_opts});
-    }
 }

 sub try_exit_opts {
@@ -685,9 +677,6 @@

     $self->getopts(\@argv);

-    # must be called after getopts so the tracing will be set right
-    Apache::TestConfig::custom_config_load();
-
     $self->pre_configure();

     # can't setup the httpd-specific parts of the config object yet
@@ -1146,44 +1135,6 @@
     CORE::exit $_[0];
 }

-# successfully abort the test suite execution (to allow automatic
-# tools like CPAN.pm, to continue with installation).
-#
-# if a true value is passed, quit right away
-# otherwise ask the user, if they may want to change their mind which
-# will return them back to where they left
-sub skip_test_suite {
-    my $no_doubt = shift;
-
-    # we can't prompt when STDIN is not attached to tty, unless we
-    # were told that's it OK via env var (in which case some program
-    # will feed the interactive prompts).  Also skip the prompt if the
-    # automated testing environment variable is set.
-    unless (-t STDIN || $ENV{APACHE_TEST_INTERACTIVE_PROMPT_OK}
-                     || !$ENV{AUTOMATED_TESTING} ) {
-        $no_doubt = 1;
-    }
-
-    print qq[
-
-Running the test suite is important to make sure that the module that
-you are about to install works on your system. If you choose not to
-run the test suite and you have a problem using this module, make sure
-to return and run this test suite before reporting any problems to the
-developers of this module.
-
-];
-    unless ($no_doubt) {
-        my $default = 'No';
-        my $prompt = 'Skip the test suite?';
-        my $ans = ExtUtils::MakeMaker::prompt($prompt, $default);
-        return if lc($ans) =~ /no/;
-    }
-
-    error "Skipping the test suite execution, while returning success status";
-    exit_perl 1;
-}
-
 1;

 __END__
@@ -1270,153 +1221,4 @@

 META: to be completed

-
-
-=head1 Persistent Custom Configuration
-
-When C<Apache::Test> is first installed or used, it will save the
-values of C<httpd>, C<apxs>, C<port>, 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 of
-C<Apache-Test> unless temprorarily overridden, either by setting the
-appropriate environment variable (C<APACHE_TEST_HTTPD>,
-C<APACHE_TEST_APXS>, C<APACHE_TEST_PORT>, C<APACHE_TEST_USER>, and
-C<APACHE_TEST_GROUP>) or by giving the relevant option (C<-httpd>,
-C<-apxs>, C<-port>, C<-user>, and C<-group>) when the C<TEST>
script
-is run.
-
-To avoid either using previous persistent configurations or saving
-current configurations, set the C<APACHE_TEST_NO_STICKY_PREFERENCES>
-environment variable to a true value.
-
-Finally it's possible to permanently override the previously saved
-options by passing C<L<-save|/Saving_Custom_Configuration_Options>>.
-
-Here is the algorithm of how and when options are saved for the first
-time and when they are used. We will use a few variables to simplify
-the pseudo-code/pseudo-chart flow:
-
-C<$config_exists> - custom configuration has already been saved, to
-get this setting run C<custom_config_exists()>, which tests whether
-either C<apxs> or C<httpd> values are set. It doesn't check for other
-values, since all we need is C<apxs> or C<httpd> to get the test suite
-running. custom_config_exists() checks in the following order
-F<lib/Apache/TestConfigData.pm> (if during Apache-Test build) ,
-F<~/.apache-test/Apache/TestConfigData.pm> and
-F<Apache/TestConfigData.pm> in the perl's libraries.
-
-C<$config_overriden> - that means that we have either C<apxs> or
-C<httpd> values provided by user, via env vars or command line options.
-
-=over
-
-=item 1 Building Apache-Test or modperl-2.0 (or any other project that
-bundles Apache-Test).
-
-  1) perl Apache-Test/Makefile.PL
-  (for bundles top-level Makefile.PL will run this as well)
-
-  if $config_exists
-      do nothing
-  else
-      create lib/Apache/TestConfigData.pm w/ empty config: {}
-
-  2) make
-
-  3) make test
-
-  if $config_exists
-      if $config_overriden
-          override saved options (for those that were overriden)
-      else
-          use saved options
-  else
-      if $config_overriden
-          save them in lib/Apache/TestConfigData.pm
-          (which will be installed on 'make install')
-      else
-          - run interactive prompt for C<httpd> and optionally for C<apxs>
-          - save the custom config in lib/Apache/TestConfigData.pm
-          - restart the currently run program
-
-  modperl-2.0 is a special case in (3). it always overrides 'httpd'
-  and 'apxs' settings. Other settings like 'port', can be used from
-  the saved config.
-
-  4) make install
-
-     if $config_exists only in lib/Apache/TestConfigData.pm
-        it will be installed system-wide
-     else
-        nothing changes (since lib/Apache/TestConfigData.pm won't exist)
-
-=item 2 Testing 3rd party modules (after Apache-Test was installed)
-
-Notice that the following situation is quite possible:
-
-  cd Apache-Test
-  perl Makefile.PL && make install
-
-so that Apache-Test was installed but no custom configuration saved
-(since its C<make test> wasn't run). In which case the interactive
-configuration should kick in (unless config options were passed) and
-in any case saved once configured.
-
-C<$custom_config_path> - perl's F<Apache/TestConfigData.pm> (at the
-same location as F<Apache/TestConfig.pm>) if that area is writable by
-that user (e.g. perl's lib is not owned by 'root'). If not, in
-F<~/.apache-test/Apache/TestConfigData.pm>.
-
-  1) perl Apache-Test/Makefile.PL
-  2) make
-  3) make test
-
-  if $config_exists
-      if $config_overriden
-          override saved options (for those that were overriden)
-      else
-          use saved options
-  else
-      if $config_overriden
-          save them in $custom_config_path
-      else
-          - run interactive prompt for C<httpd> and optionally for C<apxs>
-          - save the custom config in $custom_config_path
-          - restart the currently run program
-
-  4) make install
-
-=back
-
-
-
-=head2 Saving Custom Configuration Options
-
-If you want to override the existing custom configurations 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
Index: lib/Apache/TestConfig.pm
===================================================================
--- lib/Apache/TestConfig.pm	(revision 1002545)
+++ lib/Apache/TestConfig.pm	(working copy)
@@ -38,8 +38,6 @@
     grep { -e "$_/lib/Apache/TestConfig.pm" }
          qw(Apache-Test . .. ../Apache-Test);

-use constant CUSTOM_CONFIG_FILE => 'Apache/TestConfigData.pm';
-
 use lib ();
 use File::Copy ();
 use File::Find qw(finddepth);
@@ -59,18 +57,6 @@

 use vars qw(%Usage);

-# variables stored in $Apache::TestConfigData::vars
-my @data_vars_must = qw(httpd apxs);
-my @data_vars_opt  = qw(user group port);
-# mapping from $Apache::TestConfigData::vars to $ENV settings
-my %vars_to_env = (
-    httpd => 'APACHE_TEST_HTTPD',
-    apxs  => 'APACHE_TEST_APXS',
-    user  => 'APACHE_TEST_USER',
-    group => 'APACHE_TEST_GROUP',
-    port  => 'APACHE_TEST_PORT',
-);
-
 %Usage = (
    top_dir         => 'top-level directory (default is $PWD)',
    t_dir           => 'the t/ test directory (default is $top_dir/t)',
@@ -181,10 +167,6 @@

     my $server = ref $self ? $self->server : new_test_server();

-    # we don't want to get mp2 preconfigured data in order to be able
-    # to get the interactive tests running.
-    return undef if $ENV{APACHE_TEST_INTERACTIVE_CONFIG_TEST};
-
     # we can't do this if we're using httpd 1.3.X
     # even if mod_perl2 is installed on the box
     # similarly, we shouldn't be loading mp2 if we're not
@@ -195,6 +177,7 @@
         eval {
             require Apache2::Build;
         } or return;
+
         return Apache2::Build->build_config;
     }

@@ -264,10 +247,6 @@
         }
     }

-    # custom config options from Apache::TestConfigData
-    # again, this should force reconfiguration
-    custom_config_add_conf_opts($args);
-
     my $self = bless {
         clean => {},
         vhosts => {},
@@ -298,12 +277,13 @@
     #help to find libmodperl.so
     unless ($vars->{src_dir}) {
         my $src_dir = catfile $vars->{top_dir}, qw(.. src modules perl);
-	if (-d $src_dir) {
-	    $vars->{src_dir} = $src_dir;
-	} else {
-	    $src_dir = catfile $vars->{top_dir}, qw(src modules perl);
-	    $vars->{src_dir} = $src_dir if -d $src_dir;
-	}
+
+        if (-d $src_dir) {
+	        $vars->{src_dir} = $src_dir;
+    	} else {
+	        $src_dir = catfile $vars->{top_dir}, qw(src modules perl);
+	        $vars->{src_dir} = $src_dir if -d $src_dir;
+    	}
     }

     $vars->{t_dir}        ||= catfile $vars->{top_dir}, 't';
@@ -399,29 +379,18 @@
                 "bug report";
         }

-        if ($ENV{APACHE_TEST_NO_STICKY_PREFERENCES}) {
-            error "You specified APACHE_TEST_NO_STICKY_PREFERENCES=1 " .
-                "in which case you must explicitly specify -httpd " .
-                "and/or -apxs options";
-            Apache::TestRun::exit_perl(0);
-        }
-
         $self->clean(1);
-        # this method restarts the whole program via exec
-        # so it never returns
-        $self->custom_config_first_time($self->{vars});
+
+        error "You must explicitly specify -httpd and/or -apxs options, " .
+            "or set \$ENV{APACHE_TEST_HTTPD} and \$ENV{APACHE_TEST_APXS}, " .
+            "or set your \$PATH to include the httpd and apxs binaries.";
+        Apache::TestRun::exit_perl(1);
+
     }
     else {
         debug "Using httpd: $vars->{httpd}";
     }

-    # if we have gotten that far we know at least about the location
-    # of httpd and or apxs, so let's save it if we haven't saved any
-    # custom configs yet
-    unless (custom_config_exists()) {
-        $self->custom_config_save($self->{vars});
-    }
-
     $self->inherit_config; #see TestConfigParse.pm
     $self->configure_httpd_eapi; #must come after inherit_config

@@ -434,7 +403,7 @@

     $self->{server}->post_config;

-    $self;
+    return $self;
 }

 sub default_module {
@@ -694,7 +663,7 @@
         }
     }

-    $user;
+    return $user;
 }

 sub default_serveradmin {
@@ -711,7 +680,18 @@
         return $build_config->{MP_APXS};
     }

-    $ENV{APACHE_TEST_APXS};
+    if ($ENV{APACHE_TEST_APXS}) {
+        return $ENV{APACHE_TEST_APXS};
+    }
+
+    # look in PATH as a last resort
+    if (my $apxs = which('apxs')) {
+        return $apxs;
+    } elsif ($apxs = which('apxs2')) {
+        return $apxs;
+    }
+
+    return;
 }

 sub default_httpd {
@@ -737,7 +717,22 @@
         }
     }

-    $ENV{APACHE_TEST_HTTPD};
+    if ($ENV{APACHE_TEST_HTTPD}) {
+        return $ENV{APACHE_TEST_HTTPD};
+    }
+
+    # look in PATH as a last resort
+    if (my $httpd = which('httpd')) {
+        return $httpd;
+    } elsif ($httpd = which('httpd2')) {
+        return $httpd;
+    } elsif ($httpd = which('apache')) {
+        return $httpd;
+    } elsif ($httpd = which('apache2')) {
+        return $httpd;
+    }
+
+    return;
 }

 my $localhost;
@@ -1952,525 +1947,11 @@
     return qq["$arg"];
 }

-### Permanent custom configuration functions ###

-# determine which configuration file Apache/TestConfigData.pm to use
-# (as there could be several). The order searched is:
-# 1) $ENV{HOME}/.apache-test/
-# 2) in @INC
-my $custom_config_path;
-sub custom_config_path {
-
-    return $custom_config_path if $custom_config_path;
-
-    my @inc  = ();
-
-    # XXX $ENV{HOME} isn't propagated in mod_perl
-    push @inc, catdir $ENV{HOME}, '.apache-test' if $ENV{HOME};
-
-    push @inc, @INC;
-
-    for (@inc) {
-        my $candidate = File::Spec->rel2abs(catfile $_, CUSTOM_CONFIG_FILE);
-        next unless -e $candidate;
-        # launder for -T
-        ($candidate) = $candidate =~ /^(.*)/;
-        return $custom_config_path = $candidate;
-    }
-
-    return '';
-}
-
-# tries to nuke all occurences of custom config
-# used by things outside the A-T test suite
-sub custom_config_nuke {
-    my $cwd = fastcwd();
-
-    # 1) create a fake empty (blib/)?lib/Apache/TestConfigData.pm
-    # (don't delete it since it may mess up with MakeMaker)
-    my $path = catfile $cwd, "lib", Apache::TestConfig::CUSTOM_CONFIG_FILE;
-    # overwrite the empty stub
-    Apache::TestConfig::custom_config_write($path, '') if -e $path;
-
-    $path = catfile $cwd, "blib", "lib",
-        Apache::TestConfig::CUSTOM_CONFIG_FILE;
-    if (-e $path) {
-        my $mode = (stat _)[2];
-        my $mode_new = $mode | 0200;
-        chmod $mode_new, $path;
-        debug  "emptying $path";
-        Apache::TestConfig::custom_config_write($path, '');
-        chmod $mode, $path;
-    }
-
-    # 2) go through @INC = ~/.apache-test and nuke any occurences of
-    #    CUSTOM_CONFIG_FILE
-    my @inc  = ();
-
-    push @inc, catdir $ENV{HOME}, '.apache-test' if $ENV{HOME};
-
-    push @inc, @INC;
-
-    for (@inc) {
-        my $victim = File::Spec->rel2abs(catfile $_, CUSTOM_CONFIG_FILE);
-        next unless -e $victim;
-        debug "unlinking $victim";
-        unlink $victim;
-    }
-}
-
-sub custom_config_exists {
-    # try to load custom config if it wasn't loaded yet (there are
-    # many entry points to this API)
-    custom_config_load();
-
-    # it's enough to check whether we have a custom
-    # config for 'httpd' or 'apxs'.
-    my $httpd = $Apache::TestConfigData::vars->{httpd} || '';
-    return 1 if $httpd && -e $httpd && -x _;
-
-    my $apxs = $Apache::TestConfigData::vars->{apxs} || '';
-    return 1 if $apxs && -e $apxs && -x _;
-
-    return 0;
-}
-
-# to be used only from Apache-Test/Makefile.PL to write the custom
-# configuration module so it'll be copied to blib during 'make' and
-# updated to use custom config data during 'make test' and then
-# installed system-wide via 'make install'
-#
-# it gets written only if the custom configuration didn't exist
-# already
-sub custom_config_file_stub_write {
-
-    return if custom_config_exists();
-
-    # It doesn't matter whether it gets written under modperl-2.0/lib
-    # or Apache-Test/lib root, since Apache::TestRun uses the same
-    # logic and will update that file with real config data, which
-    # 'make install' will then pick and install system-wide. but
-    # remember that $FindBin::Bin is the location of top-level
-    # 'Makefile.PL'
-    require FindBin; # load it only for this particular use
-    my $path = catfile $FindBin::Bin, "lib",
-        Apache::TestConfig::CUSTOM_CONFIG_FILE;
-
-    # write an empty stub
-    Apache::TestConfig::custom_config_write($path, '');
-}
-
-sub custom_config_save {
-    my $self = shift;
-    my $conf_opts = shift;
-
-    if ($ENV{APACHE_TEST_NO_STICKY_PREFERENCES}) {
-        debug "APACHE_TEST_NO_STICKY_PREFERENCES=1 => " .
-            "skipping save of custom config data";
-        return;
-    }
-
-    my $vars = $self->{vars};
-    my $config_dump = '';
-
-    # minimum httpd and/or apxs needs to be set
-    return 0 unless $vars->{httpd} or $Apache::TestConfigData::vars->{httpd}
-        or          $vars->{apxs}  or $Apache::TestConfigData::vars->{apxs};
-
-    # it doesn't matter how these vars were set (httpd may or may not
-    # get set using the path to apxs, w/o an explicit -httpd value)
-    for (@data_vars_must) {
-        next unless my $var = $vars->{$_} || $conf_opts->{$_};
-        $config_dump .= qq{    '$_' => '$var',\n};
-    }
-
-    # save these vars only if they were explicitly set via command line
-    # options. For example if someone builds A-T as user 'foo', then
-    # installs it as root and we save it, all users will now try to
-    # configure under that user 'foo' which won't quite work.
-    for (@data_vars_opt) {
-        next unless my $var = $conf_opts->{$_};
-        $config_dump .= qq{    '$_' => '$var',\n};
-    }
-
-    if (IS_APACHE_TEST_BUILD) {
-        my $path = catfile $vars->{top_dir}, 'lib', CUSTOM_CONFIG_FILE;
-        # if it doesn't exist, then we already have a global config file
-        # if it does, then we have need to update it and its blib/ copy
-        if (-e $path and custom_config_path_is_writable($path)) {
-            custom_config_write($path, $config_dump);
-            # also update blib/lib, since usually that's the one that
-            # appears in @INC when t/TEST is run. and it won't be
-            # synced with blib/ unless 'make' was run
-            my $blib_path = catfile $vars->{top_dir},
-                'blib', 'lib', CUSTOM_CONFIG_FILE;
-            if (-e $blib_path and custom_config_path_is_writable($blib_path)) {
-                custom_config_write($blib_path, $config_dump);
-            }
-            return 1;
-        }
-    }
-
-    my $path;
-    if ($path = custom_config_path() ) {
-        # do nothing, the config file already exists (global)
-        debug "Found custom config '$path'";
-    }
-    elsif (File::Spec->file_name_is_absolute(__FILE__)) {
-        # next try a global location, as if it was configured before
-        # Apache::Test's 'make install' (install in the same dir as
-        # Apache/TestRun.pm)
-        # if the filename is not absolute that means that we are still
-        # in Apache-Test build (could just test for IS_APACHE_TEST_BUILD)
-        my $base = dirname dirname __FILE__;
-        $path = catdir $base, CUSTOM_CONFIG_FILE;
-    }
-
-    # check whether we can write to the directory of the chosen path
-    # (e.g. root-owned directory)
-    if ($path and custom_config_path_is_writable($path)) {
-        custom_config_write($path, $config_dump);
-        return 1;
-    }
-    # if we have no writable path yet, try to use ~
-    elsif ($ENV{HOME}) {
-        $path = catfile $ENV{HOME}, '.apache-test', CUSTOM_CONFIG_FILE;
-        if ($path and custom_config_path_is_writable($path)) {
-            custom_config_write($path, $config_dump);
-            return 1;
-        }
-    }
-
-    # XXX: should we croak since we failed to write config
-    error "Failed to find a config file to save the custom " .
-        "configuration in";
-    return 0;
-}
-
-sub custom_config_path_is_writable {
-    my $path = shift;
-
-    return 0 unless $path;
-
-    my $file_created    = '';
-    my $top_dir_created = '';
-    # first make sure that the file is writable if it exists
-    # already (it might be non-writable if installed via EU::MM or in
-    # blib/)
-    if (-e $path) {
-        my $mode = (stat _)[2];
-        $mode |= 0200;
-        chmod $mode, $path; # it's ok if we fail
-        # keep it writable if we have changed it from not being one
-        # so that custom_config_save will be able to just overwrite it
-    }
-    else {
-        my $dir = dirname $path;
-        if ($dir and !-e $dir) {
-            my @dirs = File::Path::mkpath($dir, 0, 0755);
-            # the top level dir to nuke on cleanup if it was created
-            $top_dir_created = shift @dirs if @dirs;
-        }
-        # not really create yet, but will be in the moment
-        $file_created = 1;
-    }
-
-    # try to open for append (even though it may not exist
-    my $fh = Symbol::gensym;
-    if (open $fh, ">>$path") {
-        close $fh;
-        # cleanup if we just created the file
-        unlink $path if $file_created;
-        File::Path::rmtree([$top_dir_created], 0, 0) if $top_dir_created;
-        return 1;
-    }
-
-    return 0;
-}
-
-sub custom_config_write {
-    my($path, $config_dump) = @_;
-
-    my $pkg = << "EOC";
-package Apache::TestConfigData;
-
-use strict;
-use warnings;
-
-\$Apache::TestConfigData::vars = {
-$config_dump
-};
-
 1;

 =head1 NAME

-Apache::TestConfigData - Configuration file for Apache::Test
-
-=cut
-EOC
-
-    debug "Writing custom config $path";
-    my $dir = dirname $path;
-    File::Path::mkpath($dir, 0, 0755) unless -e $dir;
-    my $fh = Symbol::gensym;
-    open $fh, ">$path" or die "Cannot open $path: $!";
-    print $fh $pkg;
-    close $fh;
-}
-
-sub custom_config_add_conf_opts {
-    my $args = shift;
-
-    return unless $Apache::TestConfigData::vars and
-        keys %$Apache::TestConfigData::vars;
-
-    debug "overlaying custom config data";
-
-    # the logic is quite complicated with 'httpd' and 'apxs', since
-    # one is enough to run the test suite, and we need to avoid the
-    # situation where both are saved in custom config but only one
-    # (let's say httpd) is overriden by the command line /env var and
-    # a hell may break loose if we take that overriden httpd value and
-    # also use apxs from custom config which could point to a different
-    # server. So if there is an override of apxs or httpd, do not use
-    # the custom config for apxs or httpd.
-    my $vars_must_overriden = grep {
-        $ENV{ $vars_to_env{$_} } || $args->{$_}
-    } @data_vars_must;
-
-    # mod_perl 2.0 build always knows the right httpd location (and
-    # optionally apxs)
-    $vars_must_overriden++ if IS_MOD_PERL_2_BUILD();
-
-    unless ($vars_must_overriden) {
-        for (@data_vars_must) {
-            next unless $Apache::TestConfigData::vars->{$_};
-            $args->{$_} = $Apache::TestConfigData::vars->{$_};
-        }
-    }
-
-    for (@data_vars_opt) {
-        next unless $Apache::TestConfigData::vars->{$_};
-        # env vars override custom config
-        my $env_value = $ENV{ $vars_to_env{$_} };
-        next unless defined $env_value and length $env_value;
-        $args->{$_} ||= $Apache::TestConfigData::vars->{$_};
-    }
-}
-
-my $custom_config_loaded = 0;
-sub custom_config_load {
-
-    if ($ENV{APACHE_TEST_NO_STICKY_PREFERENCES}) {
-        debug "APACHE_TEST_NO_STICKY_PREFERENCES=1 => " .
-            "skipping load of custom config data";
-        return;
-    }
-
-    if ($ENV{APACHE_TEST_INTERACTIVE_CONFIG_TEST}) {
-        debug "APACHE_TEST_INTERACTIVE_CONFIG_TEST=1 => " .
-            "skipping load of custom config data";
-        return;
-    }
-
-    return if $custom_config_loaded;
-
-    if (my $custom_config_path = custom_config_path()) {
-        debug "loading custom config data from: '$custom_config_path'";
-        $custom_config_loaded++;
-        require $custom_config_path;
-    }
-    else {
-        debug "no custom config data was loaded";
-    }
-}
-
-sub custom_config_first_time {
-    my $self = shift;
-    my $conf_opts = shift;
-
-    # we can't prompt when STDIN is not attached to tty, unless we
-    # were told that's it OK via env var (in which case some program
-    # will feed the interactive prompts
-    unless (-t STDIN || $ENV{APACHE_TEST_INTERACTIVE_PROMPT_OK}) {
-        error "STDIN is not attached to tty, skip interactive config";
-        Apache::TestRun::skip_test_suite();
-    }
-
-    my $vars = $self->{vars};
-
-    print qq[
-
-We are now going to configure the Apache-Test framework.
-This configuration process needs to be done only once.
-
-];
-
-    print qq[
-
-First we need to know where the 'httpd' executable is located.
-If you have more than one Apache server is installed, make sure
-you supply the path to the one you are going to use for testing.
-You can always override this setting at run time via the '-httpd'
-option. For example:
-
-  % t/TEST -httpd /path/to/alternative/httpd
-
-or via the environment variable APACHE_TEST_HTTPD. For example:
-
-  % APACHE_TEST_HTTPD=/path/to/alternative/httpd t/TEST
-
-If for some reason you want to skip the test suite, type: skip
-];
-
-    {
-        my %choices = ();
-        my @tries = qw(httpd httpd2);
-        # Win32 uses Apache not apache
-        push @tries, WIN32 ? qw(Apache) : qw(apache);
-        for (grep defined $_,
-             map({ catfile $vars->{$_}, $vars->{target} } qw(sbindir bindir)),
-             $self->default_httpd, which($vars->{target}),
-             $ENV{APACHE}, $ENV{APACHE2},
-             $ENV{APACHE_TEST_HTTPD}, $ENV{APACHE_TEST_HTTPD2},
-             map {which($_)} @tries) {
-            $choices{$_}++ if -e $_ && -x _;
-        }
-        my $optional = 0;
-        my $wanted = 'httpd';
-        $vars->{$wanted} =
-            _custom_config_prompt_path($wanted, \%choices, $optional);
-    }
-
-    print qq[
-
-Next we need to know where the 'apxs' script is located. This script
-provides a lot of information about the apache installation, and makes
-it easier to find things. However it's not available on all platforms,
-therefore it's optional.
-
-If you don't have it installed it's not a problem. Just press Enter.
-
-Notice that if you have Apache 2.x installed that script could be
-called as 'apxs2'.
-
-If you have more than one Apache server is installed, make sure you
-supply the path to the apxs script you are going to use for testing.
-You can always override this setting at run time via the '-apxs'
-option. For example:
-
-  % t/TEST -apxs /path/to/alternative/apxs
-
-or via the environment variable APACHE_TEST_APXS. For example:
-
-  % APACHE_TEST_APXS=/path/to/alternative/apxs t/TEST
-
-];
-    {
-        my %choices = ();
-        for (grep defined $_,
-             map({ catfile $vars->{$_}, 'apxs' } qw(sbindir bindir)),
-             $self->default_apxs,
-             $ENV{APXS},  $ENV{APACHE_TEST_APXS},  which('apxs'),
-             $ENV{APXS2}, $ENV{APACHE_TEST_APXS2}, which('apxs2')) {
-            $choices{$_}++ if -e $_ && -x _;
-        }
-        my $optional = 1;
-        my $wanted = 'apxs';
-        $vars->{$wanted} =
-            _custom_config_prompt_path($wanted, \%choices, $optional);
-    }
-
-    $self->custom_config_save($conf_opts);
-
-    # we probably could reconfigure on the fly ($self->configure), but
-    # the problem is various cached data which won't be refreshed. so
-    # the simplest is just to restart the run from scratch
-    Apache::TestRun::rerun($vars);
-}
-
-sub _custom_config_prompt_path {
-    my($wanted, $rh_choices, $optional) = @_;
-
-    my $ans;
-    my $default = '';
-    my $optional_str = $optional ? " (optional)" : '';
-    my $prompt =
-        "\nPlease provide a full path to$optional_str '$wanted' executable";
-
-    my @choices = ();
-    if (%$rh_choices) {
-        $prompt .= " or choose from the following options:\n\n";
-        my $c = 0;
-        for (sort keys %$rh_choices) {
-            $c++;
-            $prompt .= "    [$c] $_\n";
-            push @choices, $_;
-        }
-        $prompt .= " \n";
-        $default = 1; # a wild guess
-    }
-    else {
-        $prompt .= ":\n\n";
-    }
-
-    my $i = 0;
-    while (1) {
-
-        # prevent infinite loops in smoke tests, only give the user
-        # five chances to specify httpd or apxs before giving up
-        if ($i++ == 5) {
-
-            Apache::TestRun::skip_test_suite('y');
-            return;
-        }
-
-        $ans = ExtUtils::MakeMaker::prompt($prompt, $default);
-
-        # strip leading/closing spaces
-        $ans =~ s/^\s*|\s*$//g;
-
-        # convert the item number to the path
-        if ($ans =~ /^(\d+)$/) {
-            if ($1 > 0 and $choices[$1-1]) {
-                $ans = $choices[$1-1];
-            }
-            else {
-                warn "The choice '$ans' doesn't exist\n";
-                next;
-            }
-        }
-
-        if ($optional) {
-            return '' unless $ans;
-        }
-
-        # stop the test suite without an error (so automatic tools
-        # like CPAN.pm will be able to continue)
-        if (lc($ans) eq 'skip' && !$optional) {
-            Apache::TestRun::skip_test_suite();
-            next; # in case they change their mind
-        }
-
-        unless (File::Spec->file_name_is_absolute($ans)) {
-            warn "The path '$ans' is not an absolute path. " .
-                "Please specify an absolute path\n";
-            next;
-        }
-
-        warn("'$ans' doesn't exist.\n"),     next unless -e $ans;
-        warn("'$ans' is not a file.\n"),     next unless -f _;
-        warn("'$ans' is not executable.\n"), next unless -x _;
-
-        return $ans;
-    }
-}
-
-1;
-
-=head1 NAME
-
 Apache::TestConfig -- Test Configuration setup module

 =head1 SYNOPSIS
@@ -2605,14 +2086,7 @@
 automatically unshift the I<project/lib> directory into C<@INC>, via
 the autogenerated I<t/conf/modperl_inc.pl> file.

-=head2 APACHE_TEST_INTERACTIVE_PROMPT_OK

-Normally interactive prompts aren't run when STDIN is not attached to
-a tty. But sometimes there is a program that can answer the prompts
-(e.g. when testing A-T itself). If this variable is true the
-interactive config won't be skipped (if needed).
-
-
 =head1 Special Placeholders

 When generating configuration files from the I<*.in> templates,
Index: Changes
===================================================================
--- Changes	(revision 1002818)
+++ Changes	(working copy)
@@ -8,6 +8,10 @@

 =item 1.34-dev

+Remove the custom config feature, and instead use inline directives,
+ENV vars, and look for apxs et al in PATH.
+[Fred Moyer]
+
 Don't attempt to run the test suite as root.  The workarounds needed
 to facilitate root testing cause large maintenance costs, and return
 no tangible benefits.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@perl.apache.org
For additional commands, e-mail: dev-help@perl.apache.org


Mime
View raw message