1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
package TestModperl::merge;
use strict;
use warnings FATAL => 'all';
use Apache2::ServerRec ();
use Apache2::ServerUtil ();
use Apache2::RequestUtil ();
use APR::Table ();
use Apache::Test;
use Apache::TestUtil;
use Apache2::Const -compile => 'OK';
# this is the configuration and handler for t/modperl/merge.t,
# t/modperl/merge2.t, and t/modperl/merge3.t. see any of those
# tests and/or the below configuration for more details
# result tables for the below tests (trying to make the code more
# simple...) the hash itself represents a request
# the keys to the main hash represent merge levels - 1 for the
# non-overriding merge, 2 for an overriding merge, and 3 for a
# two-level merge the rest should be self-explanatory - settings and
# expected values.
our %merge1 = (
1 => { PerlPassEnv => [APACHE_TEST_HOSTTYPE => 'z80'],
PerlSetEnv => [MergeSetEnv1 => 'SetEnv1Val'],
PerlSetVar => [MergeSetVar1 => 'SetVar1Val'],
PerlAddVar => [MergeAddVar1 => ['AddVar1Val1',
'AddVar1Val2']],
},
2 => { PerlSetEnv => [MergeSetEnv2 => 'SetEnv2Val'],
PerlSetVar => [MergeSetVar2 => 'SetVar2Val'],
PerlAddVar => [MergeAddVar2 => ['AddVar2Val1',
'AddVar2Val2']],
},
3 => { PerlSetEnv => [MergeSetEnv3 => 'SetEnv3Val'],
PerlSetVar => [MergeSetVar3 => 'SetVar3Val'],
PerlAddVar => [MergeAddVar3 => ['AddVar3Val1',
'AddVar3Val2']],
},
);
our %merge2 = (
1 => { PerlPassEnv => [APACHE_TEST_HOSTTYPE => 'z80'],
PerlSetEnv => [MergeSetEnv1 => 'SetEnv1Val'],
PerlSetVar => [MergeSetVar1 => 'SetVar1Val'],
PerlAddVar => [MergeAddVar1 => ['AddVar1Val1',
'AddVar1Val2']],
},
2 => { PerlSetEnv => [MergeSetEnv2 => 'SetEnv2Merge2Val'],
PerlSetVar => [MergeSetVar2 => 'SetVar2Merge2Val'],
PerlAddVar => [MergeAddVar2 => ['AddVar2Merge2Val1',
'AddVar2Merge2Val2']],
},
3 => { PerlSetEnv => [MergeSetEnv3 => 'SetEnv3Val'],
PerlSetVar => [MergeSetVar3 => 'SetVar3Val'],
PerlAddVar => [MergeAddVar3 => ['AddVar3Val1',
'AddVar3Val2']],
},
);
our %merge3 = (
1 => { PerlPassEnv => [APACHE_TEST_HOSTTYPE => 'z80'],
PerlSetEnv => [MergeSetEnv1 => 'SetEnv1Val'],
PerlSetVar => [MergeSetVar1 => 'SetVar1Val'],
PerlAddVar => [MergeAddVar1 => ['AddVar1Val1',
'AddVar1Val2']],
},
2 => { PerlSetEnv => [MergeSetEnv2 => 'SetEnv2Merge3Val'],
PerlSetVar => [MergeSetVar2 => 'SetVar2Merge3Val'],
PerlAddVar => [MergeAddVar2 => ['AddVar2Merge3Val1',
'AddVar2Merge3Val2']],
},
3 => { PerlSetEnv => [MergeSetEnv3 => 'SetEnv3Merge3Val'],
PerlSetVar => [MergeSetVar3 => 'SetVar3Merge3Val'],
PerlAddVar => [MergeAddVar3 => ['AddVar3Merge3Val1',
'AddVar3Merge3Val2']],
},
);
sub handler {
my $r = shift;
plan $r, tests => 10;
my $uri = $r->uri;
my $hash;
if ($uri =~ m/(merge3)/) {
$hash = $1;
} elsif ($uri =~ m/(merge2)/) {
$hash = $1;
} else {
$hash = 'merge1';
}
t_debug("testing against results in $hash");
no strict qw(refs);
foreach my $level (sort keys %$hash) {
foreach my $directive (sort keys %{ $hash->{$level} }) {
my $key = $hash->{$level}->{$directive}->[0];
my $value = $hash->{$level}->{$directive}->[1];
my @expected = ref $value ? @$value : $value;
my $comment = join ' ', $directive, $key, @expected;
if ($directive =~ m/Env/) {
my $received = $ENV{$key};
ok t_cmp($received, $expected[0], $comment);
}
elsif ($directive =~ m/Set/) {
my $received = $r->dir_config->get($key);
ok t_cmp($received, $expected[0], $comment);
}
else {
my @received = $r->dir_config->get($key);
ok t_cmp(\@received, \@expected, $comment);
}
}
}
Apache2::Const::OK;
}
1;
__END__
<NoAutoConfig>
PerlModule TestModperl::merge
<VirtualHost TestModperl::merge>
# these should pass through all merges untouched
PerlPassEnv APACHE_TEST_HOSTTYPE
PerlSetEnv MergeSetEnv1 SetEnv1Val
PerlSetVar MergeSetVar1 SetVar1Val
PerlSetVar MergeAddVar1 AddVar1Val1
PerlAddVar MergeAddVar1 AddVar1Val2
# these are overridden in /merge2 and /merge3
PerlSetEnv MergeSetEnv2 SetEnv2Val
PerlSetVar MergeSetVar2 SetVar2Val
PerlSetVar MergeAddVar2 AddVar2Val1
PerlAddVar MergeAddVar2 AddVar2Val2
# these are overridden in /merge3 only
PerlSetEnv MergeSetEnv3 SetEnv3Val
PerlSetVar MergeSetVar3 SetVar3Val
PerlSetVar MergeAddVar3 AddVar3Val1
PerlAddVar MergeAddVar3 AddVar3Val2
<Location /merge>
# same as per-server level
SetHandler perl-script
PerlResponseHandler TestModperl::merge
</Location>
<Location /merge2>
# overrides "2" values - "1" and "3" values left untouched
PerlSetEnv MergeSetEnv2 SetEnv2Merge2Val
PerlSetVar MergeSetVar2 SetVar2Merge2Val
PerlSetVar MergeAddVar2 AddVar2Merge2Val1
PerlAddVar MergeAddVar2 AddVar2Merge2Val2
SetHandler perl-script
PerlResponseHandler TestModperl::merge
</Location>
AccessFileName htaccess
<Directory @DocumentRoot@/merge3>
# overrides "2" values
PerlSetEnv MergeSetEnv2 SetEnv2Merge3Val
PerlSetVar MergeSetVar2 SetVar2Merge3Val
PerlSetVar MergeAddVar2 AddVar2Merge3Val1
PerlAddVar MergeAddVar2 AddVar2Merge3Val2
SetHandler perl-script
PerlResponseHandler TestModperl::merge
# override "3" values
AllowOverride all
</Directory>
</VirtualHost>
</NoAutoConfig>
|