Mercurial > hg > nginx-tests
comparison stream_udp_proxy_requests.t @ 1396:28ddfda3ca2a
Tests: stream tests for the proxy_requests directive.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Tue, 13 Nov 2018 13:20:25 +0300 |
parents | |
children | 9242811bf22b |
comparison
equal
deleted
inserted
replaced
1395:7787498b3ceb | 1396:28ddfda3ca2a |
---|---|
1 #!/usr/bin/perl | |
2 | |
3 # (C) Sergey Kandaurov | |
4 # (C) Nginx, Inc. | |
5 | |
6 # Tests for stream proxy module, the proxy_requests directive. | |
7 | |
8 ############################################################################### | |
9 | |
10 use warnings; | |
11 use strict; | |
12 | |
13 use Test::More; | |
14 | |
15 BEGIN { use FindBin; chdir($FindBin::Bin); } | |
16 | |
17 use lib 'lib'; | |
18 use Test::Nginx; | |
19 use Test::Nginx::Stream qw/ dgram /; | |
20 | |
21 ############################################################################### | |
22 | |
23 select STDERR; $| = 1; | |
24 select STDOUT; $| = 1; | |
25 | |
26 my $t = Test::Nginx->new()->has(qw/stream udp/) | |
27 ->write_file_expand('nginx.conf', <<'EOF'); | |
28 | |
29 %%TEST_GLOBALS%% | |
30 | |
31 daemon off; | |
32 | |
33 events { | |
34 } | |
35 | |
36 stream { | |
37 proxy_timeout 2100ms; | |
38 | |
39 log_format status $status; | |
40 | |
41 server { | |
42 listen 127.0.0.1:%%PORT_8980_UDP%% udp; | |
43 proxy_pass 127.0.0.1:%%PORT_8990_UDP%%; | |
44 | |
45 proxy_requests 0; | |
46 } | |
47 | |
48 server { | |
49 listen 127.0.0.1:%%PORT_8981_UDP%% udp; | |
50 proxy_pass 127.0.0.1:%%PORT_8990_UDP%%; | |
51 | |
52 proxy_requests 1; | |
53 } | |
54 | |
55 server { | |
56 listen 127.0.0.1:%%PORT_8982_UDP%% udp; | |
57 proxy_pass 127.0.0.1:%%PORT_8990_UDP%%; | |
58 | |
59 proxy_requests 2; | |
60 } | |
61 | |
62 server { | |
63 listen 127.0.0.1:%%PORT_8983_UDP%% udp; | |
64 proxy_pass 127.0.0.1:%%PORT_8990_UDP%%; | |
65 } | |
66 | |
67 server { | |
68 listen 127.0.0.1:%%PORT_8984_UDP%% udp; | |
69 proxy_pass 127.0.0.1:%%PORT_8991_UDP%%; | |
70 | |
71 proxy_requests 2; | |
72 access_log %%TESTDIR%%/s.log status; | |
73 } | |
74 | |
75 server { | |
76 listen 127.0.0.1:%%PORT_8985_UDP%% udp; | |
77 proxy_pass 127.0.0.1:%%PORT_8990_UDP%%; | |
78 | |
79 proxy_requests 2; | |
80 proxy_responses 2; | |
81 access_log %%TESTDIR%%/s2.log status; | |
82 } | |
83 } | |
84 | |
85 EOF | |
86 | |
87 | |
88 $t->run_daemon(\&udp_daemon, $t, port(8990)); | |
89 $t->run_daemon(\&udp_daemon, $t, port(8991)); | |
90 $t->try_run('no proxy_requests')->plan(26); | |
91 | |
92 $t->waitforfile($t->testdir . '/' . port(8990)); | |
93 $t->waitforfile($t->testdir . '/' . port(8991)); | |
94 | |
95 ############################################################################### | |
96 | |
97 # proxy_requests 0, binding is not dropped across streams | |
98 | |
99 my $s = dgram('127.0.0.1:' . port(8980)); | |
100 my $n = $s->io('1', read => 1); | |
101 ok($n, 'requests 0 create'); | |
102 is($s->read(), '1', 'requests 0 create - response'); | |
103 | |
104 is($s->io('1', read => 1), $n, 'requests 0 second - binding saved'); | |
105 is($s->read(), '1', 'requests 0 second - response'); | |
106 | |
107 is($s->io('1', read => 1), $n, 'requests 0 follow - binding saved'); | |
108 is($s->read(), '1', 'requests 0 follow - response'); | |
109 | |
110 # proxy_requests 1, binding is dropped on every next stream | |
111 | |
112 $s = dgram('127.0.0.1:' . port(8981)); | |
113 $n = $s->io('1', read => 1); | |
114 ok($n, 'requests 1 create'); | |
115 is($s->read(), '1', 'requests 1 create - response'); | |
116 | |
117 isnt($s->io('1', read => 1), $n, 'requests 1 second - binding lost'); | |
118 is($s->read(), '1', 'requests 1 second - response'); | |
119 | |
120 # proxy_requests 2, binding is dropped on every second stream | |
121 | |
122 $s = dgram('127.0.0.1:' . port(8982)); | |
123 $n = $s->io('1', read => 1); | |
124 ok($n, 'requests 2 create'); | |
125 is($s->read(), '1', 'requests 2 create - response'); | |
126 | |
127 is($s->io('1', read => 1), $n, 'requests 2 second - binding saved'); | |
128 is($s->read(), '1', 'requests 2 second - response'); | |
129 | |
130 isnt($s->io('1', read => 1), $n, 'requests 2 follow - binding lost'); | |
131 is($s->read(), '1', 'requests 2 follow - response'); | |
132 | |
133 # proxy_requests unset, binding is not dropped across streams | |
134 | |
135 $s = dgram('127.0.0.1:' . port(8983)); | |
136 $n = $s->io('1', read => 1); | |
137 ok($n, 'requests unset create'); | |
138 is($s->read(), '1', 'requests unset create - response'); | |
139 | |
140 is($s->io('1', read => 1), $n, 'requests unset second - binding saved'); | |
141 is($s->read(), '1', 'requests unset second - response'); | |
142 | |
143 is($s->io('1', read => 1), $n, 'requests unset follow - binding saved'); | |
144 is($s->read(), '1', 'requests unset follow - response'); | |
145 | |
146 # proxy_requests 2, with slow backend | |
147 # client sends 5 packets, each responded with 3 packets | |
148 # expects all packets proxied from backend, the last (uneven) session succeed | |
149 | |
150 $s = dgram('127.0.0.1:' . port(8984)); | |
151 $s->write('2') for 1 .. 5; | |
152 my $b = join ' ', map { $s->read() } (1 .. 15); | |
153 like($b, qr/^(\d+ 1 2) \1 (?!\1)(\d+ 1 2) \2 (?!\2)\d+ 1 2$/, 'slow backend'); | |
154 | |
155 # proxy_requests 2, proxy_responses 2 | |
156 # client sends 5 packets, each responded with 2 packets | |
157 # expects all packets proxied from backend, the last (uneven) session succeed | |
158 | |
159 $s = dgram('127.0.0.1:' . port(8985)); | |
160 $s->write('1') for 1 .. 5; | |
161 $b = join ' ', map { $s->read() } (1 .. 10); | |
162 like($b, qr/^(\d+ 1) \1 (?!\1)(\d+ 1) \2 (?!\2)\d+ 1$/, 'requests - responses'); | |
163 | |
164 $t->stop(); | |
165 | |
166 is($t->read_file('s.log'), <<EOF, 'uneven session status - slow backend'); | |
167 200 | |
168 200 | |
169 200 | |
170 EOF | |
171 | |
172 is($t->read_file('s2.log'), <<EOF, 'uneven session status - responses'); | |
173 200 | |
174 200 | |
175 200 | |
176 EOF | |
177 | |
178 ############################################################################### | |
179 | |
180 sub udp_daemon { | |
181 my ($t, $port) = @_; | |
182 | |
183 my $server = IO::Socket::INET->new( | |
184 Proto => 'udp', | |
185 LocalAddr => "127.0.0.1:$port", | |
186 Reuse => 1 | |
187 ) | |
188 or die "Can't create listening socket: $!\n"; | |
189 | |
190 # signal we are ready | |
191 | |
192 open my $fh, '>', $t->testdir() . "/$port"; | |
193 close $fh; | |
194 | |
195 my $slp = 1 if $port == port(8991); | |
196 | |
197 while (1) { | |
198 $server->recv(my $buffer, 65536); | |
199 sleep 1, $slp = 0 if $slp; | |
200 | |
201 $server->send($server->peerport()); | |
202 $server->send($_) for (1 .. $buffer); | |
203 } | |
204 } | |
205 | |
206 ############################################################################### |