Mercurial > hg > nginx-tests
annotate lib/Test/Nginx/Stream.pm @ 1999:15f538440a77 default tip
Tests: adjusted proxy_cache_use_stale.t cache validity.
At least the "s-w-r - updating stale" test sometimes fails on slow
hosts due to "stale-while-revalidate=4" being not enough, so the request
returns with the EXPIRED cache status instead of STALE.
Fix is to use larger "stale-while-revalidate=" times where it is not
significant.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Fri, 09 Aug 2024 18:37:25 +0300 |
parents | d732a96e05df |
children |
rev | line source |
---|---|
816 | 1 package Test::Nginx::Stream; |
2 | |
3 # (C) Andrey Zelenkov | |
4 # (C) Nginx, Inc. | |
5 | |
6 # Module for nginx stream tests. | |
7 | |
8 ############################################################################### | |
9 | |
10 use warnings; | |
11 use strict; | |
12 | |
13 use base qw/ Exporter /; | |
868
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
14 our @EXPORT_OK = qw/ stream dgram /; |
816 | 15 |
16 use Test::More qw//; | |
17 use IO::Select; | |
18 use IO::Socket; | |
19 | |
20 use Test::Nginx; | |
21 | |
22 sub stream { | |
23 return Test::Nginx::Stream->new(@_); | |
24 } | |
25 | |
868
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
26 sub dgram { |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
27 unshift(@_, "PeerAddr") if @_ == 1; |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
28 |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
29 return Test::Nginx::Stream->new( |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
30 Proto => "udp", |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
31 @_ |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
32 ); |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
33 } |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
34 |
816 | 35 sub new { |
36 my $self = {}; | |
37 bless $self, shift @_; | |
38 | |
39 unshift(@_, "PeerAddr") if @_ == 1; | |
40 | |
1863
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
41 eval { |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
42 local $SIG{ALRM} = sub { die "timeout\n" }; |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
43 local $SIG{PIPE} = sub { die "sigpipe\n" }; |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
44 alarm(8); |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
45 |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
46 $self->{_socket} = IO::Socket::INET->new( |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
47 Proto => "tcp", |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
48 PeerAddr => '127.0.0.1', |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
49 @_ |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
50 ) |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
51 or die "Can't connect to nginx: $!\n"; |
816 | 52 |
1863
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
53 if ({@_}->{'SSL'}) { |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
54 require IO::Socket::SSL; |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
55 IO::Socket::SSL->start_SSL( |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
56 $self->{_socket}, |
1970
6d3a8f4eb9b2
Tests: relaxed SSL version used in testing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1863
diff
changeset
|
57 SSL_version => 'SSLv23', |
1863
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
58 SSL_verify_mode => |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
59 IO::Socket::SSL::SSL_VERIFY_NONE(), |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
60 @_ |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
61 ) |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
62 or die $IO::Socket::SSL::SSL_ERROR . "\n"; |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
63 |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
64 my $s = $self->{_socket}; |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
65 log_in("ssl cipher: " . $s->get_cipher()); |
1980
d732a96e05df
Tests: logging of certificate subjects instead of issuers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1970
diff
changeset
|
66 log_in("ssl cert: " . $s->peer_certificate('subject')); |
1863
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
67 } |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
68 |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
69 alarm(0); |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
70 }; |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
71 alarm(0); |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
72 if ($@) { |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
73 log_in("died: $@"); |
816 | 74 } |
75 | |
76 $self->{_socket}->autoflush(1); | |
77 | |
78 return $self; | |
79 } | |
80 | |
1863
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
81 sub DESTROY { |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
82 my $self = shift; |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
83 $self->{_socket}->close(); |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
84 } |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
85 |
816 | 86 sub write { |
935
25a4b2fdd3fb
Tests: I/O timeout options introduced in Stream.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
875
diff
changeset
|
87 my ($self, $message, %extra) = @_; |
816 | 88 my $s = $self->{_socket}; |
89 | |
90 local $SIG{PIPE} = 'IGNORE'; | |
91 | |
92 $s->blocking(0); | |
935
25a4b2fdd3fb
Tests: I/O timeout options introduced in Stream.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
875
diff
changeset
|
93 while (IO::Select->new($s)->can_write($extra{write_timeout} || 1.5)) { |
816 | 94 my $n = $s->syswrite($message); |
1852
1197c152215b
Tests: fixed warning in case of a closed stream.
Eugene Grebenschikov <e.grebenshchikov@nginx.com>
parents:
1825
diff
changeset
|
95 last unless $n; |
816 | 96 log_out(substr($message, 0, $n)); |
97 | |
98 $message = substr($message, $n); | |
99 last unless length $message; | |
100 } | |
101 | |
102 if (length $message) { | |
103 $s->close(); | |
104 } | |
105 } | |
106 | |
107 sub read { | |
935
25a4b2fdd3fb
Tests: I/O timeout options introduced in Stream.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
875
diff
changeset
|
108 my ($self, %extra) = @_; |
816 | 109 my ($s, $buf); |
110 | |
111 $s = $self->{_socket}; | |
112 | |
113 $s->blocking(0); | |
1825
3629eda94c1b
Tests: handling of EWOULDBLOCK from sysread() with IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1824
diff
changeset
|
114 while (IO::Select->new($s)->can_read($extra{read_timeout} || 8)) { |
3629eda94c1b
Tests: handling of EWOULDBLOCK from sysread() with IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1824
diff
changeset
|
115 my $n = $s->sysread($buf, 1024); |
3629eda94c1b
Tests: handling of EWOULDBLOCK from sysread() with IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1824
diff
changeset
|
116 next if !defined $n && $!{EWOULDBLOCK}; |
3629eda94c1b
Tests: handling of EWOULDBLOCK from sysread() with IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1824
diff
changeset
|
117 last; |
1824 | 118 } |
816 | 119 |
120 log_in($buf); | |
121 return $buf; | |
122 } | |
123 | |
124 sub io { | |
125 my $self = shift; | |
126 | |
127 my ($data, %extra) = @_; | |
128 my $length = $extra{length}; | |
868
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
129 my $read = $extra{read}; |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
130 |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
131 $read = 1 if !defined $read |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
132 && $self->{_socket}->socktype() == &SOCK_DGRAM; |
816 | 133 |
935
25a4b2fdd3fb
Tests: I/O timeout options introduced in Stream.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
875
diff
changeset
|
134 $self->write($data, %extra); |
816 | 135 |
136 $data = ''; | |
137 while (1) { | |
868
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
138 last if defined $read && --$read < 0; |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
139 |
935
25a4b2fdd3fb
Tests: I/O timeout options introduced in Stream.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
875
diff
changeset
|
140 my $buf = $self->read(%extra); |
875
c380b4b7e2e4
Tests: compatibility with perl < 5.12 in Stream.pm.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
868
diff
changeset
|
141 last unless defined $buf and length($buf); |
816 | 142 |
143 $data .= $buf; | |
144 last if defined $length && length($data) >= $length; | |
145 } | |
146 | |
147 return $data; | |
148 } | |
149 | |
1024
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
150 sub sockaddr { |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
151 my $self = shift; |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
152 return $self->{_socket}->sockaddr(); |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
153 } |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
154 |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
155 sub sockhost { |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
156 my $self = shift; |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
157 return $self->{_socket}->sockhost(); |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
158 } |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
159 |
816 | 160 sub sockport { |
161 my $self = shift; | |
162 return $self->{_socket}->sockport(); | |
163 } | |
164 | |
1863
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
165 sub socket { |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
166 my ($self) = @_; |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
167 $self->{_socket}; |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
168 } |
dbb7561a9441
Tests: reworked stream SSL tests to use IO::Socket::SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1852
diff
changeset
|
169 |
816 | 170 ############################################################################### |
171 | |
172 1; | |
173 | |
174 ############################################################################### |