Mercurial > hg > nginx-tests
annotate lib/Test/Nginx/Stream.pm @ 1701:408fe0dd3fed
Tests: fixed mail_imap_ssl.t too long shutdown.
Prior to literals support in IMAP test backend (e7f0b4ca0a1a), early backend
response was treated as invalid, with subsequent proxy connection close.
Now that the connection continues successfully, this requires connection
close before nginx shutdown. Otherwise, it would wait for proxy_timeout.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Thu, 17 Jun 2021 19:52:36 +0300 |
parents | 29d0961bc3f7 |
children | 5d3aee48ed8e |
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 | |
41 $self->{_socket} = IO::Socket::INET->new( | |
42 Proto => "tcp", | |
951
9361c7eddfc1
Tests: parallel tests support.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
935
diff
changeset
|
43 PeerAddr => '127.0.0.1', |
816 | 44 @_ |
45 ) | |
46 or die "Can't connect to nginx: $!\n"; | |
47 | |
48 if ({@_}->{'SSL'}) { | |
49 require IO::Socket::SSL; | |
50 IO::Socket::SSL->start_SSL($self->{_socket}, @_) | |
51 or die $IO::Socket::SSL::SSL_ERROR . "\n"; | |
52 } | |
53 | |
54 $self->{_socket}->autoflush(1); | |
55 | |
56 return $self; | |
57 } | |
58 | |
59 sub write { | |
935
25a4b2fdd3fb
Tests: I/O timeout options introduced in Stream.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
875
diff
changeset
|
60 my ($self, $message, %extra) = @_; |
816 | 61 my $s = $self->{_socket}; |
62 | |
63 local $SIG{PIPE} = 'IGNORE'; | |
64 | |
65 $s->blocking(0); | |
935
25a4b2fdd3fb
Tests: I/O timeout options introduced in Stream.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
875
diff
changeset
|
66 while (IO::Select->new($s)->can_write($extra{write_timeout} || 1.5)) { |
816 | 67 my $n = $s->syswrite($message); |
68 log_out(substr($message, 0, $n)); | |
69 last unless $n; | |
70 | |
71 $message = substr($message, $n); | |
72 last unless length $message; | |
73 } | |
74 | |
75 if (length $message) { | |
76 $s->close(); | |
77 } | |
78 } | |
79 | |
80 sub read { | |
935
25a4b2fdd3fb
Tests: I/O timeout options introduced in Stream.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
875
diff
changeset
|
81 my ($self, %extra) = @_; |
816 | 82 my ($s, $buf); |
83 | |
84 $s = $self->{_socket}; | |
85 | |
86 $s->blocking(0); | |
1423
29d0961bc3f7
Tests: aligned generic read timeouts in stream and mail tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1235
diff
changeset
|
87 if (IO::Select->new($s)->can_read($extra{read_timeout} || 8)) { |
816 | 88 $s->sysread($buf, 1024); |
89 }; | |
90 | |
91 log_in($buf); | |
92 return $buf; | |
93 } | |
94 | |
95 sub io { | |
96 my $self = shift; | |
97 | |
98 my ($data, %extra) = @_; | |
99 my $length = $extra{length}; | |
868
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
100 my $read = $extra{read}; |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
101 |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
102 $read = 1 if !defined $read |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
103 && $self->{_socket}->socktype() == &SOCK_DGRAM; |
816 | 104 |
935
25a4b2fdd3fb
Tests: I/O timeout options introduced in Stream.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
875
diff
changeset
|
105 $self->write($data, %extra); |
816 | 106 |
107 $data = ''; | |
108 while (1) { | |
868
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
109 last if defined $read && --$read < 0; |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
110 |
935
25a4b2fdd3fb
Tests: I/O timeout options introduced in Stream.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
875
diff
changeset
|
111 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
|
112 last unless defined $buf and length($buf); |
816 | 113 |
114 $data .= $buf; | |
115 last if defined $length && length($data) >= $length; | |
116 } | |
117 | |
118 return $data; | |
119 } | |
120 | |
1024
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
121 sub sockaddr { |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
122 my $self = shift; |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
123 return $self->{_socket}->sockaddr(); |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
124 } |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
125 |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
126 sub sockhost { |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
127 my $self = shift; |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
128 return $self->{_socket}->sockhost(); |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
129 } |
91e64c1ceec9
Tests: stream access_log tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
969
diff
changeset
|
130 |
816 | 131 sub sockport { |
132 my $self = shift; | |
133 return $self->{_socket}->sockport(); | |
134 } | |
135 | |
136 ############################################################################### | |
137 | |
138 1; | |
139 | |
140 ############################################################################### |