# HG changeset patch # User Sergey Kandaurov # Date 1421063069 -10800 # Node ID 9edb609a26421db5c47e54b8f7cb3c0e2a138309 # Parent b2c3d509b2f90c97bfc79f64cb93e3d12ec6e40a Tests: autoindex module tests with autoindex_format. diff --git a/autoindex_format.t b/autoindex_format.t new file mode 100644 --- /dev/null +++ b/autoindex_format.t @@ -0,0 +1,175 @@ +#!/usr/bin/perl + +# (C) Maxim Dounin +# (C) Sergey Kandaurov +# (C) Nginx, Inc. + +# Tests for autoindex module with autoindex_format directive. + +############################################################################### + +use warnings; +use strict; + +use Test::More; + +BEGIN { use FindBin; chdir($FindBin::Bin); } + +use lib 'lib'; +use Test::Nginx; + +############################################################################### + +select STDERR; $| = 1; +select STDOUT; $| = 1; + +my $t = Test::Nginx->new()->has(qw/http autoindex/) + ->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +daemon off; + +events { +} + +http { + %%TEST_GLOBALS_HTTP%% + + server { + listen 127.0.0.1:8080; + server_name localhost; + + autoindex on; + + location /xml/ { + autoindex_format xml; + alias %%TESTDIR%%/; + } + location /json/ { + autoindex_format json; + alias %%TESTDIR%%/; + } + location /jsonp/ { + autoindex_format jsonp; + alias %%TESTDIR%%/; + } + } +} + +EOF + +my $d = $t->testdir(); + +mkdir("$d/test-dir"); +symlink("$d/test-dir", "$d/test-dir-link"); + +$t->write_file('test-file', 'x' x 42); +symlink("$d/test-file", "$d/test-file-link"); + +$t->write_file('test-\'-quote', ''); +$t->write_file('test-"-double', ''); +$t->write_file('test-<>-angle', ''); + +mkdir($d . '/utf8'); +$t->write_file('utf8/test-utf8-' . ("\xd1\x84" x 3), ''); +$t->write_file('utf8/test-utf8-' . ("\xd1\x84" x 45), ''); + +$t->try_run('no autoindex_format')->plan(37); + +############################################################################### + +my ($r, $mtime, $data); + +$r = http_get('/xml/'); +$mtime = qr/mtime="\d{4}-\d\d-\d\dT\d\d:\d\d:\d\dZ"/; + +like($r, qr!Content-Type: text/xml; charset=utf-8!, 'xml content type'); +like($r, qr!test-file!, + 'xml file format'); +like($r, qr!test-dir!, + 'xml dir format'); + +($data) = $r =~ qr!test-file!; +like($data, $mtime, 'xml file mtime'); +like($data, qr!size="42"!, 'xml file size'); + +($data) = $r =~ qr!test-file-link!; +like($data, $mtime, 'xml file link mtime'); +like($data, qr!size="42"!, 'xml file link size'); + +($data) = $r =~ qr!test-dir!; +like($data, $mtime, 'xml dir mtime'); +unlike($data, qr!size="\d+"!, 'xml dir size'); + +($data) = $r =~ qr!test-dir-link!; +like($data, $mtime, 'xml dir link mtime'); +unlike($data, qr!size="\d+"!, 'xml dir link size'); + +like($r, qr!test-\'-quote!, 'xml quote'); +like($r, qr!test-\"-double!, 'xml double'); +like($r, qr!test-<>-angle!, 'xml angle'); + + +$r = http_get('/json/'); +$mtime = qr/"mtime"\s*:\s*"\w{3}, \d\d \w{3} \d{4} \d\d:\d\d:\d\d \w{3}"/; + +my $string = qr!"(?:[^\\"]+|\\["\\/bfnrt])*"!; +my $number = qr!-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][-+]?\d+)?!; +my $kv = qr!\s*$string\s*:\s*($string|$number)\s*!; + +like($r, qr!Content-Type: application/json!, 'json content type'); +like($r, qr!{$kv(,$kv)*}!, 'json format'); + +($data) = $r =~ qr!({[^}]*?"name"\s*:\s*"test-file".*?})!; +like($data, qr!"type"\s*:\s*"file"!, 'json file'); +like($data, $mtime, 'json file mtime'); +like($data, qr!"size"\s*:\s*42!, 'json file size'); + +($data) = $r =~ qr!({[^}]*?"name"\s*:\s*"test-file-link".*?})!; +like($data, qr!"type"\s*:\s*"file"!, 'json file link'); +like($data, $mtime, 'json file link mtime'); +like($data, qr!"size"\s*:\s*42!, 'json file link size'); + +($data) = $r =~ qr!({[^}]*?"name"\s*:\s*"test-dir".*?})!; +like($data, qr!"type"\s*:\s*"directory"!, 'json dir'); +like($data, $mtime, 'json dir mtime'); +unlike($data, qr!"size"\s*:\s*$number!, 'json dir size'); + +($data) = $r =~ qr!({[^}]*?"name"\s*:\s*"test-dir-link".*?})!; +like($data, qr!"type"\s*:\s*"directory"!, 'json dir link'); +like($data, $mtime, 'json dir link mtime'); +unlike($data, qr!"size"\s*:\s*$number!, 'json dir link size'); + +like($r, qr!"name"\s*:\s*"test-'-quote"!, 'json quote'); +like($r, qr!"name"\s*:\s*"test-\\\"-double"!, 'json double'); +like($r, qr!"name"\s*:\s*"test-<>-angle"!, 'json angle'); + +like(http_get_body('/jsonp/test-dir/?callback=foo'), + qr/^\s*foo\s*\(\s*\[\s*\]\s*\)\s*;\s*$/ms, 'jsonp callback'); +like(http_get_body('/jsonp/test-dir/?callback='), + qr/^\s*\[\s*\s*\]\s*$/ms, 'jsonp callback empty'); + +# utf8 tests + +$r = http_get('/xml/utf8/'); +like($r, qr!test-utf8-(\xd1\x84){3}!ms, 'xml utf8'); +like($r, qr!test-utf8-(\xd1\x84){45}!ms, 'xml utf8 long'); + +$r = http_get('/json/utf8/'); +like($r, qr!test-utf8-(\xd1\x84){3}"!ms, 'json utf8'); +like($r, qr!test-utf8-(\xd1\x84){45}"!ms, 'json utf8 long'); + +############################################################################### + +sub http_get_body { + my ($uri) = @_; + + return undef if !defined $uri; + + http_get($uri) =~ /(.*?)\x0d\x0a?\x0d\x0a?(.*)/ms; + + return $2; +} + +###############################################################################