Mercurial > hg > nginx-tests
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 |
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 ############################################################################### |