annotate stream_upstream.t @ 572:ca54b445d982

Tests: masked nginx bug in proxy next upstream. When iterating through several next upstreams per a worker cycle, a previously reported event about upstream connection error may be improperly applied to the next upstream, thus leading to the invalid connection error. E.g., in kqueue, where the problem is visible, this is caused by "ev->instance" that does not tolerate more than one next upstream at once, and kevents placed on the kqueue separately for read and write events. The change is to limit test case to the only one next upstream.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 14 May 2015 11:54:24 +0300
parents ff49e1c00b35
children 824754da4afc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1 #!/usr/bin/perl
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
2
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
3 # (C) Sergey Kandaurov
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
4 # (C) Nginx, Inc.
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
5
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
6 # Stream tests for upstream module and balancers.
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
7
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
8 ###############################################################################
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
9
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
10 use warnings;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
11 use strict;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
12
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
13 use Test::More;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
14
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
15 use IO::Select;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
16
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
17 BEGIN { use FindBin; chdir($FindBin::Bin); }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
18
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
19 use lib 'lib';
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
20 use Test::Nginx;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
21
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
22 ###############################################################################
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
23
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
24 select STDERR; $| = 1;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
25 select STDOUT; $| = 1;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
26
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
27 my $t = Test::Nginx->new()->has(qw/stream/)->plan(4)
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
28 ->write_file_expand('nginx.conf', <<'EOF');
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
29
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
30 %%TEST_GLOBALS%%
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
31
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
32 daemon off;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
33
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
34 events {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
35 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
36
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
37 stream {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
38 upstream u {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
39 server 127.0.0.1:8087;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
40 server 127.0.0.1:8088;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
41 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
42
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
43 upstream u2 {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
44 server 127.0.0.1:8089 down;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
45 server 127.0.0.1:8089;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
46 server 127.0.0.1:8087;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
47 server 127.0.0.1:8088;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
48 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
49
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
50 upstream u3 {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
51 server 127.0.0.1:8087;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
52 server 127.0.0.1:8088 weight=2;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
53 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
54
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
55 upstream u4 {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
56 server 127.0.0.1:8089;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
57 server 127.0.0.1:8087 backup;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
58 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
59
561
cd3e32d9997e Tests: adjusted stream test timeouts, visible on win32.
Sergey Kandaurov <pluknet@nginx.com>
parents: 556
diff changeset
60 proxy_connect_timeout 1s;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
61
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
62 server {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
63 listen 127.0.0.1:8081;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
64 proxy_pass u;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
65 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
66
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
67 server {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
68 listen 127.0.0.1:8082;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
69 proxy_pass u2;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
70 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
71
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
72 server {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
73 listen 127.0.0.1:8083;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
74 proxy_pass u3;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
75 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
76
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
77 server {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
78 listen 127.0.0.1:8084;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
79 proxy_pass u4;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
80 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
81 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
82
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
83 EOF
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
84
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
85 $t->run_daemon(\&stream_daemon, 8087);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
86 $t->run_daemon(\&stream_daemon, 8088);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
87 $t->run();
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
88
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
89 $t->waitforsocket('127.0.0.1:8087');
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
90 $t->waitforsocket('127.0.0.1:8088');
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
91
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
92 ###############################################################################
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
93
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
94 is(many('.', 30, peer => '127.0.0.1:8081'), '8087: 15, 8088: 15', 'balanced');
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
95 is(many('.', 30, peer => '127.0.0.1:8082'), '8087: 15, 8088: 15', 'failures');
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
96 is(many('.', 30, peer => '127.0.0.1:8083'), '8087: 10, 8088: 20', 'weight');
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
97 is(many('.', 30, peer => '127.0.0.1:8084'), '8087: 30', 'backup');
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
98
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
99 ###############################################################################
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
100
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
101 sub many {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
102 my ($data, $count, %opts) = @_;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
103 my (%ports, $peer);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
104
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
105 $peer = $opts{peer};
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
106
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
107 for (1 .. $count) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
108 if (stream_get($data, $peer) =~ /(\d+)/) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
109 $ports{$1} = 0 unless defined $ports{$1};
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
110 $ports{$1}++;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
111 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
112 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
113
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
114 return join ', ', map { $_ . ": " . $ports{$_} } sort keys %ports;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
115 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
116
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
117 sub stream_get {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
118 my ($data, $peer) = @_;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
119
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
120 my $s = stream_connect($peer);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
121 stream_write($s, $data);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
122
565
ff49e1c00b35 Tests: in stream tests, try to read all the data where appropriate.
Sergey Kandaurov <pluknet@nginx.com>
parents: 561
diff changeset
123 $data = '';
ff49e1c00b35 Tests: in stream tests, try to read all the data where appropriate.
Sergey Kandaurov <pluknet@nginx.com>
parents: 561
diff changeset
124 while (my $buf = stream_read($s)) {
ff49e1c00b35 Tests: in stream tests, try to read all the data where appropriate.
Sergey Kandaurov <pluknet@nginx.com>
parents: 561
diff changeset
125 $data .= $buf;
ff49e1c00b35 Tests: in stream tests, try to read all the data where appropriate.
Sergey Kandaurov <pluknet@nginx.com>
parents: 561
diff changeset
126 }
ff49e1c00b35 Tests: in stream tests, try to read all the data where appropriate.
Sergey Kandaurov <pluknet@nginx.com>
parents: 561
diff changeset
127 return $data;
556
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
128 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
129
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
130 sub stream_connect {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
131 my $peer = shift;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
132 my $s = IO::Socket::INET->new(
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
133 Proto => 'tcp',
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
134 PeerAddr => $peer
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
135 )
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
136 or die "Can't connect to nginx: $!\n";
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
137
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
138 return $s;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
139 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
140
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
141 sub stream_write {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
142 my ($s, $message) = @_;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
143
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
144 local $SIG{PIPE} = 'IGNORE';
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
145
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
146 $s->blocking(0);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
147 while (IO::Select->new($s)->can_write(1.5)) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
148 my $n = $s->syswrite($message);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
149 last unless $n;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
150 $message = substr($message, $n);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
151 last unless length $message;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
152 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
153
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
154 if (length $message) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
155 $s->close();
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
156 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
157 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
158
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
159 sub stream_read {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
160 my ($s) = @_;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
161 my ($buf);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
162
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
163 $s->blocking(0);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
164 if (IO::Select->new($s)->can_read(3)) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
165 $s->sysread($buf, 1024);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
166 };
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
167
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
168 log_in($buf);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
169 return $buf;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
170 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
171
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
172 ###############################################################################
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
173
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
174 sub stream_daemon {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
175 my ($port) = @_;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
176
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
177 my $server = IO::Socket::INET->new(
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
178 Proto => 'tcp',
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
179 LocalAddr => '127.0.0.1',
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
180 LocalPort => $port,
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
181 Listen => 5,
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
182 Reuse => 1
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
183 )
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
184 or die "Can't create listening socket: $!\n";
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
185
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
186 my $sel = IO::Select->new($server);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
187
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
188 local $SIG{PIPE} = 'IGNORE';
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
189
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
190 while (my @ready = $sel->can_read) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
191 foreach my $fh (@ready) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
192 if ($server == $fh) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
193 my $new = $fh->accept;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
194 $new->autoflush(1);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
195 $sel->add($new);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
196
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
197 } elsif (stream_handle_client($fh)) {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
198 $sel->remove($fh);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
199 $fh->close;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
200 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
201 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
202 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
203 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
204
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
205 sub stream_handle_client {
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
206 my ($client) = @_;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
207
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
208 log2c("(new connection $client)");
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
209
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
210 $client->sysread(my $buffer, 65536) or return 1;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
211
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
212 log2i("$client $buffer");
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
213
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
214 $buffer = $client->sockport();
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
215
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
216 log2o("$client $buffer");
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
217
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
218 $client->syswrite($buffer);
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
219
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
220 return 1;
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
221 }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
222
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
223 sub log2i { Test::Nginx::log_core('|| <<', @_); }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
224 sub log2o { Test::Nginx::log_core('|| >>', @_); }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
225 sub log2c { Test::Nginx::log_core('||', @_); }
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
226
97d89d9ab4ed Tests: basic stream upstream tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
227 ###############################################################################