Mercurial > hg > nginx-tests
view lib/Test/Nginx/Stream.pm @ 1790:ba625d5a02e4
Tests: updated try_run() to rely on nginx "-e".
The "-e" command line option introduced in nginx 1.19.5 is now used
to print error line on startup failures with TEST_NGINX_VERBOSE set.
This change replaces a previous approach (a1874249496d) compatible
with pre-1.19.5 nginx versions that used to redirect stderr to file.
Hence, "-e" compatibility is removed.
As a side effect, this fixes temporary directory removal on win32
left on startup failures because the "stderr" file was kept open.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Mon, 19 Sep 2022 13:26:32 +0400 |
parents | 29d0961bc3f7 |
children | 5d3aee48ed8e |
line wrap: on
line source
package Test::Nginx::Stream; # (C) Andrey Zelenkov # (C) Nginx, Inc. # Module for nginx stream tests. ############################################################################### use warnings; use strict; use base qw/ Exporter /; our @EXPORT_OK = qw/ stream dgram /; use Test::More qw//; use IO::Select; use IO::Socket; use Test::Nginx; sub stream { return Test::Nginx::Stream->new(@_); } sub dgram { unshift(@_, "PeerAddr") if @_ == 1; return Test::Nginx::Stream->new( Proto => "udp", @_ ); } sub new { my $self = {}; bless $self, shift @_; unshift(@_, "PeerAddr") if @_ == 1; $self->{_socket} = IO::Socket::INET->new( Proto => "tcp", PeerAddr => '127.0.0.1', @_ ) or die "Can't connect to nginx: $!\n"; if ({@_}->{'SSL'}) { require IO::Socket::SSL; IO::Socket::SSL->start_SSL($self->{_socket}, @_) or die $IO::Socket::SSL::SSL_ERROR . "\n"; } $self->{_socket}->autoflush(1); return $self; } sub write { my ($self, $message, %extra) = @_; my $s = $self->{_socket}; local $SIG{PIPE} = 'IGNORE'; $s->blocking(0); while (IO::Select->new($s)->can_write($extra{write_timeout} || 1.5)) { my $n = $s->syswrite($message); log_out(substr($message, 0, $n)); last unless $n; $message = substr($message, $n); last unless length $message; } if (length $message) { $s->close(); } } sub read { my ($self, %extra) = @_; my ($s, $buf); $s = $self->{_socket}; $s->blocking(0); if (IO::Select->new($s)->can_read($extra{read_timeout} || 8)) { $s->sysread($buf, 1024); }; log_in($buf); return $buf; } sub io { my $self = shift; my ($data, %extra) = @_; my $length = $extra{length}; my $read = $extra{read}; $read = 1 if !defined $read && $self->{_socket}->socktype() == &SOCK_DGRAM; $self->write($data, %extra); $data = ''; while (1) { last if defined $read && --$read < 0; my $buf = $self->read(%extra); last unless defined $buf and length($buf); $data .= $buf; last if defined $length && length($data) >= $length; } return $data; } sub sockaddr { my $self = shift; return $self->{_socket}->sockaddr(); } sub sockhost { my $self = shift; return $self->{_socket}->sockhost(); } sub sockport { my $self = shift; return $self->{_socket}->sockport(); } ############################################################################### 1; ###############################################################################