annotate stream_udp_upstream_hash.t @ 1236:93f749c1d5c5

Tests: fixed parallel tests execution with UDP. Previously, when checking ports availability, a UDP socket was always created first, then a TCP socket was created. On success, one of UDP and TCP sockets was closed (depending on the "udp" option) and the second one was used to busy this port in other scripts. This lead to the following problem: in an attempt to reopen a UDP socket used in a given testing script it could be stolen by another script as part of checking ports availability. To solve this problem, UDP and TCP ports were split into two non-overlapping ranges: TCP ports are only used in the range 8000-8499, and UDP ports - in the range 8500-8999. In addition, the order of creating sockets in UDP tests has been reversed: now a TCP socket used as a lock precedes a UDP socket.
author Andrey Zelenkov <zelenkov@nginx.com>
date Thu, 26 Oct 2017 18:00:21 +0300
parents 196d33c2bb45
children e4974af3fb12
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;
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
43 server 127.0.0.1:%%PORT_8082_UDP%%;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
44 server 127.0.0.1:%%PORT_8083_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;
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
49 server 127.0.0.1:%%PORT_8082_UDP%%;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
50 server 127.0.0.1:%%PORT_8083_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 {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
54 listen 127.0.0.1:%%PORT_8080_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 {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
59 listen 127.0.0.1:%%PORT_8081_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
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
66 $t->run_daemon(\&udp_daemon, port(8082), $t);
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
67 $t->run_daemon(\&udp_daemon, port(8083), $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
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
70 $t->waitforfile($t->testdir . '/' . port(8082));
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
71 $t->waitforfile($t->testdir . '/' . port(8083));
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
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
75 my @ports = my ($port2, $port3) = (port(8082), port(8083));
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 947
diff changeset
76
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
77 is(many(10, port(8080)), "$port3: 10", 'hash');
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
78 like(many(10, port(8081)), 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 ###############################################################################