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 ###############################################################################