[PATCH] [nginx-tests] Tests: Add sleep to sub_filter_multi.t for TEST_NGINX_UNSAFE=1

Maxim Dounin mdounin at mdounin.ru
Thu Jun 20 00:45:20 UTC 2024


Hello!

On Wed, Jun 19, 2024 at 07:15:53AM +0900, Hiroaki Nakamura wrote:

> # HG changeset patch
> # User Hiroaki Nakamura <hnakamur at gmail.com>
> # Date 1718746554 -32400
> #      Wed Jun 19 06:35:54 2024 +0900
> # Node ID 8d9e1bc9721896618b0bb4095e39be46ca8fc280
> # Parent  a095b971fbcc99a77206173f6130d5ff2681c389
> Add sleep to sub_filter_multi for NGINX_TEST_UNSAFE=1
> 
> Without this fix, sub_filter_multi.t fails like below:
> ```
> $ sudo -u nginx TEST_NGINX_UNSAFE=1
> TEST_NGINX_BINARY=../freenginx/objs/nginx prove sub_filter_multi.t
> sub_filter_multi.t .. 37/44
> #   Failed test 'shortbuf match 1.3'
> #   at sub_filter_multi.t line 366.
> #                   undef
> #     doesn't match '(?^:(+ABCDE){3})'
> sub_filter_multi.t .. 42/44
> #   Failed test 'shortbuf match 5'
> #   at sub_filter_multi.t line 376.
> #                   undef
> #     doesn't match '(?^:+ABCDE(-*nyABCDE){2})'
> # Looks like you failed 2 tests of 44.
> sub_filter_multi.t .. Dubious, test returned 2 (wstat 512, 0x200)
> Failed 2/44 subtests
> ```
> 
> diff -r a095b971fbcc -r 8d9e1bc97218 sub_filter_multi.t
> --- a/sub_filter_multi.t        Tue Jun 04 18:38:01 2024 +0300
> +++ b/sub_filter_multi.t        Wed Jun 19 06:35:54 2024 +0900
> @@ -363,8 +363,8 @@
>         qr/(+A){3}/, 'shortbuf match 1.1');
>  like(http_get('/shortbuf/match1?a=' . 'abpatternyzABCD' x 3),
>         qr/(+ABCD){3}/, 'shortbuf match 1.2');
> -like(http_get('/shortbuf/match1?a=' . 'abpatternyzABCDE' x 3),
> -       qr/(+ABCDE){3}/, 'shortbuf match 1.3');
> +like(http_get('/shortbuf/match1?a=' . 'abpatternyzABCDE' x 3, sleep => 1),
> +               qr/(+ABCDE){3}/, 'shortbuf match 1.3');
>  like(http_get('/shortbuf/match2?a=' . 'abpatternyzAabpaernyzB' x 2),
>         qr/(+A-B){2}/, 'shortbuf match 2.1 (multiple replace)');
>  like(http_get('/shortbuf/match2?a=' . 'abpatternyzAabpaernyz' x 2),
> @@ -373,7 +373,7 @@
>         qr/(+A*){3}/, 'shortbuf match 3 (1 byte search pattern)');
>  like(http_get('/shortbuf/match4?a=' . 'pattABCDEFGHI' x 3),
>         qr/(+ABCDEFGHI){3}/, 'shortbuf match 4');
> -like(http_get('/shortbuf/match5?a=abpatternyzABCDE' . 'abpatternyABCDE' x 2),
> +like(http_get('/shortbuf/match5?a=abpatternyzABCDE' .
> 'abpatternyABCDE' x 2, sleep => 1),
>         qr/+ABCDE(-*nyABCDE){2}/, 'shortbuf match 5');
>  }

Thanks for the patch.

Using the "sleep" option looks wrong to me: it is designed to 
introduce a pause before sending the request body, and such a 
pause is not needed in these tests.

Instead, test failures you are seeing seems to be a result of the 
fact that tests in question take a lot of time, and http_get() 
times out while waiting for responses.

Overall, it looks like the tests are suboptimal and very fragile: 
they use "limit_rate 4; limit_rate_after 160;" on the upstream 
server, which results in 1 second response time for each 4 
bytes (over 164 bytes which are sent initially).  For example, the 
"shortbuf match 5" test, currently results in 147 bytes of 
the response headers and uses 46 bytes of the response body, so 
the last response byte is sent after 8 seconds - which is exactly 
the timeout value http_get() uses.  As such, the test is highly 
likely to fail.

Most likely, the test took slightly less time when it was 
initially written due to slightly shorter response headers, and 
therefore used to succeed.  Accordingly, a quick fix would be to 
use a larger limit_rate_after value, such as 165 or 170.

A better fix would be to rewrite all these tests with embedded 
Perl, similarly to how it is done in sub_filter_perl.t, so 
multiple buffers will be generated without any unneeded delays.  
This will make the tests much more robust and much faster.  Not 
sure it worth the effort though, especially given that these tests 
are under TEST_NGINX_UNSAFE and thus not really expected to be run 
automatically.

Below is a patch to bump limit_rate_after to 170, please take a 
look if it works for you:

# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1718843281 -10800
#      Thu Jun 20 03:28:01 2024 +0300
# Node ID 9ed5047551e7455353d61c3b7e955e959a594050
# Parent  a095b971fbcc99a77206173f6130d5ff2681c389
Tests: adjusted sub_filter_multi.t limit rate settings.

With previous settings some tests with short buffers, which are under
TEST_NGINX_UNSAFE, used to hit 8 seconds timeout in http_get(), leading
to test failures.

Reported by Hiroaki Nakamura,
https://freenginx.org/pipermail/nginx-devel/2024-June/000373.html

diff --git a/sub_filter_multi.t b/sub_filter_multi.t
--- a/sub_filter_multi.t
+++ b/sub_filter_multi.t
@@ -244,7 +244,7 @@ http {
         listen       127.0.0.1:8081;
 
         limit_rate 4;
-        limit_rate_after 160;
+        limit_rate_after 170;
 
         location / {
             return 200 $arg_a;


-- 
Maxim Dounin
http://mdounin.ru/



More information about the nginx-devel mailing list