Mercurial > hg > nginx-tests
annotate stream_udp_upstream.t @ 987:d6a2c7bcdc4c
Tests: stream proxy tests with complex value.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Thu, 21 Jul 2016 13:49:17 +0300 |
parents | 882267679006 |
children | 196d33c2bb45 |
rev | line source |
---|---|
868 | 1 #!/usr/bin/perl |
2 | |
3 # (C) Sergey Kandaurov | |
4 # (C) Nginx, Inc. | |
5 | |
6 # Stream tests for upstream module and balancers with datagrams. | |
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 | |
947
b9e42c554ba7
Tests: skip UDP tests on win32, udp feature introduced.
Sergey Kandaurov <pluknet@nginx.com>
parents:
868
diff
changeset
|
26 my $t = Test::Nginx->new()->has(qw/stream udp/) |
868 | 27 ->write_file_expand('nginx.conf', <<'EOF'); |
28 | |
29 %%TEST_GLOBALS%% | |
30 | |
31 daemon off; | |
32 | |
33 events { | |
34 } | |
35 | |
36 stream { | |
37 proxy_responses 1; | |
38 proxy_timeout 1s; | |
39 | |
40 upstream u { | |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
41 server 127.0.0.1:%%PORT_8084_UDP%%; |
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
42 server 127.0.0.1:%%PORT_8085_UDP%%; |
868 | 43 } |
44 | |
45 upstream u2 { | |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
46 server 127.0.0.1:%%PORT_8086_UDP%% down; |
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
47 server 127.0.0.1:%%PORT_8086_UDP%%; |
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
48 server 127.0.0.1:%%PORT_8084_UDP%%; |
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
49 server 127.0.0.1:%%PORT_8085_UDP%%; |
868 | 50 } |
51 | |
52 upstream u3 { | |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
53 server 127.0.0.1:%%PORT_8084_UDP%%; |
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
54 server 127.0.0.1:%%PORT_8085_UDP%% weight=2; |
868 | 55 } |
56 | |
57 upstream u4 { | |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
58 server 127.0.0.1:%%PORT_8086_UDP%%; |
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
59 server 127.0.0.1:%%PORT_8084_UDP%% backup; |
868 | 60 } |
61 | |
62 server { | |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
63 listen 127.0.0.1:%%PORT_8080_UDP%% udp; |
868 | 64 proxy_pass u; |
65 } | |
66 | |
67 server { | |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
68 listen 127.0.0.1:%%PORT_8081_UDP%% udp; |
868 | 69 proxy_pass u2; |
70 } | |
71 | |
72 server { | |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
73 listen 127.0.0.1:%%PORT_8082_UDP%% udp; |
868 | 74 proxy_pass u3; |
75 } | |
76 | |
77 server { | |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
78 listen 127.0.0.1:%%PORT_8083_UDP%% udp; |
868 | 79 proxy_pass u4; |
80 } | |
81 } | |
82 | |
83 EOF | |
84 | |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
85 $t->run_daemon(\&udp_daemon, port(8084), $t); |
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
86 $t->run_daemon(\&udp_daemon, port(8085), $t); |
868 | 87 $t->try_run('no stream udp')->plan(4); |
88 | |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
89 $t->waitforfile($t->testdir . '/' . port(8084)); |
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
90 $t->waitforfile($t->testdir . '/' . port(8085)); |
868 | 91 |
92 ############################################################################### | |
93 | |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
94 my @ports = my ($port4, $port5) = (port(8084), port(8085)); |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
95 |
974
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
96 is(many(30, port(8080)), "$port4: 15, $port5: 15", 'balanced'); |
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
97 is(many(30, port(8081)), "$port4: 15, $port5: 15", 'failures'); |
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
98 is(many(30, port(8082)), "$port4: 10, $port5: 20", 'weight'); |
882267679006
Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
952
diff
changeset
|
99 is(many(30, port(8083)), "$port4: 30", 'backup'); |
868 | 100 |
101 ############################################################################### | |
102 | |
103 sub many { | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
104 my ($count, $port) = @_; |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
105 my (%ports); |
868 | 106 |
107 for (1 .. $count) { | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
108 if (dgram("127.0.0.1:$port")->io('.') =~ /(\d+)/) { |
868 | 109 $ports{$1} = 0 unless defined $ports{$1}; |
110 $ports{$1}++; | |
111 } | |
112 } | |
113 | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
114 my @keys = map { my $p = $_; grep { $p == $_ } keys %ports } @ports; |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
115 return join ', ', map { $_ . ": " . $ports{$_} } @keys; |
868 | 116 } |
117 | |
118 ############################################################################### | |
119 | |
120 sub udp_daemon { | |
121 my ($port, $t) = @_; | |
122 | |
123 my $server = IO::Socket::INET->new( | |
124 Proto => 'udp', | |
125 LocalAddr => '127.0.0.1:' . $port, | |
126 Reuse => 1, | |
127 ) | |
128 or die "Can't create listening socket: $!\n"; | |
129 | |
130 # signal we are ready | |
131 | |
132 open my $fh, '>', $t->testdir() . '/' . $port; | |
133 close $fh; | |
134 | |
135 while (1) { | |
136 $server->recv(my $buffer, 65536); | |
137 $buffer = $server->sockport(); | |
138 $server->send($buffer); | |
139 } | |
140 } | |
141 | |
142 ############################################################################### |