[PATCH 06 of 11] Tests: reworked mail SSL tests to use IO::Socket::SSL
Maxim Dounin
mdounin at mdounin.ru
Sun May 14 21:11:26 UTC 2023
Hello!
On Thu, May 11, 2023 at 06:39:32PM +0400, Sergey Kandaurov wrote:
> > On 17 Apr 2023, at 07:31, Maxim Dounin <mdounin at mdounin.ru> wrote:
> >
> > # HG changeset patch
> > # User Maxim Dounin <mdounin at mdounin.ru>
> > # Date 1681702257 -10800
> > # Mon Apr 17 06:30:57 2023 +0300
> > # Node ID 20d603cd3cbeab89127108fe9cb6dffd0e9469e8
> > # Parent a8e22a3212da945e9060d4233905eb6de1399d34
> > Tests: reworked mail SSL tests to use IO::Socket::SSL.
> >
> > Relevant infrastructure is provided in Test::Nginx::IMAP (and also POP3
> > and SMTP for completeness). This also ensures that SSL handshake and
> > various read operations are guarded with timeouts.
> >
>
> [..]
>
> > diff --git a/mail_ssl_conf_command.t b/mail_ssl_conf_command.t
> > --- a/mail_ssl_conf_command.t
> > +++ b/mail_ssl_conf_command.t
> > @@ -16,6 +16,7 @@ BEGIN { use FindBin; chdir($FindBin::Bin
> >
> > use lib 'lib';
> > use Test::Nginx;
> > +use Test::Nginx::IMAP;
> >
> > ###############################################################################
> >
> > @@ -24,15 +25,8 @@ select STDOUT; $| = 1;
> >
> > local $SIG{PIPE} = 'IGNORE';
> >
> > -eval {
> > - require Net::SSLeay;
> > - Net::SSLeay::load_error_strings();
> > - Net::SSLeay::SSLeay_add_ssl_algorithms();
> > - Net::SSLeay::randomize();
> > -};
> > -plan(skip_all => 'Net::SSLeay not installed') if $@;
> > -
> > -my $t = Test::Nginx->new()->has(qw/mail mail_ssl imap openssl:1.0.2/)
> > +my $t = Test::Nginx->new()
> > + ->has(qw/mail mail_ssl imap openssl:1.0.2 socket_ssl_reused/)
> > ->has_daemon('openssl');
> >
> > plan(skip_all => 'no ssl_conf_command') if $t->has_module('BoringSSL');
> > @@ -50,7 +44,7 @@ mail {
> > auth_http http://127.0.0.1:8080; # unused
> >
> > server {
> > - listen 127.0.0.1:8443 ssl;
> > + listen 127.0.0.1:8993 ssl;
>
> Please avoid using an upper half of 8000 .. 8999 range for TCP tests.
Still, correct port for IMAPS (IMAP over SSL) is 993, and proper
mapping to the 8xxx range would be 8993.
> The reason is a deficiency in automatic port selection used for
> parallel testing, see Test::Nginx::port(). Currently, ports are
> selected in the reversed order for TCP and UDP for a reason:
> another socket type for the same port is used as a lock.
> But that gives a race if you try to concurrently select the same
> port for both TCP and UDP.
> Currently, this is worked around by splitting the range:
> bottom half is used for TCP, upper half is used for UDP.
>
> Luckily, nginx retries bind/listen on NGX_EADDRINUSE up to 5 times,
> but this doesn't always work.
I tend to think this shouldn't be a practical issue unless the
same initial port number is used for both TCP and UDP tests. Commits
1236:93f749c1d5c5 and 1237:e4974af3fb12 suggests this was actually
the case when this split was introduced.
That is, failure to use proper port numbers matching the protocol
being tested was the real reason for the issue observed with
automatic port selection. And I would rather not use this issue
as an excuse to not use proper port numbers.
If that's will be demonstrated to be a practical problem even if
initial port numbers are different, a better solution might be to
allocate UDP ports in the 9xxx range. This will make it possible
to use proper port numbers in all cases.
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx-devel
mailing list