annotate stream_proxy_protocol.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 f3ba4c74de31
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
612
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
1 #!/usr/bin/perl
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
2
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
3 # (C) Andrey Zelenkov
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
4 # (C) Nginx, Inc.
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
5
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
6 # Tests for stream proxy module with haproxy protocol.
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
7
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
8 ###############################################################################
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
9
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
10 use warnings;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
11 use strict;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
12
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
13 use Test::More;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
14
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
15 use IO::Select;
816
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 711
diff changeset
16 use Socket qw/ $CRLF /;
612
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
17
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
18 BEGIN { use FindBin; chdir($FindBin::Bin); }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
19
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
20 use lib 'lib';
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
21 use Test::Nginx;
816
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 711
diff changeset
22 use Test::Nginx::Stream qw/ stream /;
612
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
23
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
24 ###############################################################################
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
25
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
26 select STDERR; $| = 1;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
27 select STDOUT; $| = 1;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
28
1020
196d33c2bb45 Tests: removed TODO and try_run() checks for legacy versions.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 974
diff changeset
29 my $t = Test::Nginx->new()->has(qw/stream/)->plan(2)
612
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
30 ->write_file_expand('nginx.conf', <<'EOF');
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
31
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
32 %%TEST_GLOBALS%%
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
33
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
34 daemon off;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
35
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
36 events {
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
37 }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
38
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
39 stream {
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
40 proxy_protocol on;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
41
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
42 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
43 listen 127.0.0.1:8080;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
44 proxy_pass 127.0.0.1:8081;
612
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
45 }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
46
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
47 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
48 listen 127.0.0.1:8082;
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
49 proxy_pass 127.0.0.1:8081;
612
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
50 proxy_protocol off;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
51 }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
52 }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
53
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
54 EOF
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
55
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
56 $t->run_daemon(\&stream_daemon);
1020
196d33c2bb45 Tests: removed TODO and try_run() checks for legacy versions.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 974
diff changeset
57 $t->run();
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
58 $t->waitforsocket('127.0.0.1:' . port(8081));
612
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
59
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
60 ###############################################################################
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
61
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
62 my $dp = port(8080);
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 816
diff changeset
63 my $s = stream('127.0.0.1:' . $dp);
816
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 711
diff changeset
64 my $data = $s->io('close');
77359b849cd5 Tests: stream package.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 711
diff changeset
65 my $sp = $s->sockport();
952
e9064d691790 Tests: converted tests to run in parallel.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 816
diff changeset
66 is($data, "PROXY TCP4 127.0.0.1 127.0.0.1 $sp $dp${CRLF}close", 'protocol on');
612
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
67
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
68 is(stream('127.0.0.1:' . port(8082))->io('close'), 'close', 'protocol off');
612
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
69
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
70 ###############################################################################
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
71
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
72 sub stream_daemon {
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
73 my $server = IO::Socket::INET->new(
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
74 Proto => 'tcp',
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
75 LocalAddr => '127.0.0.1:' . port(8081),
612
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
76 Listen => 5,
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
77 Reuse => 1
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
78 )
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
79 or die "Can't create listening socket: $!\n";
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
80
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
81 my $sel = IO::Select->new($server);
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
82
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
83 local $SIG{PIPE} = 'IGNORE';
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
84
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
85 while (my @ready = $sel->can_read) {
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
86 foreach my $fh (@ready) {
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
87 if ($server == $fh) {
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
88 my $new = $fh->accept;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
89 $new->autoflush(1);
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
90 $sel->add($new);
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
91
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
92 } elsif (stream_handle_client($fh)) {
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
93 $sel->remove($fh);
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
94 $fh->close;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
95 }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
96 }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
97 }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
98 }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
99
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
100 sub stream_handle_client {
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
101 my ($client) = @_;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
102
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
103 log2c("(new connection $client)");
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
104
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
105 $client->sysread(my $buffer, 65536) or return 1;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
106
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
107 log2i("$client $buffer");
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
108
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
109 log2o("$client $buffer");
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
110
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
111 $client->syswrite($buffer);
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
112
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
113 return $buffer =~ /close/;
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
114 }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
115
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
116 sub log2i { Test::Nginx::log_core('|| <<', @_); }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
117 sub log2o { Test::Nginx::log_core('|| >>', @_); }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
118 sub log2c { Test::Nginx::log_core('||', @_); }
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
119
bae9850e566c Tests: some stream haproxy protocol tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
diff changeset
120 ###############################################################################