| #!/usr/bin/perl |
| |
| # (C) Maxim Dounin |
| # (C) Valentin Bartenev |
| |
| # Tests for nginx ssi module, "if" statement. |
| |
| ############################################################################### |
| |
| 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 ssi/)->plan(43); |
| |
| $t->write_file_expand('nginx.conf', <<'EOF'); |
| |
| %%TEST_GLOBALS%% |
| |
| daemon off; |
| |
| events { |
| } |
| |
| http { |
| %%TEST_GLOBALS_HTTP%% |
| |
| server { |
| listen 127.0.0.1:8080; |
| server_name localhost; |
| location / { |
| ssi on; |
| } |
| } |
| } |
| |
| EOF |
| |
| |
| my $if_elif_else = |
| '<!--#if expr="$arg_if" -->IF' |
| . '<!--#elif expr="$arg_elif" -->ELIF' |
| . '<!--#else -->ELSE' |
| . '<!--#endif -->'; |
| |
| my $zig = 'GOOD'; |
| my $zag = 'GOOD'; |
| |
| foreach my $i (reverse 1 .. 15) { |
| if ($i % 2) { |
| $zig = |
| "<!--#if expr='\$arg_$i' -->$i<!--#else -->$zig<!--#endif -->"; |
| $zag = |
| "<!--#if expr='\$arg_$i' -->$zag<!--#else -->$i<!--#endif -->"; |
| } else { |
| $zig = |
| "<!--#if expr='\$arg_$i' -->$zig<!--#else -->$i<!--#endif -->"; |
| $zag = |
| "<!--#if expr='\$arg_$i' -->$i<!--#else -->$zag<!--#endif -->"; |
| } |
| } |
| |
| $t->run(); |
| |
| ############################################################################### |
| |
| $t->write_file('if_var.html', 'x<!--#if expr="$arg_v" -->OK<!--#endif -->x'); |
| |
| like(http_get('/if_var.html?v=1'), qr/^xOKx$/m, 'if variable exists'); |
| like(http_get('/if_var.html'), qr/^xx$/m, 'if variable not exists'); |
| |
| |
| $t->write_file('if_eq.html', |
| 'x<!--#if expr="$arg_v = equal" -->OK<!--#endif -->x'); |
| |
| like(http_get('/if_eq.html?v=equal'), qr/^xOKx$/m, 'if var = text'); |
| like(http_get('/if_eq.html?v=notequal'), qr/^xx$/m, 'if var = text (false)'); |
| |
| |
| $t->write_file('if_neq.html', |
| 'x<!--#if expr="equal != $arg_v" -->OK<!--#endif -->x'); |
| |
| like(http_get('/if_neq.html?v=notequal'), qr/^xOKx$/m, 'if text != var'); |
| like(http_get('/if_neq.html?v=equal'), qr/^xx$/m, 'if text != var (false)'); |
| |
| |
| SKIP: { |
| # PCRE may not be available unless we have rewrite module |
| |
| skip 'no PCRE', 4 unless $t->has_module('rewrite'); |
| |
| $t->write_file('if_eq_re.html', |
| 'x<!--#if expr="$arg_v = /re+gexp?/" -->OK<!--#endif -->x'); |
| |
| like(http_get('/if_eq_re.html?v=XreeeegexX'), qr/^xOKx$/m, |
| 'if var = /regex/'); |
| like(http_get('/if_eq_re.html?v=XrgxX'), qr/^xx$/m, |
| 'if var = /regex/ (false)'); |
| |
| |
| $t->write_file('if_neq_re.html', |
| 'x<!--#if expr="$arg_v != /re+gexp?/" -->OK<!--#endif -->x'); |
| |
| like(http_get('/if_neq_re.html?v=XrgxX'), qr/^xOKx$/m, |
| 'if var != /regex/'); |
| like(http_get('/if_neq_re.html?v=XreeeegexX'), qr/^xx$/m, |
| 'if var != /regex/ (false)'); |
| } |
| |
| |
| $t->write_file('if_varvar.html', |
| 'x<!--#if expr="$arg_v = var$arg_v2" -->OK<!--#endif -->x'); |
| |
| like(http_get('/if_varvar.html?v=varHERE&v2=HERE'), qr/^xOKx$/m, |
| 'if var = complex'); |
| |
| |
| SKIP: { |
| # PCRE may not be available unless we have rewrite module |
| |
| skip 'no PCRE', 2 unless $t->has_module('rewrite'); |
| |
| $t->write_file('if_cap_re.html', |
| 'x<!--#if expr="$arg_v = /(CAP\d).*(CAP\d)/" -->' |
| . '<!--#echo var="1" -->x<!--#echo var="2" -->' |
| . '<!--#endif -->x'); |
| |
| like(http_get('/if_cap_re.html?v=hereCAP1andCAP2'), qr/^xCAP1xCAP2x$/m, |
| 'if regex with captures'); |
| |
| |
| $t->write_file('if_ncap_re.html', |
| 'x<!--#if expr="$arg_v = /(?P<ncap>HERE)/" -->' |
| . '<!--#echo var="ncap" -->' |
| . '<!--#endif -->x'); |
| |
| like(http_get('/if_ncap_re.html?v=captureHEREeee'), qr/^xHEREx$/m, |
| 'if regex with named capture'); |
| } |
| |
| |
| $t->write_file('if.html', 'x' . $if_elif_else . 'x'); |
| |
| like(http_get('/if.html?if=1'), qr/^xIFx$/m, 'if'); |
| like(http_get('/if.html?if=1&elif=1'), qr/^xIFx$/m, 'if suppresses elif'); |
| like(http_get('/if.html?elif=1'), qr/^xELIFx$/m, 'elif'); |
| like(http_get('/if.html'), qr/^xELSEx$/m, 'else'); |
| |
| |
| $t->write_file('if_multi.html', |
| 'x<!--#if expr="$arg_1" -->IF1<!--#else -->ELSE1<!--#endif -->' |
| . 'x<!--#if expr="$arg_2" -->IF2<!--#else -->ELSE2<!--#endif -->' |
| . 'x<!--#if expr="$arg_3" -->IF3<!--#else -->ELSE3<!--#endif -->' |
| . 'x<!--#if expr="$arg_4" -->IF4<!--#else -->ELSE4<!--#endif -->' |
| . 'x<!--#if expr="$arg_5" -->IF5<!--#else -->ELSE5<!--#endif -->x'); |
| |
| like(http_get('/if_multi.html?1=t&2=t&3=t&4=t&5=t'), |
| qr/^xIF1xIF2xIF3xIF4xIF5x$/m, 'multiple if (sequentially)'); |
| like(http_get('/if_multi.html?1=t&3=t&5=t'), qr/^xIF1xELSE2xIF3xELSE4xIF5x$/m, |
| 'multiple if (interlaced)'); |
| like(http_get('/if_multi.html?2=t&4=t'), qr/^xELSE1xIF2xELSE3xIF4xELSE5x$/m, |
| 'multiple if (interlaced reversed)'); |
| |
| |
| $t->write_file('if_in_block.html', |
| '<!--#block name="one" -->' . $if_elif_else . '<!--#endblock -->' |
| . 'x<!--#include virtual="/404?$args" stub="one" -->x'); |
| |
| like(http_get('/if_in_block.html?if=1'), qr/^xIFx$/m, 'if (in block)'); |
| like(http_get('/if_in_block.html?if=1&elif=1'), qr/^xIFx$/m, |
| 'if suppresses elif (in block)'); |
| like(http_get('/if_in_block.html?elif=1'), qr/^xELIFx$/m, 'elif (in block)'); |
| like(http_get('/if_in_block.html'), qr/^xELSEx$/m, 'else (in block)'); |
| |
| |
| $t->write_file('if_config_set_echo.html', |
| 'x<!--#if expr="$arg_if" -->' |
| . '<!--#config timefmt="IF" -->' |
| . '<!--#set var="v" value="$date_gmt" -->' |
| . '<!--#echo var="v" -->' |
| . '<!--#else -->' |
| . '<!--#config timefmt="ELSE" -->' |
| . '<!--#set var="v" value="$date_gmt" -->' |
| . '<!--#echo var="v" -->' |
| . '<!--#endif -->x'); |
| |
| like(http_get('/if_config_set_echo.html?if=1'), qr/^xIFx$/m, |
| 'if config-set-echo'); |
| like(http_get('/if_config_set_echo.html'), qr/^xELSEx$/m, |
| 'else config-set-echo'); |
| |
| |
| $t->write_file('if_include.html', |
| 'x<!--#if expr="$arg_if" -->' |
| . '<!--#include virtual="/if.html?if=1" -->' |
| . '<!--#else -->' |
| . '<!--#include virtual="/if.html" -->' |
| . '<!--#endif -->x'); |
| |
| like(http_get('/if_include.html?if=1'), qr/^xxIFxx$/m, |
| 'if include'); |
| like(http_get('/if_include.html'), qr/^xxELSExx$/m, |
| 'else include'); |
| |
| |
| $t->write_file('if_block.html', |
| '<!--#if expr="$arg_if" -->' |
| . '<!--#block name="one" -->IF<!--#endblock -->' |
| . '<!--#else -->' |
| . '<!--#block name="one" -->ELSE<!--#endblock -->' |
| . '<!--#endif -->' |
| . 'x<!--#include virtual="/404" stub="one" -->x'); |
| |
| like(http_get('/if_block.html?if=1'), qr/^xIFx$/m, 'if block'); |
| like(http_get('/if_block.html'), qr/^xELSEx$/m, 'else block'); |
| |
| |
| TODO: { |
| local $TODO = 'support for nested ifs'; |
| |
| $t->write_file('ifif.html', |
| 'x<!--#if expr="$arg__if" -->IFx' . $if_elif_else |
| . '<!--#elif expr="$arg__elif" -->ELIFx' . $if_elif_else |
| . '<!--#else -->ELSEx' . $if_elif_else |
| . '<!--#endif -->x'); |
| |
| like(http_get('/ifif.html?_if=1&if=1'), qr/^xIFxIFx$/m, 'if if'); |
| like(http_get('/ifif.html?_if=1&elif=1'), qr/^xIFxELIFx$/m, 'if elif'); |
| like(http_get('/ifif.html?_if=1'), qr/^xIFxELSEx$/m, 'if else'); |
| |
| like(http_get('/ifif.html?_elif=1&if=1'), qr/^xELIFxIFx$/m, 'elif if'); |
| like(http_get('/ifif.html?_elif=1&elif=1'), qr/^xELIFxELIFx$/m, 'elif elif'); |
| like(http_get('/ifif.html?_elif=1'), qr/^xELIFxELSEx$/m, 'elif else'); |
| |
| like(http_get('/ifif.html?if=1'), qr/^xELSExIFx$/m, 'else if'); |
| like(http_get('/ifif.html?elif=1'), qr/^xELSExELIFx$/m, 'else elif'); |
| like(http_get('/ifif.html'), qr/^xELSExELSEx$/m, 'else else'); |
| |
| |
| $t->write_file('zigzag.html', |
| "x<!--#if expr='\$arg_0' -->$zig<!--#else -->$zag<!--#endif -->x"); |
| |
| like(http_get('/zigzag.html?0=t&2=t&4=t&6=t&8=t&10=t&12=t&14=t'), |
| qr/^xGOODx$/m, 'zigzag'); |
| like(http_get('/zigzag.html?1=t&3=t&5=t&7=t&9=t&11=t&13=t&15=t'), |
| qr/^xGOODx$/m, 'zagzig'); |
| |
| |
| $t->write_file('zigzag_block.html', |
| '<!--#block name="one" -->' |
| . "x<!--#if expr='\$arg_0' -->$zig<!--#else -->$zag<!--#endif -->x" |
| . '<!--#endblock -->' |
| . 'x<!--#include virtual="/404?$args" stub="one" -->x'); |
| |
| like(http_get('/zigzag_block.html?0=t&2=t&4=t&6=t&8=t&10=t&12=t&14=t'), |
| qr/^xGOODx$/m, 'zigzag block'); |
| like(http_get('/zigzag_block.html?1=t&3=t&5=t&7=t&9=t&11=t&13=t&15=t'), |
| qr/^xGOODx$/m, 'zagzig block'); |
| |
| } |
| |
| ############################################################################### |