diff lib/Test/Nginx/Stream.pm @ 816:77359b849cd5

Tests: stream package.
author Andrey Zelenkov <zelenkov@nginx.com>
date Mon, 20 Jul 2015 15:06:09 +0300
parents
children d2cb9ed7412e
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/lib/Test/Nginx/Stream.pm
@@ -0,0 +1,115 @@
+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 /;
+
+use Test::More qw//;
+use IO::Select;
+use IO::Socket;
+
+use Test::Nginx;
+
+sub stream {
+	return Test::Nginx::Stream->new(@_);
+}
+
+sub new {
+	my $self = {};
+	bless $self, shift @_;
+
+	unshift(@_, "PeerAddr") if @_ == 1;
+
+	$self->{_socket} = IO::Socket::INET->new(
+		Proto => "tcp",
+		PeerAddr => '127.0.0.1:8080',
+		@_
+	)
+		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) = @_;
+	my $s = $self->{_socket};
+
+	local $SIG{PIPE} = 'IGNORE';
+
+	$s->blocking(0);
+	while (IO::Select->new($s)->can_write(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) = @_;
+	my ($s, $buf);
+
+	$s = $self->{_socket};
+
+	$s->blocking(0);
+	if (IO::Select->new($s)->can_read(5)) {
+		$s->sysread($buf, 1024);
+	};
+
+	log_in($buf);
+	return $buf;
+}
+
+sub io {
+	my $self = shift;
+
+	my ($data, %extra) = @_;
+	my $length = $extra{length};
+
+	$self->write($data);
+
+	$data = '';
+	while (1) {
+		my $buf = $self->read();
+		last unless length($buf);
+
+		$data .= $buf;
+		last if defined $length && length($data) >= $length;
+	}
+
+	return $data;
+}
+
+sub sockport {
+	my $self = shift;
+	return $self->{_socket}->sockport();
+}
+
+###############################################################################
+
+1;
+
+###############################################################################