Mercurial > hg > nginx-tests
comparison 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 |
comparison
equal
deleted
inserted
replaced
815:9f5f604a840e | 816:77359b849cd5 |
---|---|
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 /; | |
14 our @EXPORT_OK = qw/ stream /; | |
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 | |
26 sub new { | |
27 my $self = {}; | |
28 bless $self, shift @_; | |
29 | |
30 unshift(@_, "PeerAddr") if @_ == 1; | |
31 | |
32 $self->{_socket} = IO::Socket::INET->new( | |
33 Proto => "tcp", | |
34 PeerAddr => '127.0.0.1:8080', | |
35 @_ | |
36 ) | |
37 or die "Can't connect to nginx: $!\n"; | |
38 | |
39 if ({@_}->{'SSL'}) { | |
40 require IO::Socket::SSL; | |
41 IO::Socket::SSL->start_SSL($self->{_socket}, @_) | |
42 or die $IO::Socket::SSL::SSL_ERROR . "\n"; | |
43 } | |
44 | |
45 $self->{_socket}->autoflush(1); | |
46 | |
47 return $self; | |
48 } | |
49 | |
50 sub write { | |
51 my ($self, $message) = @_; | |
52 my $s = $self->{_socket}; | |
53 | |
54 local $SIG{PIPE} = 'IGNORE'; | |
55 | |
56 $s->blocking(0); | |
57 while (IO::Select->new($s)->can_write(1.5)) { | |
58 my $n = $s->syswrite($message); | |
59 log_out(substr($message, 0, $n)); | |
60 last unless $n; | |
61 | |
62 $message = substr($message, $n); | |
63 last unless length $message; | |
64 } | |
65 | |
66 if (length $message) { | |
67 $s->close(); | |
68 } | |
69 } | |
70 | |
71 sub read { | |
72 my ($self) = @_; | |
73 my ($s, $buf); | |
74 | |
75 $s = $self->{_socket}; | |
76 | |
77 $s->blocking(0); | |
78 if (IO::Select->new($s)->can_read(5)) { | |
79 $s->sysread($buf, 1024); | |
80 }; | |
81 | |
82 log_in($buf); | |
83 return $buf; | |
84 } | |
85 | |
86 sub io { | |
87 my $self = shift; | |
88 | |
89 my ($data, %extra) = @_; | |
90 my $length = $extra{length}; | |
91 | |
92 $self->write($data); | |
93 | |
94 $data = ''; | |
95 while (1) { | |
96 my $buf = $self->read(); | |
97 last unless length($buf); | |
98 | |
99 $data .= $buf; | |
100 last if defined $length && length($data) >= $length; | |
101 } | |
102 | |
103 return $data; | |
104 } | |
105 | |
106 sub sockport { | |
107 my $self = shift; | |
108 return $self->{_socket}->sockport(); | |
109 } | |
110 | |
111 ############################################################################### | |
112 | |
113 1; | |
114 | |
115 ############################################################################### |