unsubscribe

Ilya yesin.iv at gmail.com
Mon Feb 24 18:42:58 UTC 2025


On Thu, Feb 20, 2025 at 7:18 PM <noreply at nginx.com> wrote:
>
> details:   https://github.com/nginx/njs/commit/89634204c4b12f17bbec826768d0d4e9dc5fae6c
> branches:  master
> commit:    89634204c4b12f17bbec826768d0d4e9dc5fae6c
> user:      Dmitry Volyntsev <xeioex at nginx.com>
> date:      Tue, 18 Feb 2025 22:53:54 -0800
> description:
> Tests: splitting js_periodic tests into multiple files.
>
>
> ---
>  nginx/t/js_periodic.t              |  92 +----------------
>  nginx/t/js_periodic_fetch.t        | 138 +++++++++++++++++++++++++
>  nginx/t/js_periodic_file.t         |  91 +++++++++++++++++
>  nginx/t/stream_js_periodic.t       | 103 +------------------
>  nginx/t/stream_js_periodic_fetch.t | 201 +++++++++++++++++++++++++++++++++++++
>  nginx/t/stream_js_periodic_file.t  | 144 ++++++++++++++++++++++++++
>  6 files changed, 580 insertions(+), 189 deletions(-)
>
> diff --git a/nginx/t/js_periodic.t b/nginx/t/js_periodic.t
> index 63afe379..d6868935 100644
> --- a/nginx/t/js_periodic.t
> +++ b/nginx/t/js_periodic.t
> @@ -59,46 +59,18 @@ http {
>              js_periodic test.tick interval=30ms jitter=1ms;
>              js_periodic test.timer interval=1s worker_affinity=all;
>              js_periodic test.overrun interval=30ms;
> -            js_periodic test.file interval=1s;
> -            js_periodic test.fetch interval=40ms;
> -            js_periodic test.multiple_fetches interval=1s;
>              js_periodic test.affinity interval=50ms worker_affinity=0101;
>              js_periodic test.vars interval=10s;
>
> -            js_periodic test.fetch_exception interval=1s;
>              js_periodic test.tick_exception interval=1s;
>              js_periodic test.timer_exception interval=1s;
>              js_periodic test.timeout_exception interval=30ms;
>          }
>
> -        location /engine {
> -            js_content test.engine;
> -        }
> -
> -        location /fetch_ok {
> -            return 200 'ok';
> -        }
> -
> -        location /fetch_foo {
> -            return 200 'foo';
> -        }
> -
>          location /test_affinity {
>              js_content test.test_affinity;
>          }
>
> -        location /test_fetch {
> -            js_content test.test_fetch;
> -        }
> -
> -        location /test_file {
> -            js_content test.test_file;
> -        }
> -
> -        location /test_multiple_fetches {
> -            js_content test.test_multiple_fetches;
> -        }
> -
>          location /test_tick {
>              js_content test.test_tick;
>          }
> @@ -119,51 +91,15 @@ http {
>
>  EOF
>
> -my $p0 = port(8080);
> -
>  $t->write_file('test.js', <<EOF);
> -    import fs from 'fs';
> -
> -    function engine(r) {
> -        r.return(200, njs.engine);
> -    }
> -
>      function affinity() {
>          ngx.shared.workers.set(ngx.worker_id, 1);
>      }
>
> -    async function fetch() {
> -        let reply = await ngx.fetch('http://127.0.0.1:$p0/fetch_ok');
> -        let body = await reply.text();
> -
> -        let v = ngx.shared.strings.get('fetch') || '';
> -        ngx.shared.strings.set('fetch', v + body);
> -    }
> -
>      function js_set() {
>          return 'JS-SET';
>      }
>
> -    async function multiple_fetches() {
> -        let reply = await ngx.fetch('http://127.0.0.1:$p0/fetch_ok');
> -        let reply2 = await ngx.fetch('http://127.0.0.1:$p0/fetch_foo');
> -        let body = await reply.text();
> -        let body2 = await reply2.text();
> -
> -        ngx.shared.strings.set('multiple_fetches', body + '\@' + body2);
> -    }
> -
> -    async function fetch_exception() {
> -        let reply = await ngx.fetch('garbage');
> -     }
> -
> -    async function file() {
> -        let fh = await fs.promises.open(ngx.conf_prefix + 'file', 'a+');
> -
> -        await fh.write('abc');
> -        await fh.close();
> -    }
> -
>      async function overrun() {
>          setTimeout(() => {}, 100000);
>      }
> @@ -214,20 +150,6 @@ $t->write_file('test.js', <<EOF);
>          r.return(200, `[\${ngx.shared.workers.keys().toSorted()}]`);
>      }
>
> -    function test_fetch(r) {
> -        r.return(200, ngx.shared.strings.get('fetch').startsWith('okok'));
> -    }
> -
> -    function test_file(r) {
> -        r.return(200,
> -             fs.readFileSync(ngx.conf_prefix + 'file').toString()  == 'abc');
> -    }
> -
> -    function test_multiple_fetches(r) {
> -        r.return(200, ngx.shared.strings.get('multiple_fetches')
> -                                                        .startsWith('ok\@foo'));
> -    }
> -
>      function test_tick(r) {
>          r.return(200, ngx.shared.nums.get('tick') >= 3);
>      }
> @@ -244,19 +166,14 @@ $t->write_file('test.js', <<EOF);
>          r.return(200, ngx.shared.strings.get('vars'));
>      }
>
> -    export default { affinity, fetch, fetch_exception, file, js_set,
> -                     multiple_fetches, overrun, vars, test_affinity, test_fetch,
> -                     test_file, test_multiple_fetches, test_tick,
> +    export default { affinity, js_set, overrun, vars, test_affinity, test_tick,
>                       test_timeout_exception, test_timer, test_vars, tick,
> -                     tick_exception, timer, timer_exception,
> -                     timeout_exception, engine };
> +                     tick_exception, timer, timer_exception, timeout_exception };
>  EOF
>
>  $t->try_run('no js_periodic');
>
> -plan(skip_all => 'not yet') if http_get('/engine') =~ /QuickJS$/m;
> -
> -$t->plan(9);
> +$t->plan(6);
>
>  ###############################################################################
>
> @@ -265,9 +182,6 @@ select undef, undef, undef, 0.1;
>  like(http_get('/test_affinity'), qr/\[1,3]/, 'affinity test');
>  like(http_get('/test_tick'), qr/true/, '3x tick test');
>  like(http_get('/test_timer'), qr/true/, 'timer test');
> -like(http_get('/test_file'), qr/true/, 'file test');
> -like(http_get('/test_fetch'), qr/true/, 'periodic fetch test');
> -like(http_get('/test_multiple_fetches'), qr/true/, 'multiple fetch test');
>
>  like(http_get('/test_timeout_exception'), qr/true/, 'timeout exception test');
>  like(http_get('/test_vars'), qr/JS-VAR\|JS-SET\|MAP-VAR/, 'vars test');
> diff --git a/nginx/t/js_periodic_fetch.t b/nginx/t/js_periodic_fetch.t
> new file mode 100644
> index 00000000..d7bcfb76
> --- /dev/null
> +++ b/nginx/t/js_periodic_fetch.t
> @@ -0,0 +1,138 @@
> +#!/usr/bin/perl
> +
> +# (C) Dmitry Volyntsev
> +# (C) Nginx, Inc.
> +
> +# Tests for js_periodic directive.
> +
> +###############################################################################
> +
> +use warnings;
> +use strict;
> +
> +use Test::More;
> +use Socket qw/ CRLF /;
> +
> +BEGIN { use FindBin; chdir($FindBin::Bin); }
> +
> +use lib 'lib';
> +use Test::Nginx;
> +
> +###############################################################################
> +
> +select STDERR; $| = 1;
> +select STDOUT; $| = 1;
> +
> +my $t = Test::Nginx->new()->has(qw/http rewrite/)
> +       ->write_file_expand('nginx.conf', <<'EOF');
> +
> +%%TEST_GLOBALS%%
> +
> +daemon off;
> +worker_processes 4;
> +
> +events {
> +}
> +
> +worker_shutdown_timeout 100ms;
> +
> +http {
> +    %%TEST_GLOBALS_HTTP%%
> +
> +    js_import test.js;
> +
> +    js_shared_dict_zone zone=strings:32k;
> +
> +    server {
> +        listen       127.0.0.1:8080;
> +        server_name  localhost;
> +
> +        location @periodic {
> +            js_periodic test.fetch interval=40ms;
> +            js_periodic test.multiple_fetches interval=1s;
> +
> +            js_periodic test.fetch_exception interval=1s;
> +        }
> +
> +        location /engine {
> +            js_content test.engine;
> +        }
> +
> +        location /fetch_ok {
> +            return 200 'ok';
> +        }
> +
> +        location /fetch_foo {
> +            return 200 'foo';
> +        }
> +
> +        location /test_fetch {
> +            js_content test.test_fetch;
> +        }
> +
> +        location /test_multiple_fetches {
> +            js_content test.test_multiple_fetches;
> +        }
> +    }
> +}
> +
> +EOF
> +
> +my $p0 = port(8080);
> +
> +$t->write_file('test.js', <<EOF);
> +    function engine(r) {
> +        r.return(200, njs.engine);
> +    }
> +
> +    async function fetch() {
> +        let reply = await ngx.fetch('http://127.0.0.1:$p0/fetch_ok');
> +        let body = await reply.text();
> +
> +        let v = ngx.shared.strings.get('fetch') || '';
> +        ngx.shared.strings.set('fetch', v + body);
> +    }
> +
> +    async function multiple_fetches() {
> +        let reply = await ngx.fetch('http://127.0.0.1:$p0/fetch_ok');
> +        let reply2 = await ngx.fetch('http://127.0.0.1:$p0/fetch_foo');
> +        let body = await reply.text();
> +        let body2 = await reply2.text();
> +
> +        ngx.shared.strings.set('multiple_fetches', body + '\@' + body2);
> +    }
> +
> +    async function fetch_exception() {
> +        let reply = await ngx.fetch('garbage');
> +     }
> +
> +    function test_fetch(r) {
> +        r.return(200, ngx.shared.strings.get('fetch').startsWith('okok'));
> +    }
> +
> +    function test_multiple_fetches(r) {
> +        r.return(200, ngx.shared.strings.get('multiple_fetches')
> +                                                        .startsWith('ok\@foo'));
> +    }
> +
> +    export default { fetch, fetch_exception, multiple_fetches, test_fetch,
> +                     test_multiple_fetches, engine };
> +EOF
> +
> +$t->try_run('no js_periodic with fetch');
> +
> +plan(skip_all => 'not yet') if http_get('/engine') =~ /QuickJS$/m;
> +
> +$t->plan(3);
> +
> +###############################################################################
> +
> +select undef, undef, undef, 0.1;
> +
> +like(http_get('/test_fetch'), qr/true/, 'periodic fetch test');
> +like(http_get('/test_multiple_fetches'), qr/true/, 'multiple fetch test');
> +
> +$t->stop();
> +
> +unlike($t->read_file('error.log'), qr/\[error\].*should not be seen/,
> +       'check for not discadred events');
> diff --git a/nginx/t/js_periodic_file.t b/nginx/t/js_periodic_file.t
> new file mode 100644
> index 00000000..e8eb3070
> --- /dev/null
> +++ b/nginx/t/js_periodic_file.t
> @@ -0,0 +1,91 @@
> +#!/usr/bin/perl
> +
> +# (C) Dmitry Volyntsev
> +# (C) Nginx, Inc.
> +
> +# Tests for js_periodic directive.
> +
> +###############################################################################
> +
> +use warnings;
> +use strict;
> +
> +use Test::More;
> +use Socket qw/ CRLF /;
> +
> +BEGIN { use FindBin; chdir($FindBin::Bin); }
> +
> +use lib 'lib';
> +use Test::Nginx;
> +
> +###############################################################################
> +
> +select STDERR; $| = 1;
> +select STDOUT; $| = 1;
> +
> +my $t = Test::Nginx->new()->has(qw/http rewrite/)
> +       ->write_file_expand('nginx.conf', <<'EOF');
> +
> +%%TEST_GLOBALS%%
> +
> +daemon off;
> +worker_processes 4;
> +
> +events {
> +}
> +
> +worker_shutdown_timeout 100ms;
> +
> +http {
> +    %%TEST_GLOBALS_HTTP%%
> +
> +    js_import test.js;
> +
> +    server {
> +        listen       127.0.0.1:8080;
> +        server_name  localhost;
> +
> +        location @periodic {
> +            js_periodic test.file interval=1s;
> +        }
> +
> +        location /test_file {
> +            js_content test.test_file;
> +        }
> +    }
> +}
> +
> +EOF
> +
> +$t->write_file('test.js', <<EOF);
> +    import fs from 'fs';
> +
> +    async function file() {
> +        let fh = await fs.promises.open(ngx.conf_prefix + 'file', 'a+');
> +
> +        await fh.write('abc');
> +        await fh.close();
> +    }
> +
> +    function test_file(r) {
> +        r.return(200,
> +             fs.readFileSync(ngx.conf_prefix + 'file').toString()  == 'abc');
> +    }
> +
> +    export default { file, test_file };
> +EOF
> +
> +$t->try_run('no js_periodic with fs support');
> +
> +$t->plan(2);
> +
> +###############################################################################
> +
> +select undef, undef, undef, 0.1;
> +
> +like(http_get('/test_file'), qr/true/, 'file test');
> +
> +$t->stop();
> +
> +unlike($t->read_file('error.log'), qr/\[error\].*should not be seen/,
> +       'check for not discadred events');
> diff --git a/nginx/t/stream_js_periodic.t b/nginx/t/stream_js_periodic.t
> index 4b9e319b..ac64045e 100644
> --- a/nginx/t/stream_js_periodic.t
> +++ b/nginx/t/stream_js_periodic.t
> @@ -58,13 +58,9 @@ stream {
>          js_periodic test.tick interval=30ms jitter=1ms;
>          js_periodic test.timer interval=1s worker_affinity=all;
>          js_periodic test.overrun interval=30ms;
> -        js_periodic test.file interval=1s;
> -        js_periodic test.fetch interval=40ms;
> -        js_periodic test.multiple_fetches interval=1s;
>          js_periodic test.affinity interval=50ms worker_affinity=0101;
>          js_periodic test.vars interval=10s;
>
> -        js_periodic test.fetch_exception interval=1s;
>          js_periodic test.tick_exception interval=1s;
>          js_periodic test.timer_exception interval=1s;
>          js_periodic test.timeout_exception interval=30ms;
> @@ -75,76 +71,17 @@ stream {
>      }
>  }
>
> -http {
> -    %%TEST_GLOBALS_HTTP%%
> -
> -    js_import test.js;
> -
> -    server {
> -        listen       127.0.0.1:8080;
> -        server_name  localhost;
> -
> -        location /engine {
> -            js_content test.engine;
> -        }
> -
> -        location /fetch_ok {
> -            return 200 'ok';
> -        }
> -
> -        location /fetch_foo {
> -            return 200 'foo';
> -        }
> -    }
> -}
> -
>  EOF
>
> -my $p1 = port(8080);
> -
>  $t->write_file('test.js', <<EOF);
> -    import fs from 'fs';
> -
> -    function engine(r) {
> -        r.return(200, njs.engine);
> -    }
> -
>      function affinity() {
>          ngx.shared.workers.set(ngx.worker_id, 1);
>      }
>
> -    async function fetch() {
> -        let reply = await ngx.fetch('http://127.0.0.1:$p1/fetch_ok');
> -        let body = await reply.text();
> -
> -        let v = ngx.shared.strings.get('fetch') || '';
> -        ngx.shared.strings.set('fetch', v + body);
> -    }
> -
> -    async function fetch_exception() {
> -        let reply = await ngx.fetch('garbage');
> -     }
> -
>      function js_set() {
>          return 'JS-SET';
>      }
>
> -    async function multiple_fetches() {
> -        let reply = await ngx.fetch('http://127.0.0.1:$p1/fetch_ok');
> -        let reply2 = await ngx.fetch('http://127.0.0.1:$p1/fetch_foo');
> -        let body = await reply.text();
> -        let body2 = await reply2.text();
> -
> -        ngx.shared.strings.set('multiple_fetches', body + '\@' + body2);
> -    }
> -
> -    async function file() {
> -        let fh = await fs.promises.open(ngx.conf_prefix + 'file', 'a+');
> -
> -        await fh.write('abc');
> -        await fh.close();
> -    }
> -
>      async function overrun() {
>          setTimeout(() => {}, 100000);
>      }
> @@ -202,34 +139,6 @@ $t->write_file('test.js', <<EOF);
>                          return;
>                      }
>
> -                    break;
> -                case 'fetch':
> -                    if (ngx.shared.strings.get('fetch').startsWith('okok')) {
> -                        s.done();
> -                        return;
> -                    }
> -
> -                    break;
> -
> -                case 'multiple_fetches':
> -                    if (ngx.shared.strings.get('multiple_fetches')
> -                        .startsWith('ok\@foo'))
> -                    {
> -                        s.done();
> -                        return;
> -                    }
> -
> -                    break;
> -
> -                case 'file':
> -                    let file_data = fs.readFileSync(ngx.conf_prefix + 'file')
> -                                                                    .toString();
> -
> -                    if (file_data == 'abc') {
> -                        s.done();
> -                        return;
> -                    }
> -
>                      break;
>
>                  case 'tick':
> @@ -274,15 +183,13 @@ $t->write_file('test.js', <<EOF);
>          });
>      }
>
> -    export default { affinity, fetch, fetch_exception, js_set, multiple_fetches,
> -                     file, overrun, test, tick, tick_exception, timer,
> -                     timer_exception, timeout_exception, vars, engine };
> +    export default { affinity, js_set,  overrun, test, tick, tick_exception,
> +                     timer, timer_exception, timeout_exception, vars };
>  EOF
>
>  $t->run_daemon(\&stream_daemon, port(8090));
>  $t->try_run('no js_periodic');
> -plan(skip_all => 'not yet') if http_get('/engine') =~ /QuickJS$/m;
> -$t->plan(9);
> +$t->plan(6);
>  $t->waitforsocket('127.0.0.1:' . port(8090));
>
>  ###############################################################################
> @@ -293,10 +200,6 @@ is(stream('127.0.0.1:' . port(8081))->io('affinity'), 'affinity',
>         'affinity test');
>  is(stream('127.0.0.1:' . port(8081))->io('tick'), 'tick', '3x tick test');
>  is(stream('127.0.0.1:' . port(8081))->io('timer'), 'timer', 'timer test');
> -is(stream('127.0.0.1:' . port(8081))->io('file'), 'file', 'file test');
> -is(stream('127.0.0.1:' . port(8081))->io('fetch'), 'fetch', 'fetch test');
> -is(stream('127.0.0.1:' . port(8081))->io('multiple_fetches'),
> -       'multiple_fetches', 'muliple fetches test');
>  is(stream('127.0.0.1:' . port(8081))->io('timeout_exception'),
>         'timeout_exception', 'timeout exception test');
>  is(stream('127.0.0.1:' . port(8081))->io('vars'), 'vars', 'vars test');
> diff --git a/nginx/t/stream_js_periodic_fetch.t b/nginx/t/stream_js_periodic_fetch.t
> new file mode 100644
> index 00000000..e88d69d5
> --- /dev/null
> +++ b/nginx/t/stream_js_periodic_fetch.t
> @@ -0,0 +1,201 @@
> +#!/usr/bin/perl
> +
> +# (C) Dmitry Volyntsev
> +# (C) Nginx, Inc.
> +
> +# Tests for stream njs module, js_periodic directive.
> +
> +###############################################################################
> +
> +use warnings;
> +use strict;
> +
> +use Test::More;
> +use Socket qw/ CRLF /;
> +
> +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/http rewrite stream/)
> +       ->write_file_expand('nginx.conf', <<'EOF');
> +
> +%%TEST_GLOBALS%%
> +
> +daemon off;
> +worker_processes 4;
> +
> +events {
> +}
> +
> +worker_shutdown_timeout 100ms;
> +
> +stream {
> +    %%TEST_GLOBALS_STREAM%%
> +
> +    js_import test.js;
> +
> +    js_shared_dict_zone zone=strings:32k;
> +
> +    server {
> +        listen       127.0.0.1:8081;
> +
> +        js_periodic test.fetch interval=40ms;
> +        js_periodic test.multiple_fetches interval=1s;
> +
> +        js_periodic test.fetch_exception interval=1s;
> +
> +        js_preread test.test;
> +
> +        proxy_pass 127.0.0.1:8090;
> +    }
> +}
> +
> +http {
> +    %%TEST_GLOBALS_HTTP%%
> +
> +    js_import test.js;
> +
> +    server {
> +        listen       127.0.0.1:8080;
> +        server_name  localhost;
> +
> +        location /engine {
> +            js_content test.engine;
> +        }
> +
> +        location /fetch_ok {
> +            return 200 'ok';
> +        }
> +
> +        location /fetch_foo {
> +            return 200 'foo';
> +        }
> +    }
> +}
> +
> +EOF
> +
> +my $p1 = port(8080);
> +
> +$t->write_file('test.js', <<EOF);
> +    function engine(r) {
> +        r.return(200, njs.engine);
> +    }
> +
> +    async function fetch() {
> +        let reply = await ngx.fetch('http://127.0.0.1:$p1/fetch_ok');
> +        let body = await reply.text();
> +
> +        let v = ngx.shared.strings.get('fetch') || '';
> +        ngx.shared.strings.set('fetch', v + body);
> +    }
> +
> +    async function fetch_exception() {
> +        let reply = await ngx.fetch('garbage');
> +     }
> +
> +    async function multiple_fetches() {
> +        let reply = await ngx.fetch('http://127.0.0.1:$p1/fetch_ok');
> +        let reply2 = await ngx.fetch('http://127.0.0.1:$p1/fetch_foo');
> +        let body = await reply.text();
> +        let body2 = await reply2.text();
> +
> +        ngx.shared.strings.set('multiple_fetches', body + '\@' + body2);
> +    }
> +
> +    function test(s) {
> +        s.on('upload', function (data) {
> +            if (data.length > 0) {
> +                switch (data) {
> +                case 'fetch':
> +                    if (ngx.shared.strings.get('fetch').startsWith('okok')) {
> +                        s.done();
> +                        return;
> +                    }
> +
> +                    break;
> +
> +                case 'multiple_fetches':
> +                    if (ngx.shared.strings.get('multiple_fetches')
> +                        .startsWith('ok\@foo'))
> +                    {
> +                        s.done();
> +                        return;
> +                    }
> +
> +                    break;
> +
> +                default:
> +                    throw new Error(`Unknown test "\${data}"`);
> +                }
> +
> +                throw new Error(`Test "\${data}" failed`);
> +            }
> +        });
> +    }
> +
> +    export default { engine, fetch, fetch_exception, test, multiple_fetches };
> +EOF
> +
> +$t->run_daemon(\&stream_daemon, port(8090));
> +$t->try_run('no js_periodic with fetch');
> +plan(skip_all => 'not yet') if http_get('/engine') =~ /QuickJS$/m;
> +$t->plan(3);
> +$t->waitforsocket('127.0.0.1:' . port(8090));
> +
> +###############################################################################
> +
> +select undef, undef, undef, 0.2;
> +
> +is(stream('127.0.0.1:' . port(8081))->io('fetch'), 'fetch', 'fetch test');
> +is(stream('127.0.0.1:' . port(8081))->io('multiple_fetches'),
> +       'multiple_fetches', 'muliple fetches test');
> +
> +$t->stop();
> +
> +unlike($t->read_file('error.log'), qr/\[error\].*should not be seen/,
> +       'check for not discadred events');
> +
> +###############################################################################
> +
> +sub stream_daemon {
> +       my $server = IO::Socket::INET->new(
> +               Proto => 'tcp',
> +               LocalAddr => '127.0.0.1:' . port(8090),
> +               Listen => 5,
> +               Reuse => 1
> +       )
> +               or die "Can't create listening socket: $!\n";
> +
> +       local $SIG{PIPE} = 'IGNORE';
> +
> +       while (my $client = $server->accept()) {
> +               $client->autoflush(1);
> +
> +               log2c("(new connection $client)");
> +
> +               $client->sysread(my $buffer, 65536) or next;
> +
> +               log2i("$client $buffer");
> +
> +               log2o("$client $buffer");
> +
> +               $client->syswrite($buffer);
> +
> +               close $client;
> +       }
> +}
> +
> +sub log2i { Test::Nginx::log_core('|| <<', @_); }
> +sub log2o { Test::Nginx::log_core('|| >>', @_); }
> +sub log2c { Test::Nginx::log_core('||', @_); }
> +
> +###############################################################################
> diff --git a/nginx/t/stream_js_periodic_file.t b/nginx/t/stream_js_periodic_file.t
> new file mode 100644
> index 00000000..b41ce04c
> --- /dev/null
> +++ b/nginx/t/stream_js_periodic_file.t
> @@ -0,0 +1,144 @@
> +#!/usr/bin/perl
> +
> +# (C) Dmitry Volyntsev
> +# (C) Nginx, Inc.
> +
> +# Tests for stream njs module, js_periodic directive.
> +
> +###############################################################################
> +
> +use warnings;
> +use strict;
> +
> +use Test::More;
> +use Socket qw/ CRLF /;
> +
> +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/http rewrite stream/)
> +       ->write_file_expand('nginx.conf', <<'EOF');
> +
> +%%TEST_GLOBALS%%
> +
> +daemon off;
> +worker_processes 4;
> +
> +events {
> +}
> +
> +worker_shutdown_timeout 100ms;
> +
> +stream {
> +    %%TEST_GLOBALS_STREAM%%
> +
> +    js_import test.js;
> +
> +    server {
> +        listen       127.0.0.1:8081;
> +        js_periodic test.file interval=1s;
> +
> +        js_preread test.test;
> +
> +        proxy_pass 127.0.0.1:8090;
> +    }
> +}
> +
> +EOF
> +
> +$t->write_file('test.js', <<EOF);
> +    import fs from 'fs';
> +
> +    async function file() {
> +        let fh = await fs.promises.open(ngx.conf_prefix + 'file', 'a+');
> +
> +        await fh.write('abc');
> +        await fh.close();
> +    }
> +
> +    function test(s) {
> +        s.on('upload', function (data) {
> +            if (data.length > 0) {
> +                switch (data) {
> +                case 'file':
> +                    let file_data = fs.readFileSync(ngx.conf_prefix + 'file')
> +                                                                    .toString();
> +
> +                    if (file_data == 'abc') {
> +                        s.done();
> +                        return;
> +                    }
> +
> +                    break;
> +
> +                default:
> +                    throw new Error(`Unknown test "\${data}"`);
> +                }
> +
> +                throw new Error(`Test "\${data}" failed`);
> +            }
> +        });
> +    }
> +
> +    export default { file, test };
> +EOF
> +
> +$t->run_daemon(\&stream_daemon, port(8090));
> +$t->try_run('no js_periodic with fs support');
> +$t->plan(2);
> +$t->waitforsocket('127.0.0.1:' . port(8090));
> +
> +###############################################################################
> +
> +select undef, undef, undef, 0.2;
> +
> +is(stream('127.0.0.1:' . port(8081))->io('file'), 'file', 'file test');
> +
> +$t->stop();
> +
> +unlike($t->read_file('error.log'), qr/\[error\].*should not be seen/,
> +       'check for not discadred events');
> +
> +###############################################################################
> +
> +sub stream_daemon {
> +       my $server = IO::Socket::INET->new(
> +               Proto => 'tcp',
> +               LocalAddr => '127.0.0.1:' . port(8090),
> +               Listen => 5,
> +               Reuse => 1
> +       )
> +               or die "Can't create listening socket: $!\n";
> +
> +       local $SIG{PIPE} = 'IGNORE';
> +
> +       while (my $client = $server->accept()) {
> +               $client->autoflush(1);
> +
> +               log2c("(new connection $client)");
> +
> +               $client->sysread(my $buffer, 65536) or next;
> +
> +               log2i("$client $buffer");
> +
> +               log2o("$client $buffer");
> +
> +               $client->syswrite($buffer);
> +
> +               close $client;
> +       }
> +}
> +
> +sub log2i { Test::Nginx::log_core('|| <<', @_); }
> +sub log2o { Test::Nginx::log_core('|| >>', @_); }
> +sub log2c { Test::Nginx::log_core('||', @_); }
> +
> +###############################################################################
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> https://mailman.nginx.org/mailman/listinfo/nginx-devel


More information about the nginx-devel mailing list