| # |
| # 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: |
| # |