On Mon, Jul 15, 2024 at 03:01:15PM +0300, Oksana Deeva wrote:
> # HG changeset patch
> # User Oksana Deeva <o.de...@wbsrv.ru>
> # Date 1721044584 -10800
> #      Mon Jul 15 14:56:24 2024 +0300
> # Node ID 50fc19b32628b1c5a2a49c127b013e15e4083dd6
> # Parent  0e9c1a8aa1d49e57b211e2c8ece94e00bf032ed7
> Tests: stream_udp_proxy_requests adjusted.
> 
> The test occasionally failed due to the fact that the order of packets
> could change. Now the order of packets will be ignored.
> 
> diff -r 0e9c1a8aa1d4 -r 50fc19b32628 stream_udp_proxy_requests.t
> --- a/stream_udp_proxy_requests.t     Fri Jul 12 01:19:15 2024 +0400
> +++ b/stream_udp_proxy_requests.t     Mon Jul 15 14:56:24 2024 +0300
> @@ -160,14 +160,23 @@
>  
>  $s = dgram('127.0.0.1:' . port(8985));
>  $s->write('1') for 1 .. 5;
> -$b = join ' ', map { $s->read() } (1 .. 10);
> +
> +my @parts = map { $s->read() } (1 .. 10);
> +
> +my $res = {};
> +for (my $i = 0; $i < scalar @parts; $i++) {
> +     my $part = $parts[$i];
>  
> -SKIP: {
> -skip 'session could early terminate', 1 unless $ENV{TEST_NGINX_UNSAFE};
> +     if ($i % 2 == 0) {
> +             $res->{$part} //= 0;
> +     } else {
> +             $res->{$parts[$i-1]} += $part;

Due to use of the relative order, this won't solve
a perfectly out-of-order sequence.

Rather, it may be fixed by introducing sequence numbers:

# HG changeset patch
# User Sergey Kandaurov <pluk...@nginx.com>
# Date 1721223063 -14400
#      Wed Jul 17 17:31:03 2024 +0400
# Node ID 64d10bdcce5e4a8b6294c26fdcf4ff9f9a42cac2
# Parent  b5ddbcf2fbb4d26712b5825ef660ebea30eacd8d
Tests: stream_udp_proxy_requests adjusted.

The test occasionally failed due to the fact that the order of packets
could change.  The fix is to introduce sequence numbers.

Inspired by Oksana Deeva.

diff --git a/stream_udp_proxy_requests.t b/stream_udp_proxy_requests.t
--- a/stream_udp_proxy_requests.t
+++ b/stream_udp_proxy_requests.t
@@ -76,7 +76,7 @@ stream {
 
     server {
         listen           127.0.0.1:%%PORT_8985_UDP%% udp;
-        proxy_pass       127.0.0.1:%%PORT_8990_UDP%%;
+        proxy_pass       127.0.0.1:%%PORT_8991_UDP%%;
 
         proxy_requests   2;
         proxy_responses  2;
@@ -150,24 +150,16 @@ is($s->read(), '1', 'requests unset foll
 # expects all packets proxied from backend, the last (uneven) session succeed
 
 $s = dgram('127.0.0.1:' . port(8984));
-$s->write('2') for 1 .. 5;
-my $b = join ' ', map { $s->read() } (1 .. 15);
-like($b, qr/^(\d+ 1 2) \1 (?!\1)(\d+ 1 2) \2 (?!\2)\d+ 1 2$/, 'slow backend');
+like(many($s, '2', 5, 15),
+       qr/^(\d+ 1 2) \1 (?!\1)(\d+ 1 2) \2 (?!\2)\d+ 1 2$/, 'slow backend');
 
 # proxy_requests 2, proxy_responses 2
 # client sends 5 packets, each responded with 2 packets
 # expects all packets proxied from backend, the last (uneven) session succeed
 
 $s = dgram('127.0.0.1:' . port(8985));
-$s->write('1') for 1 .. 5;
-$b = join ' ', map { $s->read() } (1 .. 10);
-
-SKIP: {
-skip 'session could early terminate', 1 unless $ENV{TEST_NGINX_UNSAFE};
-
-like($b, qr/^(\d+ 1) \1 (?!\1)(\d+ 1) \2 (?!\2)\d+ 1$/, 'requests - 
responses');
-
-}
+like(many($s, '1', 5, 10),
+       qr/^(\d+ 1) \1 (?!\1)(\d+ 1) \2 (?!\2)\d+ 1$/, 'requests - responses');
 
 $t->stop();
 
@@ -185,6 +177,17 @@ EOF
 
 ###############################################################################
 
+sub many {
+       my ($s, $buf, $wcount, $rcount) = @_;
+
+       $s->write($buf) for 1 .. $wcount;
+       join ' ', map { $_->[1] }
+               sort { $a->[0] <=> $b->[0] }
+               map { [ $s->read() =~ /^(\d+) (.+)/ ] } 1 .. $rcount;
+}
+
+###############################################################################
+
 sub udp_daemon {
        my ($t, $port) = @_;
 
@@ -200,14 +203,14 @@ sub udp_daemon {
        open my $fh, '>', $t->testdir() . "/$port";
        close $fh;
 
-       my $slp = 1 if $port == port(8991);
+       my ($slp, $i) = (1, 1) if $port == port(8991);
 
        while (1) {
                $server->recv(my $buffer, 65536);
                sleep 1, $slp = 0 if $slp;
 
-               $server->send($server->peerport());
-               $server->send($_) for (1 .. $buffer);
+               $server->send(($i ? "${\($i++)} " : "") . $server->peerport());
+               $server->send(($i ? "${\($i++)} " : "") . $_) for (1..$buffer);
        }
 }
 

> +     }
> +}
>  
> -like($b, qr/^(\d+ 1) \1 (?!\1)(\d+ 1) \2 (?!\2)\d+ 1$/, 'requests - 
> responses');
> +$b = join ' ', sort values %$res;
>  
> -}
> +is($b, '1 2 2', 'requests - responses');
>  
>  $t->stop();
>  
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel

Reply via email to