view sub_filter_multi.t @ 1248:70192b1baf01

Tests: added exception test to stream_js.t using 'require'. The stream js tests introduced in edf5a3c9e36a fail on njs 0.1.14. It doesn't currently provide an easy way to check its version, whilst we are obligated to gracefully handle such cases somehow. With such an addition of 'require', now the tests are skipped instead on the previous versions.
author Sergey Kandaurov <pluknet@nginx.com>
date Tue, 21 Nov 2017 13:16:39 +0300
parents 196d33c2bb45
children
line wrap: on
line source

#!/usr/bin/perl

# (C) Dmitry Volyntsev
# (C) Nginx, Inc.

# Tests for multiple patterns in sub filter.

###############################################################################

use warnings;
use strict;

use Test::More;

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 sub proxy/)->plan(42);

my $long_pattern = '0123456789abcdef' x 17;

(my $conf = <<'EOF') =~ s/%%LONG_PATTERN%%/$long_pattern/g;

%%TEST_GLOBALS%%

daemon off;

events {
}

http {
    %%TEST_GLOBALS_HTTP%%

    server {
        listen       127.0.0.1:8080;
        server_name  localhost;

        sub_filter_types *;
        sub_filter foo bar;

        location /multi {
            sub_filter_once off;
            sub_filter aab +;
            sub_filter yyz -;
            return 200 $arg_a;
        }

        location /multi2 {
            sub_filter_once off;
            sub_filter aabb  +;
            sub_filter aaabb -;
            return 200 $arg_a;
        }

        location /multi3 {
            sub_filter_once off;
            sub_filter aacbb +;
            sub_filter aadbb -;
            return 200 $arg_a;
        }

        location /case {
            sub_filter_once off;
            sub_filter AAB +;
            sub_filter YYZ -;
            return 200 $arg_a;
        }

        location /case2 {
            sub_filter_once off;
            sub_filter ABCDEFGHIJKLMNOPQRSTUVWXYZ +;
            return 200 $arg_a;
        }

        location /case3 {
            sub_filter_once off;
            sub_filter abcdefghijklmnopqrstuvwxyz +;
            return 200 $arg_a;
        }

        location /minimal {
            sub_filter_once off;
            sub_filter ab +;
            sub_filter cd -;
            sub_filter ef *;
            sub_filter gh !;
            sub_filter x  _;
            return 200 $arg_a;
        }

        location /once {
            sub_filter aab +;
            sub_filter yyz -;
            return 200 $arg_a;
        }

        location /table/inheritance {
            sub_filter_once off;
            return 200 $arg_a;
        }

        location /utf8 {
            sub_filter_once off;
            sub_filter 模様 замена1;
            sub_filter पैटर्न замена2;
            sub_filter паттерн replaced;
            return 200 $arg_a;
        }

        location /var/replacement/multi {
            sub_filter_once off;
            sub_filter aab '${arg_a}_replaced';
            sub_filter yyz '${arg_b}_replaced';
            return 200 $arg_c;
        }

        location /crossbuf/match1 {
            sub_filter_once off;
            sub_filter abpattyz +;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match2 {
            sub_filter_once off;
            sub_filter abpattrnyz +;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match3 {
            sub_filter_once off;
            sub_filter abpatternyz +;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match4 {
            sub_filter_once off;
            sub_filter abpattternyz +;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match5-01 {
            sub_filter_once off;
            sub_filter abyz +;
            sub_filter abpattternyz -;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match5-02 {
            sub_filter_once off;
            sub_filter abpayz +;
            sub_filter abpattternyz -;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/match6 {
            sub_filter_once off;
            sub_filter abpattxernyz +;
            sub_filter abpattternyz -;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/superlong/match1 {
            sub_filter_once off;
            sub_filter %%LONG_PATTERN%% +;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/superlong/match2 {
            sub_filter_once off;
            sub_filter %%LONG_PATTERN%% +;
            sub_filter yz -;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/superlong/match3 {
            sub_filter_once off;
            sub_filter %%LONG_PATTERN%% +;
            sub_filter 01ef -;
            alias %%TESTDIR%%/;
        }

        location /crossbuf/superlong/match4 {
            sub_filter_once off;
            sub_filter %%LONG_PATTERN%% +;
            sub_filter 01ef -;
            sub_filter _ *;
            alias %%TESTDIR%%/;
        }

        location /shortbuf/match1 {
            sub_filter_once off;
            sub_filter abpatternyz +;

            proxy_pass http://127.0.0.1:8081/;
            proxy_buffering off;
        }

        location /shortbuf/match2 {
            sub_filter_once off;
            sub_filter abpatternyz +;
            sub_filter abpaernyz -;

            proxy_pass http://127.0.0.1:8081/;
            proxy_buffering off;
        }

        location /shortbuf/match3 {
            sub_filter_once off;
            sub_filter abpatternyz +;
            sub_filter abpaernyz -;
            sub_filter _ *;

            proxy_pass http://127.0.0.1:8081/;
            proxy_buffering off;
        }

        location /shortbuf/match4 {
            sub_filter_once off;
            sub_filter patt +;

            proxy_pass http://127.0.0.1:8081/;
            proxy_buffering off;
        }

        location /shortbuf/match5 {
            sub_filter_once off;
            sub_filter abpatternyz +;
            sub_filter abpa -;
            sub_filter tter *;

            proxy_pass http://127.0.0.1:8081/;
            proxy_buffering off;
        }
    }

    server {
        listen       127.0.0.1:8081;

        limit_rate 4;
        limit_rate_after 160;

        location / {
            return 200 $arg_a;
        }
    }
}

EOF

$t->write_file_expand('nginx.conf', $conf);

$t->write_file('huge1.html', 'abpattyz' x 6000);
$t->write_file('huge2.html', 'abpattrnyz' x 5000);
$t->write_file('huge3.html', 'abpatternyz' x 4000);
$t->write_file('huge4.html', 'abpattternyz' x 4000);

$t->write_file('huge5-01.html', 'abpatternyzA' x 4000);
$t->write_file('huge5-02.html', 'abpatternyzABCDEFGHIJ' x 4000);
$t->write_file('huge5-03.html', 'abpatternyzABCDEFGHIJK' x 4000);
$t->write_file('huge5-04.html', 'abpatternyzABCDEFGHIJKL' x 4000);

$t->write_file('huge6-01.html', 'abyzAabpattternyz' x 3000);
$t->write_file('huge6-02.html', 'abpayzAabpattternyz' x 3000);

$t->write_file('huge7-01.html', 'abpattxernyzabpattternyz' x 3000);
$t->write_file('huge7-02.html', 'abpattxernyzAabpattternyz' x 3000);
$t->write_file('huge7-03.html', 'abpattxernyzABCDEFGHIJabpattternyz' x 3000);
$t->write_file('huge7-04.html', 'abpattxernyzABCDEFGHIJKabpattternyz' x 3000);
$t->write_file('huge7-05.html', 'abpattxernyzABCDEFGHIJKLabpattternyz' x 3000);

$t->write_file('huge8.html', scalar ('ABC' . $long_pattern . 'XYZ') x 1000);
$t->write_file('huge9.html', scalar ('ABC' . $long_pattern . 'yz') x 1000);
$t->write_file('huge10-01.html', scalar ($long_pattern . 'ABC01ef') x 1000);
$t->write_file('huge10-02.html', scalar ('01efABC' . $long_pattern) x 1000);
$t->write_file('huge11.html', scalar ('01efA_Z' . $long_pattern) x 1000);

$t->run();

###############################################################################

like(http_get('/multi?a=aabAyyzBaab'), qr/\+A-B\+/, 'simple match');
like(http_get('/multi2?a=aabbaaabbaabb'), qr/\+-\+/, 'partial match');
like(http_get('/multi3?a=aadbbaacbb'), qr/-\+/, 'exact match');

like(http_get('/multi?a=AABYYZAAB'), qr/\+-\+/, 'case insensivity 1');
like(http_get('/case?a=aabyyzaab'), qr/\+-\+/, 'case insensivity 2');
like(http_get('/case2?a=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'),
	qr/\+\+/, 'case insensivity 3');
like(http_get('/case3?a=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'),
	qr/\+\+/, 'case insensivity 4');

like(http_get('/minimal?a=AAabcdefghBxBabCxCcdDDefEEghFF'),
	qr/AA\+-\*!B_B\+C_C-DD\*EE!FF/, 'minimal match');

like(http_get('/utf8?a=ТЕКСТ模様ТЕКСТ2पैटर्नТЕКСТ3паттерн'),
	qr/ТЕКСТзамена1ТЕКСТ2замена2ТЕКСТ3replaced/, 'utf8 match');

like(http_get('/once?a=aabyyzaab'), qr/\+-aab/, 'once 1');
like(http_get('/once?a=yyzaabyyz'), qr/-\+yyz/, 'once 2');
like(http_get('/once?a=yyzyyzaabaabyyz'), qr/-yyz\+aabyyz/, 'once 3');

like(http_get('/table/inheritance?a=foofoo'), qr/barbar/, 'table inheritance');

like(http_get('/var/replacement/multi?a=A&b=B&c=aabyyzaab'),
	qr/A_replacedB_replacedA_replaced/, 'complex multiple replace');

like(http_get('/crossbuf/match1/huge1.html'), qr/\+{6000}/,
	'crossbuf match 1 (simple match len 8)');
like(http_get('/crossbuf/match2/huge2.html'), qr/\+{5000}/,
	'crossbuf match 2 (simple match len 9)');
like(http_get('/crossbuf/match3/huge3.html'), qr/\+{4000}/,
	'crossbuf match 3 (simple match len 10)');
like(http_get('/crossbuf/match4/huge4.html'), qr/\+{4000}/,
	'crossbuf match 4 (simple match len 11)');

like(http_get('/crossbuf/match3/huge5-01.html'), qr/(\+A){4000}/,
	'crossbuf match 5.1');
like(http_get('/crossbuf/match3/huge5-02.html'), qr/(\+ABCDEFGHIJ){4000}/,
	'crossbuf match 5.2');
like(http_get('/crossbuf/match3/huge5-03.html'), qr/(\+ABCDEFGHIJK){4000}/,
	'crossbuf match 5.3');
like(http_get('/crossbuf/match3/huge5-04.html'), qr/(\+ABCDEFGHIJKL){4000}/,
	'crossbuf match 5.4');

like(http_get('/crossbuf/match5-01/huge6-01.html'), qr/(\+A-){3000}/,
	'crossbuf match 6.1 (multiple replace)');
like(http_get('/crossbuf/match5-02/huge6-02.html'), qr/(\+A-){3000}/,
	'crossbuf match 6.2 (multiple replace)');

like(http_get('/crossbuf/match6/huge7-01.html'), qr/(\+-){3000}/,
	'crossbuf match 7.1 (multiple replace)');
like(http_get('/crossbuf/match6/huge7-02.html'), qr/(\+A-){3000}/,
	'crossbuf match 7.2 (multiple replace)');
like(http_get('/crossbuf/match6/huge7-03.html'), qr/(\+ABCDEFGHIJ-){3000}/,
	'crossbuf match 7.3 (multiple replace)');
like(http_get('/crossbuf/match6/huge7-04.html'), qr/(\+ABCDEFGHIJK-){3000}/,
	'crossbuf match 7.4 (multiple replace)');
like(http_get('/crossbuf/match6/huge7-05.html'), qr/(\+ABCDEFGHIJKL-){3000}/,
	'crossbuf match 7.5 (multiple replace)');

like(http_get('/crossbuf/superlong/match1/huge8.html'), qr/(ABC\+XYZ){1000}/,
	'crossbuf superlong match 1');
like(http_get('/crossbuf/superlong/match2/huge9.html'), qr/(ABC\+-){1000}/,
	'crossbuf superlong match 2 (multiple replace)');
like(http_get('/crossbuf/superlong/match3/huge10-01.html'), qr/(\+ABC-){1000}/,
	'crossbuf superlong match 3.1 (multiple replace)');
like(http_get('/crossbuf/superlong/match3/huge10-02.html'), qr/(-ABC\+){1000}/,
	'crossbuf superlong match 3.2 (multiple replace)');
like(http_get('/crossbuf/superlong/match4/huge11.html'), qr/(-A\*Z\+){1000}/,
	'crossbuf superlong match 4 (1 byte search pattern)');

SKIP: {
skip 'long tests', 8 unless $ENV{TEST_NGINX_UNSAFE};

like(http_get('/shortbuf/match1?a=' . 'abpatternyzA' x 3),
	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/match2?a=' . 'abpatternyzAabpaernyzB' x 2),
	qr/(\+A-B){2}/, 'shortbuf match 2.1 (multiple replace)');
like(http_get('/shortbuf/match2?a=' . 'abpatternyzAabpaernyz' x 2),
	qr/(\+A-){2}/, 'shortbuf match 2.2 (multiple replace)');
like(http_get('/shortbuf/match3?a=' . 'abpatternyzA_' x 3),
	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),
	qr/\+ABCDE(-\*nyABCDE){2}/, 'shortbuf match 5');
}

###############################################################################