annotate stream_udp_upstream_hash.t @ 1427:eb1d883305ea

Tests: avoid edge cases in upstream random two test. Unavailable servers contribute to the number of attempts, if selected, before the balancer would fall back to the default round-robin method. This means that it's quite possible to get server with more connections. To facilitate with selecting two alive servers, down server was removed from the upstream configuration at the cost of slightly worse coverage.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 10 Jan 2019 17:42:34 +0300
parents e4974af3fb12
children f3ba4c74de31
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
1 #!/usr/bin/perl
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
2
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
3 # (C) Sergey Kandaurov
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
4 # (C) Nginx, Inc.
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
5
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
6 # Stream tests for upstream hash balancer module with datagrams.
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
7
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
8 ###############################################################################
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
9
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
10 use warnings;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
11 use strict;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
12
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
13 use Test::More;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
14
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
15 BEGIN { use FindBin; chdir($FindBin::Bin); }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
16
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
17 use lib 'lib';
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
18 use Test::Nginx;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
19 use Test::Nginx::Stream qw/ dgram /;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
20
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
21 ###############################################################################
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
22
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
23 select STDERR; $| = 1;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
24 select STDOUT; $| = 1;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
25
1020
196d33c2bb45 Tests: removed TODO and try_run() checks for legacy versions.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 974
diff changeset
26 my $t = Test::Nginx->new()->has(qw/stream stream_upstream_hash udp/)->plan(2);
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
27
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
28 $t->write_file_expand('nginx.conf', <<'EOF');
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
29
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
30 %%TEST_GLOBALS%%
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
31
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
32 daemon off;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
33
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
34 events {
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
35 }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
36
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
37 stream {
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
38 proxy_responses 1;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
39 proxy_timeout 1s;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
40
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
41 upstream hash {
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
42 hash $remote_addr;
1237
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
43 server 127.0.0.1:%%PORT_8982_UDP%%;
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
44 server 127.0.0.1:%%PORT_8983_UDP%%;
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
45 }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
46
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
47 upstream cons {
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
48 hash $remote_addr consistent;
1237
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
49 server 127.0.0.1:%%PORT_8982_UDP%%;
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
50 server 127.0.0.1:%%PORT_8983_UDP%%;
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
51 }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
52
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
53 server {
1237
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
54 listen 127.0.0.1:%%PORT_8980_UDP%% udp;
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
55 proxy_pass hash;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
56 }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
57
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
58 server {
1237
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
59 listen 127.0.0.1:%%PORT_8981_UDP%% udp;
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
60 proxy_pass cons;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
61 }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
62 }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
63
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
64 EOF
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
65
1237
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
66 $t->run_daemon(\&udp_daemon, port(8982), $t);
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
67 $t->run_daemon(\&udp_daemon, port(8983), $t);
1020
196d33c2bb45 Tests: removed TODO and try_run() checks for legacy versions.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 974
diff changeset
68 $t->run();
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
69
1237
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
70 $t->waitforfile($t->testdir . '/' . port(8982));
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
71 $t->waitforfile($t->testdir . '/' . port(8983));
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
72
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
73 ###############################################################################
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
74
1237
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
75 my @ports = my ($port2, $port3) = (port(8982), port(8983));
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 947
diff changeset
76
1237
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
77 is(many(10, port(8980)), "$port3: 10", 'hash');
e4974af3fb12 Tests: adjusted udp ports to match allocated ports range.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 1020
diff changeset
78 like(many(10, port(8981)), qr/($port2|$port3): 10/, 'hash consistent');
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
79
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
80 ###############################################################################
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
81
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
82 sub many {
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 947
diff changeset
83 my ($count, $port) = @_;
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 947
diff changeset
84 my (%ports);
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
85
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
86 for (1 .. $count) {
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 947
diff changeset
87 if (dgram("127.0.0.1:$port")->io('.') =~ /(\d+)/) {
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
88 $ports{$1} = 0 unless defined $ports{$1};
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
89 $ports{$1}++;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
90 }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
91 }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
92
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 947
diff changeset
93 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
94 return join ', ', map { $_ . ": " . $ports{$_} } @keys;
868
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
95 }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
96
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
97 ###############################################################################
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
98
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
99 sub udp_daemon {
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
100 my ($port, $t) = @_;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
101
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
102 my $server = IO::Socket::INET->new(
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
103 Proto => 'udp',
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
104 LocalAddr => '127.0.0.1:' . $port,
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
105 Reuse => 1,
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
106 )
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
107 or die "Can't create listening socket: $!\n";
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
108
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
109 # signal we are ready
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
110
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
111 open my $fh, '>', $t->testdir() . '/' . $port;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
112 close $fh;
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
113
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
114 while (1) {
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
115 $server->recv(my $buffer, 65536);
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
116 $buffer = $server->sockport();
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
117 $server->send($buffer);
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
118 }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
119 }
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
120
d2cb9ed7412e Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
121 ###############################################################################