Mercurial > hg > nginx-tests
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 |
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 ############################################################################### |