blob: 6618a88639ee33c5fae6a39fe814e38135b30c0d [file] [log] [blame]
#
# Test the FileETag directive.
#
use strict;
use warnings FATAL => 'all';
use Apache::Test;
use Apache::TestRequest;
use Apache::TestUtil;
t_debug "Checking for existence of FileETag directive\n";
my $resp = GET('/apache/etags/test.txt');
my $rc = $resp->code;
t_debug "Returned $rc:";
if ($rc == 500) {
t_debug "Feature not supported, skipping..",
" Message was:", $resp->as_string;
if (defined($resp->content)) {
t_debug $resp->content;
}
plan tests => 1..0;
exit;
}
#
# The tests verify the inclusion of the different fields, and
# inheritance, according to the directories involved. All are
# subdirectories under /apache/etags/. The key is the path, the value
# is the pattern the ETag response header field needs to match,
# and the comment is the keywords on the FileETag directive in
# the directory's .htaccess file. A pattern of "" means the header
# field is expected to be absent.
#
# The things we want to test are:
#
# 1. That the 'All' and 'None' keywords work.
# 2. That the 'MTime', 'INode', and 'Size' keywords work,
# alone and in combination.
# 3. That '+MTime', '+INode', and '+Size' work, alone and
# in combination.
# 4. That '-MTime', '-INode', and '-Size' work, alone and
# in combination.
# 5. That relative keywords work in combination with non-relative
# ones.
# 6. That inheritance works properly.
#
my $x = '[0-9a-fA-F]+';
my $tokens_1 = "^\"$x\"\$";
my $tokens_2 = "^\"$x-$x\"\$";
my $tokens_3 = "^\"$x-$x-$x\"\$";
my %expect = ($tokens_1 => "one component in ETag field",
$tokens_2 => "two components in ETag field",
$tokens_3 => "three components in ETag field",
"" => "field to be absent"
);
my $tokens_default = have_min_apache_version("2.3.15") ? $tokens_2 : $tokens_3;
my %tests = (
'/default/' => $tokens_default,
#
# First, the absolute settings in various combinations,
# disregarding inheritance.
#
'/m/' => $tokens_1, # MTime
'/i/' => $tokens_1, # INode
'/s/' => $tokens_1, # Size
'/mi/' => $tokens_2, # MTime INode
'/ms/' => $tokens_2, # MTime Size
'/is/' => $tokens_2, # INode Size
'/mis/' => $tokens_3, # MTime INode Size
'/all/' => $tokens_3, # All
'/none/' => "", # None
'/all/m/' => $tokens_1, # MTime
'/all/i/' => $tokens_1, # INode
'/all/s/' => $tokens_1, # Size
'/all/mi/' => $tokens_2, # MTime INode
'/all/ms/' => $tokens_2, # MTime Size
'/all/is/' => $tokens_2, # INode Size
'/all/mis/' => $tokens_3, # MTime INode Size
'/all/inherit/' => $tokens_3, # no directive
'/none/m/' => $tokens_1, # MTime
'/none/i/' => $tokens_1, # INode
'/none/s/' => $tokens_1, # Size
'/none/mi/' => $tokens_2, # MTime INode
'/none/ms/' => $tokens_2, # MTime Size
'/none/is/' => $tokens_2, # INode Size
'/none/mis/' => $tokens_3, # MTime INode Size
'/none/inherit/' => "", # no directive
#
# Now for the relative keywords. First, subtract fields
# in a place where they all should have been inherited.
#
'/all/minus-m/' => $tokens_2, # -MTime
'/all/minus-i/' => $tokens_2, # -INode
'/all/minus-s/' => $tokens_2, # -Size
'/all/minus-mi/' => $tokens_1, # -MTime -INode
'/all/minus-ms/' => $tokens_1, # -MTime -Size
'/all/minus-is/' => $tokens_1, # -INode -Size
'/all/minus-mis/' => "", # -MTime -INode -Size
#
# Now add them in a location where they should all be absent.
#
'/none/plus-m/' => $tokens_1, # +MTime
'/none/plus-i/' => $tokens_1, # +INode
'/none/plus-s/' => $tokens_1, # +Size
'/none/plus-mi/' => $tokens_2, # +MTime +INode
'/none/plus-ms/' => $tokens_2, # +MTime +Size
'/none/plus-is/' => $tokens_2, # +INode +Size
'/none/plus-mis/' => $tokens_3, # +MTime +INode +Size
#
# Try subtracting them below where they were added.
#
'/none/plus-mis/minus-m/' => $tokens_2, # -MTime
'/none/plus-mis/minus-i/' => $tokens_2, # -INode
'/none/plus-mis/minus-s/' => $tokens_2, # -Size
'/none/plus-mis/minus-mi/' => $tokens_1, # -MTime -INode
'/none/plus-mis/minus-ms/' => $tokens_1, # -MTime -Size
'/none/plus-mis/minus-is/' => $tokens_1, # -INode -Size
'/none/plus-mis/minus-mis/' => "", # -MTime -INode -Size
#
# Now relative settings under a non-All non-None absolute
# setting location.
#
'/m/plus-m/' => $tokens_1, # +MTime
'/m/plus-i/' => $tokens_2, # +INode
'/m/plus-s/' => $tokens_2, # +Size
'/m/plus-mi/' => $tokens_2, # +MTime +INode
'/m/plus-ms/' => $tokens_2, # +MTime +Size
'/m/plus-is/' => $tokens_3, # +INode +Size
'/m/plus-mis/' => $tokens_3, # +MTime +INode +Size
'/m/minus-m/' => "", # -MTime
'/m/minus-i/' => "", # -INode
'/m/minus-s/' => "", # -Size
'/m/minus-mi/' => "", # -MTime -INode
'/m/minus-ms/' => "", # -MTime -Size
'/m/minus-is/' => "", # -INode -Size
'/m/minus-mis/' => "" # -MTime -INode -Size
);
my $testcount = scalar(keys(%tests));
plan tests => $testcount;
for my $key (keys(%tests)) {
my $uri = "/apache/etags" . $key . "test.txt";
my $pattern = $tests{$key};
t_debug "---", "HEAD $uri",
"Expecting " . $expect{$pattern};
$resp = HEAD($uri);
my $etag = $resp->header("ETag");
if (defined($etag)) {
t_debug "Received $etag";
ok ($etag =~ /$pattern/);
}
else {
t_debug "ETag field is missing";
if ($tests{$key} eq "") {
ok 1;
}
else {
t_debug "ETag field was expected";
ok 0;
}
}
}
#
# Local Variables:
# mode: perl
# indent-tabs-mode: nil
# End:
#