summaryrefslogtreecommitdiffstats
path: root/debian/perl-framework/t/apache/etags.t
blob: 6618a88639ee33c5fae6a39fe814e38135b30c0d (plain)
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
#
# 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:
#