# HG changeset patch # User Maxim Dounin # Date 1288669782 -10800 # Node ID 1e1975cd25ef15e584dc34ac00959db196d3c240 # Parent 3f246a1be2b015231642dfd66eb1ff50f66e087f Tests: error_page and return related tests, dav tests. diff --git a/dav.t b/dav.t new file mode 100644 --- /dev/null +++ b/dav.t @@ -0,0 +1,129 @@ +#!/usr/bin/perl + +# (C) Maxim Dounin + +# Tests for nginx dav module. + +############################################################################### + +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 dav/)->plan(11); + +$t->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +master_process off; +daemon off; + +events { +} + +http { + %%TEST_GLOBALS_HTTP%% + + server { + listen 127.0.0.1:8080; + server_name localhost; + + location / { + dav_methods PUT DELETE MKCOL COPY MOVE; + } + } +} + +EOF + +$t->run(); + +############################################################################### + +my $r; + +$r = http(<testdir() . '/file', 10, 'put file size'); + +$r = http(<testdir() . '/file', 0, 'put file again size'); + +$r = http(<testdir() . '/file', 'file deleted'); + +TODO: { +local $TODO = 'broken in 0.8.32'; + +# 201 replies contain body, response should indicate it's empty +# before 0.8.32 chunked was explicitly disabled for 201 replies so +# connection was just closed (which isn't perfect but worked) + +$r = http(<new()->has(qw/http rewrite/)->plan(7) + ->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +master_process off; +daemon off; + +events { +} + +http { + %%TEST_GLOBALS_HTTP%% + + server { + listen 127.0.0.1:8080; + server_name localhost; + + location /redirect200 { + error_page 404 =200 http://example.com/; + return 404; + } + + location /redirect497 { + # 497 implies implicit status code change + error_page 497 https://example.com/; + return 497; + } + + location /error302redirect { + error_page 302 http://example.com/; + return 302 "first"; + } + + location /error302return302text { + error_page 302 /return302text; + return 302 "first"; + } + + location /return302text { + return 302 "http://example.com/"; + } + + location /error302rewrite { + error_page 302 /rewrite; + return 302 "first"; + } + + location /rewrite { + rewrite ^ http://example.com/; + } + + location /error302directory { + error_page 302 /directory; + return 302 "first"; + } + + location /directory { + } + + location /error302auto { + error_page 302 /auto; + return 302 "first"; + } + + location /auto/ { + proxy_pass http://127.0.0.1:8081; + } + } +} + +EOF + +mkdir($t->testdir() . '/directory'); + +$t->run(); + +############################################################################### + +TODO: { +local $TODO = 'not yet'; + +# tests for error_page status code change for redirects. problems +# introduced in 0.8.53. + +like(http_get('/redirect200'), qr!HTTP!, 'redirect 200'); +like(http_get('/redirect497'), qr!HTTP/1.1 302!, 'redirect 497'); + +# various tests to see if old location cleared if we happen to redirect +# again in error_page 302 + +like(http_get('/error302redirect'), + qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/}ms, + 'error 302 redirect - old location cleared'); + +like(http_get('/error302return302text'), + qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/}ms, + 'error 302 return 302 text - old location cleared'); + +like(http_get('/error302rewrite'), + qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/}ms, + 'error 302 rewrite - old location cleared'); + +like(http_get('/error302directory'), + qr{HTTP/1.1 301(?!.*Location: first).*Location: http://}ms, + 'error 302 directory redirect - old location cleared'); + +like(http_get('/error302auto'), + qr{HTTP/1.1 301(?!.*Location: first).*Location: http://}ms, + 'error 302 auto redirect - old location cleared'); + +} + +############################################################################### diff --git a/rewrite.t b/rewrite.t --- a/rewrite.t +++ b/rewrite.t @@ -21,7 +21,7 @@ use Test::Nginx; select STDERR; $| = 1; select STDOUT; $| = 1; -my $t = Test::Nginx->new()->has(qw/http rewrite/)->plan(5) +my $t = Test::Nginx->new()->has(qw/http rewrite/)->plan(17) ->write_file_expand('nginx.conf', <<'EOF'); %%TEST_GLOBALS%% @@ -50,11 +50,74 @@ http { location /no { rewrite ^ http://example.com/?c=d? redirect; } + + location /return204 { + return 204; + } + + location /return200 { + return 200; + } + + location /error405return204 { + error_page 405 /return204; + return 405; + } + + location /error405return200 { + error_page 405 /return200; + return 405; + } + + location /file.html { + } + + location /return200text { + return 200 "text"; + } + + location /return404text { + return 404 "text"; + } + + location /return302text { + return 302 "text"; + } + + location /error405return200text { + error_page 405 /return200text; + return 405; + } + + location /error302return200text { + error_page 302 /return200text; + return 302 "text"; + } + + location /error405return302text { + error_page 405 /return302text; + return 405; + } + + location /error405rewrite { + error_page 405 /; + return 405; + } + + location /error405directory { + error_page 405 /directory; + return 405; + } + + location /directory { + } } } EOF +mkdir($t->testdir() . '/directory'); + $t->run(); ############################################################################### @@ -71,4 +134,84 @@ like(http_get('/add?a=b'), qr!^Location: like(http_get('/no?a=b'), qr!^Location: http://example.com/\?c=d\x0d?$!ms, 'no args with args'); +like(http_get('/return204'), qr!204 No Content!, 'return 204'); +like(http_get('/return200'), qr!200 OK!, 'return 200'); + +TODO: { +local $TODO = 'not yet'; + +# status code should be 405, and entity body is expected (vs. normal 204 +# replies which doesn't expect to have body); use HTTP/1.1 for test +# to make problem clear + +my $r = http(<