comparison autoindex_format.t @ 518:9edb609a2642

Tests: autoindex module tests with autoindex_format.
author Sergey Kandaurov <pluknet@nginx.com>
date Mon, 12 Jan 2015 14:44:29 +0300
parents
children 7fa91726cc7d
comparison
equal deleted inserted replaced
517:b2c3d509b2f9 518:9edb609a2642
1 #!/usr/bin/perl
2
3 # (C) Maxim Dounin
4 # (C) Sergey Kandaurov
5 # (C) Nginx, Inc.
6
7 # Tests for autoindex module with autoindex_format directive.
8
9 ###############################################################################
10
11 use warnings;
12 use strict;
13
14 use Test::More;
15
16 BEGIN { use FindBin; chdir($FindBin::Bin); }
17
18 use lib 'lib';
19 use Test::Nginx;
20
21 ###############################################################################
22
23 select STDERR; $| = 1;
24 select STDOUT; $| = 1;
25
26 my $t = Test::Nginx->new()->has(qw/http autoindex/)
27 ->write_file_expand('nginx.conf', <<'EOF');
28
29 %%TEST_GLOBALS%%
30
31 daemon off;
32
33 events {
34 }
35
36 http {
37 %%TEST_GLOBALS_HTTP%%
38
39 server {
40 listen 127.0.0.1:8080;
41 server_name localhost;
42
43 autoindex on;
44
45 location /xml/ {
46 autoindex_format xml;
47 alias %%TESTDIR%%/;
48 }
49 location /json/ {
50 autoindex_format json;
51 alias %%TESTDIR%%/;
52 }
53 location /jsonp/ {
54 autoindex_format jsonp;
55 alias %%TESTDIR%%/;
56 }
57 }
58 }
59
60 EOF
61
62 my $d = $t->testdir();
63
64 mkdir("$d/test-dir");
65 symlink("$d/test-dir", "$d/test-dir-link");
66
67 $t->write_file('test-file', 'x' x 42);
68 symlink("$d/test-file", "$d/test-file-link");
69
70 $t->write_file('test-\'-quote', '');
71 $t->write_file('test-"-double', '');
72 $t->write_file('test-<>-angle', '');
73
74 mkdir($d . '/utf8');
75 $t->write_file('utf8/test-utf8-' . ("\xd1\x84" x 3), '');
76 $t->write_file('utf8/test-utf8-' . ("\xd1\x84" x 45), '');
77
78 $t->try_run('no autoindex_format')->plan(37);
79
80 ###############################################################################
81
82 my ($r, $mtime, $data);
83
84 $r = http_get('/xml/');
85 $mtime = qr/mtime="\d{4}-\d\d-\d\dT\d\d:\d\d:\d\dZ"/;
86
87 like($r, qr!Content-Type: text/xml; charset=utf-8!, 'xml content type');
88 like($r, qr!<file(\s+\w+="[^=]*?")+\s*>test-file</file>!,
89 'xml file format');
90 like($r, qr!<directory(\s+\w+="[^=]*?")+\s*>test-dir</directory>!,
91 'xml dir format');
92
93 ($data) = $r =~ qr!<file\s+(.*?)>test-file</file>!;
94 like($data, $mtime, 'xml file mtime');
95 like($data, qr!size="42"!, 'xml file size');
96
97 ($data) = $r =~ qr!<file\s+(.*?)>test-file-link</file>!;
98 like($data, $mtime, 'xml file link mtime');
99 like($data, qr!size="42"!, 'xml file link size');
100
101 ($data) = $r =~ qr!<directory\s+(.*?)>test-dir</directory>!;
102 like($data, $mtime, 'xml dir mtime');
103 unlike($data, qr!size="\d+"!, 'xml dir size');
104
105 ($data) = $r =~ qr!<directory\s+(.*?)>test-dir-link</directory>!;
106 like($data, $mtime, 'xml dir link mtime');
107 unlike($data, qr!size="\d+"!, 'xml dir link size');
108
109 like($r, qr!<file.*?>test-\'-quote</file>!, 'xml quote');
110 like($r, qr!<file.*?>test-\&quot;-double</file>!, 'xml double');
111 like($r, qr!<file.*?>test-&lt;&gt;-angle</file>!, 'xml angle');
112
113
114 $r = http_get('/json/');
115 $mtime = qr/"mtime"\s*:\s*"\w{3}, \d\d \w{3} \d{4} \d\d:\d\d:\d\d \w{3}"/;
116
117 my $string = qr!"(?:[^\\"]+|\\["\\/bfnrt])*"!;
118 my $number = qr!-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][-+]?\d+)?!;
119 my $kv = qr!\s*$string\s*:\s*($string|$number)\s*!;
120
121 like($r, qr!Content-Type: application/json!, 'json content type');
122 like($r, qr!{$kv(,$kv)*}!, 'json format');
123
124 ($data) = $r =~ qr!({[^}]*?"name"\s*:\s*"test-file".*?})!;
125 like($data, qr!"type"\s*:\s*"file"!, 'json file');
126 like($data, $mtime, 'json file mtime');
127 like($data, qr!"size"\s*:\s*42!, 'json file size');
128
129 ($data) = $r =~ qr!({[^}]*?"name"\s*:\s*"test-file-link".*?})!;
130 like($data, qr!"type"\s*:\s*"file"!, 'json file link');
131 like($data, $mtime, 'json file link mtime');
132 like($data, qr!"size"\s*:\s*42!, 'json file link size');
133
134 ($data) = $r =~ qr!({[^}]*?"name"\s*:\s*"test-dir".*?})!;
135 like($data, qr!"type"\s*:\s*"directory"!, 'json dir');
136 like($data, $mtime, 'json dir mtime');
137 unlike($data, qr!"size"\s*:\s*$number!, 'json dir size');
138
139 ($data) = $r =~ qr!({[^}]*?"name"\s*:\s*"test-dir-link".*?})!;
140 like($data, qr!"type"\s*:\s*"directory"!, 'json dir link');
141 like($data, $mtime, 'json dir link mtime');
142 unlike($data, qr!"size"\s*:\s*$number!, 'json dir link size');
143
144 like($r, qr!"name"\s*:\s*"test-'-quote"!, 'json quote');
145 like($r, qr!"name"\s*:\s*"test-\\\"-double"!, 'json double');
146 like($r, qr!"name"\s*:\s*"test-<>-angle"!, 'json angle');
147
148 like(http_get_body('/jsonp/test-dir/?callback=foo'),
149 qr/^\s*foo\s*\(\s*\[\s*\]\s*\)\s*;\s*$/ms, 'jsonp callback');
150 like(http_get_body('/jsonp/test-dir/?callback='),
151 qr/^\s*\[\s*\s*\]\s*$/ms, 'jsonp callback empty');
152
153 # utf8 tests
154
155 $r = http_get('/xml/utf8/');
156 like($r, qr!test-utf8-(\xd1\x84){3}</file>!ms, 'xml utf8');
157 like($r, qr!test-utf8-(\xd1\x84){45}</file>!ms, 'xml utf8 long');
158
159 $r = http_get('/json/utf8/');
160 like($r, qr!test-utf8-(\xd1\x84){3}"!ms, 'json utf8');
161 like($r, qr!test-utf8-(\xd1\x84){45}"!ms, 'json utf8 long');
162
163 ###############################################################################
164
165 sub http_get_body {
166 my ($uri) = @_;
167
168 return undef if !defined $uri;
169
170 http_get($uri) =~ /(.*?)\x0d\x0a?\x0d\x0a?(.*)/ms;
171
172 return $2;
173 }
174
175 ###############################################################################