Mercurial > hg > nginx-tests
annotate stream_udp_upstream.t @ 952:e9064d691790
Tests: converted tests to run in parallel.
author | Andrey Zelenkov <zelenkov@nginx.com> |
---|---|
date | Tue, 21 Jun 2016 16:39:13 +0300 |
parents | b9e42c554ba7 |
children | 882267679006 |
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 { | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
41 server 127.0.0.1:%%PORT_4_UDP%%; |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
42 server 127.0.0.1:%%PORT_5_UDP%%; |
868 | 43 } |
44 | |
45 upstream u2 { | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
46 server 127.0.0.1:%%PORT_6_UDP%% down; |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
47 server 127.0.0.1:%%PORT_6_UDP%%; |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
48 server 127.0.0.1:%%PORT_4_UDP%%; |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
49 server 127.0.0.1:%%PORT_5_UDP%%; |
868 | 50 } |
51 | |
52 upstream u3 { | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
53 server 127.0.0.1:%%PORT_4_UDP%%; |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
54 server 127.0.0.1:%%PORT_5_UDP%% weight=2; |
868 | 55 } |
56 | |
57 upstream u4 { | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
58 server 127.0.0.1:%%PORT_6_UDP%%; |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
59 server 127.0.0.1:%%PORT_4_UDP%% backup; |
868 | 60 } |
61 | |
62 server { | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
63 listen 127.0.0.1:%%PORT_0_UDP%% udp; |
868 | 64 proxy_pass u; |
65 } | |
66 | |
67 server { | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
68 listen 127.0.0.1:%%PORT_1_UDP%% udp; |
868 | 69 proxy_pass u2; |
70 } | |
71 | |
72 server { | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
73 listen 127.0.0.1:%%PORT_2_UDP%% udp; |
868 | 74 proxy_pass u3; |
75 } | |
76 | |
77 server { | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
78 listen 127.0.0.1:%%PORT_3_UDP%% udp; |
868 | 79 proxy_pass u4; |
80 } | |
81 } | |
82 | |
83 EOF | |
84 | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
85 $t->run_daemon(\&udp_daemon, port(4), $t); |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
86 $t->run_daemon(\&udp_daemon, port(5), $t); |
868 | 87 $t->try_run('no stream udp')->plan(4); |
88 | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
89 $t->waitforfile($t->testdir . '/' . port(4)); |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
90 $t->waitforfile($t->testdir . '/' . port(5)); |
868 | 91 |
92 ############################################################################### | |
93 | |
952
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
94 my @ports = my ($port4, $port5) = (port(4), port(5)); |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
95 |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
96 is(many(30, port(0)), "$port4: 15, $port5: 15", 'balanced'); |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
97 is(many(30, port(1)), "$port4: 15, $port5: 15", 'failures'); |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
98 is(many(30, port(2)), "$port4: 10, $port5: 20", 'weight'); |
e9064d691790
Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
947
diff
changeset
|
99 is(many(30, port(3)), "$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 ############################################################################### |