Mercurial > hg > nginx-tests
annotate lib/Test/Nginx/Stream.pm @ 869:f528369414aa
Tests: added tests for server_tokens directive.
author | Andrey Zelenkov <zelenkov@nginx.com> |
---|---|
date | Tue, 15 Mar 2016 17:02:33 +0300 |
parents | d2cb9ed7412e |
children | c380b4b7e2e4 |
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 PeerAddr => '127.0.0.1:8080', |
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 } |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
35 |
816 | 36 sub new { |
37 my $self = {}; | |
38 bless $self, shift @_; | |
39 | |
40 unshift(@_, "PeerAddr") if @_ == 1; | |
41 | |
42 $self->{_socket} = IO::Socket::INET->new( | |
43 Proto => "tcp", | |
44 PeerAddr => '127.0.0.1:8080', | |
45 @_ | |
46 ) | |
47 or die "Can't connect to nginx: $!\n"; | |
48 | |
49 if ({@_}->{'SSL'}) { | |
50 require IO::Socket::SSL; | |
51 IO::Socket::SSL->start_SSL($self->{_socket}, @_) | |
52 or die $IO::Socket::SSL::SSL_ERROR . "\n"; | |
53 } | |
54 | |
55 $self->{_socket}->autoflush(1); | |
56 | |
57 return $self; | |
58 } | |
59 | |
60 sub write { | |
61 my ($self, $message) = @_; | |
62 my $s = $self->{_socket}; | |
63 | |
64 local $SIG{PIPE} = 'IGNORE'; | |
65 | |
66 $s->blocking(0); | |
67 while (IO::Select->new($s)->can_write(1.5)) { | |
68 my $n = $s->syswrite($message); | |
69 log_out(substr($message, 0, $n)); | |
70 last unless $n; | |
71 | |
72 $message = substr($message, $n); | |
73 last unless length $message; | |
74 } | |
75 | |
76 if (length $message) { | |
77 $s->close(); | |
78 } | |
79 } | |
80 | |
81 sub read { | |
82 my ($self) = @_; | |
83 my ($s, $buf); | |
84 | |
85 $s = $self->{_socket}; | |
86 | |
87 $s->blocking(0); | |
88 if (IO::Select->new($s)->can_read(5)) { | |
89 $s->sysread($buf, 1024); | |
90 }; | |
91 | |
92 log_in($buf); | |
93 return $buf; | |
94 } | |
95 | |
96 sub io { | |
97 my $self = shift; | |
98 | |
99 my ($data, %extra) = @_; | |
100 my $length = $extra{length}; | |
868
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
101 my $read = $extra{read}; |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
102 |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
103 $read = 1 if !defined $read |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
104 && $self->{_socket}->socktype() == &SOCK_DGRAM; |
816 | 105 |
106 $self->write($data); | |
107 | |
108 $data = ''; | |
109 while (1) { | |
868
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
110 last if defined $read && --$read < 0; |
d2cb9ed7412e
Tests: stream udp tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
816
diff
changeset
|
111 |
816 | 112 my $buf = $self->read(); |
113 last unless length($buf); | |
114 | |
115 $data .= $buf; | |
116 last if defined $length && length($data) >= $length; | |
117 } | |
118 | |
119 return $data; | |
120 } | |
121 | |
122 sub sockport { | |
123 my $self = shift; | |
124 return $self->{_socket}->sockport(); | |
125 } | |
126 | |
127 ############################################################################### | |
128 | |
129 1; | |
130 | |
131 ############################################################################### |