# HG changeset patch # User Maxim Dounin # Date 1384435480 -14400 # Node ID 19f58e91617ace1a8c2f428d81f4a6eb5b55fdf4 # Parent 145c37f27c5aa82031d2fc4be661a92d145b2227 Tests: proxy cache revalidate tests. diff --git a/proxy_cache_revalidate.t b/proxy_cache_revalidate.t new file mode 100644 --- /dev/null +++ b/proxy_cache_revalidate.t @@ -0,0 +1,120 @@ +#!/usr/bin/perl + +# (C) Maxim Dounin + +# Tests for http proxy cache revalidation with conditional requests. + +############################################################################### + +use warnings; +use strict; + +use Test::More; +use Socket qw/ CRLF /; + +BEGIN { use FindBin; chdir($FindBin::Bin); } + +use lib 'lib'; +use Test::Nginx qw/ :DEFAULT :gzip /; + +############################################################################### + +select STDERR; $| = 1; +select STDOUT; $| = 1; + +plan(skip_all => 'win32') if $^O eq 'MSWin32'; + +my $t = Test::Nginx->new()->has(qw/http proxy cache/) + ->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +daemon off; + +events { +} + +http { + %%TEST_GLOBALS_HTTP%% + + proxy_cache_path %%TESTDIR%%/cache levels=1:2 + keys_zone=one:1m; + + proxy_cache_revalidate on; + + server { + listen 127.0.0.1:8080; + server_name localhost; + + location / { + proxy_pass http://127.0.0.1:8081; + proxy_cache one; + + proxy_cache_valid 200 1s; + + add_header X-Cache-Status $upstream_cache_status; + } + } + + server { + listen 127.0.0.1:8081; + server_name localhost; + } +} + +EOF + +$t->write_file('t', 'SEE-THIS'); +$t->write_file('t2', 'SEE-THIS'); + +eval { + open OLDERR, ">&", \*STDERR; close STDERR; + $t->run(); + open STDERR, ">&", \*OLDERR; +}; +plan(skip_all => 'no proxy_cache_revalidate') if $@; +$t->plan(9); + +############################################################################### + +# request documents and make sure they are cached + +like(http_get('/t'), qr/X-Cache-Status: MISS.*SEE/ms, 'request'); +like(http_get('/t'), qr/X-Cache-Status: HIT.*SEE/ms, 'request cached'); + +like(http_get('/t2'), qr/X-Cache-Status: MISS.*SEE/ms, '2nd request'); +like(http_get('/t2'), qr/X-Cache-Status: HIT.*SEE/ms, '2nd request cached'); + +# wait for a while for cached responses to expire + +select undef, undef, undef, 2.5; + +# 1st document isn't modified, and should be revalidated on first request +# (a 304 status code will appear in backend's logs), then cached again + +like(http_get('/t'), qr/X-Cache-Status: REVALIDATED.*SEE/ms, 'revalidated'); +like(read_file($t->testdir() . '/access.log'), qr/ 304 /, 'not modified'); +like(http_get('/t'), qr/X-Cache-Status: HIT.*SEE/ms, 'request cached'); + +# 2nd document is recreated with a new content + +$t->write_file('t2', 'NEW'); +like(http_get('/t2'), qr/X-Cache-Status: EXPIRED.*NEW/ms, 'revalidate failed'); +like(http_get('/t2'), qr/X-Cache-Status: HIT.*NEW/ms, 'new response cached'); + +############################################################################### + +sub read_file { + my ($file) = @_; + my $log; + + local $/; + + open LOG, $file or die "Can't open $file: $!\n"; + $log = ; + close LOG; + + return $log; +} + +###############################################################################