comparison lib/Test/Nginx/POP3.pm @ 1678:d0025a0dead7

Tests: better timeout handling in mail tests. The eval + alarm model used previously does not work on Windows (see perlport(1) for alarm), so it was replaced with non-blocking I/O.
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 19 May 2021 04:32:57 +0300
parents 29d0961bc3f7
children 3629eda94c1b
comparison
equal deleted inserted replaced
1677:f13ead27f89c 1678:d0025a0dead7
32 IO::Socket::SSL->start_SSL($self->{_socket}, @_) 32 IO::Socket::SSL->start_SSL($self->{_socket}, @_)
33 or die $IO::Socket::SSL::SSL_ERROR . "\n"; 33 or die $IO::Socket::SSL::SSL_ERROR . "\n";
34 } 34 }
35 35
36 $self->{_socket}->autoflush(1); 36 $self->{_socket}->autoflush(1);
37 $self->{_read_buffer} = '';
37 38
38 return $self; 39 return $self;
39 } 40 }
40 41
41 sub eof { 42 sub eof {
53 my ($self, $cmd) = @_; 54 my ($self, $cmd) = @_;
54 log_out($cmd); 55 log_out($cmd);
55 $self->{_socket}->print($cmd . CRLF); 56 $self->{_socket}->print($cmd . CRLF);
56 } 57 }
57 58
59 sub getline {
60 my ($self) = @_;
61 my $socket = $self->{_socket};
62
63 if ($self->{_read_buffer} =~ /^(.*?\x0a)(.*)/ms) {
64 $self->{_read_buffer} = $2;
65 return $1;
66 }
67
68 while (IO::Select->new($socket)->can_read(8)) {
69 $socket->blocking(0);
70 my $n = $socket->sysread(my $buf, 1024);
71 $socket->blocking(1);
72 last unless $n;
73
74 $self->{_read_buffer} .= $buf;
75
76 if ($self->{_read_buffer} =~ /^(.*?\x0a)(.*)/ms) {
77 $self->{_read_buffer} = $2;
78 return $1;
79 }
80 };
81 }
82
58 sub read { 83 sub read {
59 my ($self) = @_; 84 my ($self) = @_;
60 my $socket = $self->{_socket}; 85 my $socket = $self->{_socket};
61 eval { 86
62 local $SIG{ALRM} = sub { die "timeout\n" }; 87 while (defined($_ = $self->getline())) {
63 alarm(8); 88 log_in($_);
64 while (<$socket>) { 89 last;
65 log_in($_);
66 # XXX
67 next if m/^\d\d\d-/;
68 last;
69 }
70 alarm(0);
71 };
72 alarm(0);
73 if ($@) {
74 log_in("died: $@");
75 return undef;
76 } 90 }
91
77 return $_; 92 return $_;
78 } 93 }
79 94
80 sub check { 95 sub check {
81 my ($self, $regex, $name) = @_; 96 my ($self, $regex, $name) = @_;