Mercurial > hg > nginx-tests
view stream_tcp_nodelay.t @ 1817:c045fbb98e9a
Tests: revised tests for listen port ranges.
Renumbered testing ports to get more chance to execute when run in parallel.
Relaxed condition to skip tests only when the port range is out of sequence.
Adjacent port numbers out of a specified range aren't crucial to skip tests:
if not in sequence, statistically this will be caught in subsequent runs.
Unsafe tests that use wildcard addresses are moved to a separate file.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Fri, 23 Dec 2022 19:20:50 +0400 |
parents | f3ba4c74de31 |
children |
line wrap: on
line source
#!/usr/bin/perl # (C) Andrey Zelenkov # (C) Sergey Kandaurov # (C) Nginx, Inc. # Stream tests for tcp_nodelay. ############################################################################### use warnings; use strict; use Test::More; use IO::Select; BEGIN { use FindBin; chdir($FindBin::Bin); } use lib 'lib'; use Test::Nginx; use Test::Nginx::Stream qw/ stream /; ############################################################################### select STDERR; $| = 1; select STDOUT; $| = 1; my $t = Test::Nginx->new()->has(qw/stream/); $t->plan(2)->write_file_expand('nginx.conf', <<'EOF'); %%TEST_GLOBALS%% daemon off; events { } stream { %%TEST_GLOBALS_STREAM%% proxy_buffer_size 1; tcp_nodelay off; server { listen 127.0.0.1:8081; proxy_pass 127.0.0.1:8080; } server { tcp_nodelay on; listen 127.0.0.1:8082; proxy_pass 127.0.0.1:8080; } } EOF $t->run_daemon(\&stream_daemon); $t->run()->waitforsocket('127.0.0.1:' . port(8080)); ############################################################################### my $str = '1234567890' x 10 . 'F'; my $length = length($str); is(stream('127.0.0.1:' . port(8081))->io($str, length => $length), $str, 'tcp_nodelay off'); is(stream('127.0.0.1:' . port(8082))->io($str, length => $length), $str, 'tcp_nodelay on'); ############################################################################### sub stream_daemon { my $server = IO::Socket::INET->new( Proto => 'tcp', LocalAddr => '127.0.0.1:' . port(8080), Listen => 5, Reuse => 1 ) or die "Can't create listening socket: $!\n"; my $sel = IO::Select->new($server); local $SIG{PIPE} = 'IGNORE'; while (my @ready = $sel->can_read) { foreach my $fh (@ready) { if ($server == $fh) { my $new = $fh->accept; $new->autoflush(1); $sel->add($new); } elsif (stream_handle_client($fh)) { $sel->remove($fh); $fh->close; } } } } sub stream_handle_client { my ($client) = @_; log2c("(new connection $client)"); $client->sysread(my $buffer, 65536) or return 1; log2i("$client $buffer"); my $close = $buffer =~ /F/; log2o("$client $buffer"); $client->syswrite($buffer); return $close; } sub log2i { Test::Nginx::log_core('|| <<', @_); } sub log2o { Test::Nginx::log_core('|| >>', @_); } sub log2c { Test::Nginx::log_core('||', @_); } ###############################################################################