changeset 525:13eafeb7d9cb

Tests: some filter_finalize tests.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 24 Feb 2015 18:11:42 +0300
parents 084f8c8cb648
children e6817a00ba00
files image_filter_finalize.t
diffstat 1 files changed, 154 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/image_filter_finalize.t
@@ -0,0 +1,154 @@
+#!/usr/bin/perl
+
+# (C) Maxim Dounin
+
+# Tests for http filter finalize code.
+
+###############################################################################
+
+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;
+
+plan(skip_all => 'win32') if $^O eq 'MSWin32';
+
+my $t = Test::Nginx->new()
+	->has(qw/http proxy cache image_filter limit_req rewrite/)->plan(4)
+	->write_file_expand('nginx.conf', <<'EOF');
+
+%%TEST_GLOBALS%%
+
+daemon off;
+
+events {
+}
+
+http {
+    %%TEST_GLOBALS_HTTP%%
+
+    proxy_cache_path %%TESTDIR%%/cache keys_zone=cache:1m;
+
+    limit_req_zone $binary_remote_addr zone=limit:1m rate=50r/m;
+
+    log_format time "$request_uri:$status:$upstream_response_time";
+    access_log time.log time;
+
+    upstream u {
+        server 127.0.0.1:8081;
+        server 127.0.0.1:8081;
+        server 127.0.0.1:8081;
+        server 127.0.0.1:8081;
+        server 127.0.0.1:8080;
+    }
+
+    server {
+        listen       127.0.0.1:8080;
+        server_name  localhost;
+
+        # this used to cause a segmentation fault before 07f028df3879 (1.3.1)
+        # http://nginx.org/pipermail/nginx/2011-January/024703.html
+
+        location /t1 {
+            proxy_pass http://127.0.0.1:8080/bad;
+            proxy_cache cache;
+            proxy_cache_valid any 1h;
+
+            image_filter   resize  150 100;
+            error_page     415   = /empty;
+        }
+
+        location /empty {
+            return 204;
+        }
+
+        location /bad {
+            return 404;
+        }
+
+        # another segfault, introduced in 204b780a89de (1.3.0),
+        # fixed in 07f028df3879 (1.3.1)
+
+        location /t2 {
+            proxy_pass http://127.0.0.1:8080/big;
+            proxy_store on;
+
+            image_filter_buffer 10m;
+            image_filter   resize  150 100;
+            error_page     415   = /empty;
+        }
+
+        location /big {
+            # big enough static file
+        }
+
+        # filter finalization may cause duplicate upstream finalization,
+        # resulting in wrong $upstream_response time,
+        # http://nginx.org/pipermail/nginx-devel/2015-February/006539.html
+
+        # note that we'll need upstream response time to be at least 1 second,
+        # and at least 4 failed requests to make sure r->upstream_states will
+        # not be reallocated
+
+        location /t3 {
+            proxy_pass http://u/slow;
+            proxy_buffering off;
+
+            image_filter   resize  150 100;
+            error_page     415   = /upstream;
+        }
+
+        location /slow {
+            limit_req zone=limit burst=5;
+        }
+
+        location /upstream {
+            proxy_pass http://127.0.0.1:8080/empty;
+        }
+
+        location /time.log {
+            # access to log
+        }
+    }
+
+    server {
+        listen       127.0.0.1:8081;
+        server_name  localhost;
+        return 444;
+    }
+}
+
+EOF
+
+$t->write_file('big', "x" x 10240000);
+$t->write_file('slow', "x");
+
+$t->run();
+
+###############################################################################
+
+like(http_get('/t1'), qr/HTTP/, 'image filter and cache');
+like(http_get('/t2'), qr/HTTP/, 'image filter and store');
+
+TODO: {
+local $TODO = 'not yet';
+
+http_get('/slow');
+http_get('/t3');
+like(http_get('/time.log'), qr!/t3:.*, 1\.!, 'upstream response time');
+
+}
+
+like(`grep -F '[alert]' ${\($t->testdir())}/error.log`, qr/^$/s, 'no alerts');
+
+###############################################################################