changeset 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 b2c3d509b2f9
children 089c4174e269
files autoindex_format.t
diffstat 1 files changed, 175 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
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!<file(\s+\w+="[^=]*?")+\s*>test-file</file>!,
+	'xml file format');
+like($r, qr!<directory(\s+\w+="[^=]*?")+\s*>test-dir</directory>!,
+	'xml dir format');
+
+($data) = $r =~ qr!<file\s+(.*?)>test-file</file>!;
+like($data, $mtime, 'xml file mtime');
+like($data, qr!size="42"!, 'xml file size');
+
+($data) = $r =~ qr!<file\s+(.*?)>test-file-link</file>!;
+like($data, $mtime, 'xml file link mtime');
+like($data, qr!size="42"!, 'xml file link size');
+
+($data) = $r =~ qr!<directory\s+(.*?)>test-dir</directory>!;
+like($data, $mtime, 'xml dir mtime');
+unlike($data, qr!size="\d+"!, 'xml dir size');
+
+($data) = $r =~ qr!<directory\s+(.*?)>test-dir-link</directory>!;
+like($data, $mtime, 'xml dir link mtime');
+unlike($data, qr!size="\d+"!, 'xml dir link size');
+
+like($r, qr!<file.*?>test-\'-quote</file>!, 'xml quote');
+like($r, qr!<file.*?>test-\&quot;-double</file>!, 'xml double');
+like($r, qr!<file.*?>test-&lt;&gt;-angle</file>!, '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}</file>!ms, 'xml utf8');
+like($r, qr!test-utf8-(\xd1\x84){45}</file>!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;
+}
+
+###############################################################################