annotate limit-req.t @ 103:4ae2198b97ec

Tests: limit_req tests for 0.8.18 changes and bug. 1. Make sure rejected requests are not counted, as leaky bucket algorithm suggests (finally correctly done in 0.8.18). 2. Make sure negative excess values are handled properly (bug appeared in 0.8.18, fixed in 0.8.19).
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 09 Oct 2009 21:05:42 +0400
parents 506586cc2f3b
children 1c0ec30614c6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
78
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1 #!/usr/bin/perl
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 # (C) Maxim Dounin
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 # Tests for nginx limit_req module.
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 ###############################################################################
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 use warnings;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 use strict;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12 use Test::More;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14 BEGIN { use FindBin; chdir($FindBin::Bin); }
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16 use lib 'lib';
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17 use Test::Nginx;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 ###############################################################################
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21 select STDERR; $| = 1;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 select STDOUT; $| = 1;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23
103
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
24 my $t = Test::Nginx->new()->plan(5);
78
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26 $t->write_file_expand('nginx.conf', <<'EOF');
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28 master_process off;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 daemon off;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31 events {
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 }
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34 http {
86
2dbe4ecdd254 Tests: avoid writing access log in limit-req.t.
Maxim Dounin <mdounin@mdounin.ru>
parents: 79
diff changeset
35 access_log off;
78
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 root %%TESTDIR%%;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 client_body_temp_path %%TESTDIR%%/client_body_temp;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39 fastcgi_temp_path %%TESTDIR%%/fastcgi_temp;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 proxy_temp_path %%TESTDIR%%/proxy_temp;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41
103
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
42 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
43 limit_req_zone $binary_remote_addr zone=long:10m rate=1r/m;
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
44 limit_req_zone $binary_remote_addr zone=fast:10m rate=1000r/s;
78
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 server {
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 listen 127.0.0.1:8080;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 server_name localhost;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 location / {
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 limit_req zone=one burst=1 nodelay;
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 }
79
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
52 location /long {
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
53 limit_req zone=long burst=5;
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
54 }
103
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
55 location /fast {
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
56 limit_req zone=fast burst=1;
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
57 }
78
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58 }
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 }
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 EOF
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 $t->write_file('test1.html', 'XtestX');
79
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
64 $t->write_file('long.html', "1234567890\n" x (1 << 16));
103
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
65 $t->write_file('fast.html', 'XtestX');
78
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66 $t->run();
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 ###############################################################################
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 like(http_get('/test1.html'), qr/^HTTP\/1.. 200 /m, 'request');
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 http_get('/test1.html');
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 like(http_get('/test1.html'), qr/^HTTP\/1.. 503 /m, 'request rejected');
103
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
73 http_get('/test1.html');
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
74 http_get('/test1.html');
78
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75
79
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
76 # Second request will be delayed by limit_req, make sure it isn't truncated.
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
77 # The bug only manifests itself if buffer will be filled, so sleep for a while
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
78 # before reading response.
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
79
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
80 my $l1 = length(http_get('/long.html'));
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
81 my $l2 = length(http_get('/long.html', sleep => 1.1));
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
82 is($l2, $l1, 'delayed big request not truncated');
d5330d926fac Tests: add test for limit_req not clearing write timeout on delay.
Maxim Dounin <mdounin@mdounin.ru>
parents: 78
diff changeset
83
103
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
84 # make sure rejected requests are not counted, and access is again allowed
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
85 # after 1/rate seconds
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
86
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
87 like(http_get('/test1.html'), qr/^HTTP\/1.. 200 /m, 'rejects not counted');
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
88
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
89 # make sure negative excess values are handled properly
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
90
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
91 http_get('/fast.html');
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
92 select undef, undef, undef, 0.1;
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
93 like(http_get('/fast.html'), qr/^HTTP\/1.. 200 /m, 'negative excess');
4ae2198b97ec Tests: limit_req tests for 0.8.18 changes and bug.
Maxim Dounin <mdounin@mdounin.ru>
parents: 97
diff changeset
94
78
c893908c1a44 Tests: add some limit_req module tests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 ###############################################################################