# HG changeset patch # User Andrey Zelenkov # Date 1472218289 -10800 # Node ID 61fbb879446ab51df20e36faa8cdcfe0f63ca053 # Parent 8f92d97cf40ecc93843394dbc0de8bfcf85fbe73 Tests: geo delete tests. diff --git a/geo.t b/geo.t --- a/geo.t +++ b/geo.t @@ -49,12 +49,30 @@ http { 0.0.0.0/0 world; } + geo $geo_delete { + 127.0.0.0/8 loopback; + 192.0.2.0/24 test; + 0.0.0.0/0 world; + delete 127.0.0.0/8; + } + geo $arg_ip $geo_from_arg { default default; 127.0.0.0/8 loopback; 192.0.2.0/24 test; } + geo $arg_ip $geo_arg_ranges { + ranges; + default default; + + # ranges with two /16 networks + # the latter network has greater two least octets + # (see 1301a58b5dac for details) + 10.10.3.0-10.11.2.255 foo; + delete 10.10.3.0-10.11.2.255; + } + geo $geo_proxy { default default; proxy 127.0.0.1; @@ -84,6 +102,24 @@ http { 192.0.2.0-192.0.2.255 test; } + geo $geo_ranges_delete { + ranges; + default default; + 127.0.0.0-127.0.0.255 test; + 127.0.0.1-127.0.0.1 loopback; + delete 127.0.0.0-127.0.0.0; + delete 127.0.0.2-127.0.0.255; + delete 127.0.0.1-127.0.0.1; + } + + # delete range with two /16 + geo $geo_ranges_delete_2 { + ranges; + default default; + 127.0.0.0-127.1.0.0 loopback; + delete 127.0.0.0-127.1.0.0; + } + server { listen 127.0.0.1:8080; server_name localhost; @@ -92,18 +128,26 @@ http { add_header X-IP $remote_addr; add_header X-Geo $geo; add_header X-Inc $geo_include; + add_header X-Del $geo_delete; add_header X-Ran $geo_ranges; add_header X-RIn $geo_ranges_include; add_header X-Arg $geo_from_arg; + add_header X-ARa $geo_arg_ranges; add_header X-XFF $geo_proxy; add_header X-XFR $geo_proxy_recursive; } + + location /2 { + add_header X-RDe $geo_ranges_delete; + add_header X-RD2 $geo_ranges_delete_2; + } } } EOF $t->write_file('1', ''); +$t->write_file('2', ''); $t->write_file('geo.conf', '127.0.0.0/8 loopback;'); $t->write_file('geo-ranges.conf', '127.0.0.0-127.255.255.255 loopback;'); @@ -112,19 +156,38 @@ EOF plan(skip_all => 'no 127.0.0.1 on host') if http_get('/1') !~ /X-IP: 127.0.0.1/m; -$t->plan(11); +$t->plan(15); ############################################################################### my $r = http_get('/1'); like($r, qr/^X-Geo: loopback/m, 'geo'); like($r, qr/^X-Inc: loopback/m, 'geo include'); +like($r, qr/^X-Del: world/m, 'geo delete'); like($r, qr/^X-Ran: loopback/m, 'geo ranges'); like($r, qr/^X-RIn: loopback/m, 'geo ranges include'); +TODO: { +todo_skip 'use-after-free', 2 unless $ENV{TEST_NGINX_UNSAFE} + or $t->has_version('1.11.4'); + +like(http_get('/2'), qr/^X-RDe: default/m, 'geo ranges delete'); +like(http_get('/2'), qr/^X-RD2: default/m, 'geo ranges delete 2'); + +} + like(http_get('/1?ip=192.0.2.1'), qr/^X-Arg: test/m, 'geo from variable'); like(http_get('/1?ip=10.0.0.1'), qr/^X-Arg: default/m, 'geo default'); +TODO: { +todo_skip 'use-after-free', 1 unless $ENV{TEST_NGINX_UNSAFE} + or $t->has_version('1.11.4'); + +like(http_get('/1?ip=10.11.2.1'), qr/^X-ARa: default/m, + 'geo delete range from variable'); + +} + like(http_xff('192.0.2.1'), qr/^X-XFF: test/m, 'geo proxy'); like(http_xff('10.0.0.1'), qr/^X-XFF: default/m, 'geo proxy default'); like(http_xff('10.0.0.1, 192.0.2.1'), qr/^X-XFF: test/m, 'geo proxy long'); diff --git a/stream_geo.t b/stream_geo.t --- a/stream_geo.t +++ b/stream_geo.t @@ -49,6 +49,13 @@ stream { 0.0.0.0/0 world; } + geo $geo_delete { + 127.0.0.0/8 loopback; + 192.0.2.0/24 test; + 0.0.0.0/0 world; + delete 127.0.0.0/8; + } + geo $remote_addr $geo_from_addr { 127.0.0.0/8 loopback; 192.0.2.0/24 test; @@ -57,6 +64,7 @@ stream { map $server_port $var { %%PORT_8080%% "192.0.2.1"; %%PORT_8081%% "10.0.0.1"; + %%PORT_8085%% "10.11.2.1"; } geo $var $geo_from_var { @@ -65,6 +73,17 @@ stream { 192.0.2.0/24 test; } + geo $var $geo_var_ranges { + ranges; + default default; + + # ranges with two /16 networks + # the latter network has greater two least octets + # (see 1301a58b5dac for details) + 10.10.3.0-10.11.2.255 foo; + delete 10.10.3.0-10.11.2.255; + } + geo $var $geo_world { 127.0.0.0/8 loopback; 192.0.2.0/24 test; @@ -85,10 +104,29 @@ stream { 192.0.2.0-192.0.2.255 test; } + geo $geo_ranges_delete { + ranges; + default default; + 127.0.0.0-127.0.0.255 test; + 127.0.0.1-127.0.0.1 loopback; + delete 127.0.0.0-127.0.0.0; + delete 127.0.0.2-127.0.0.255; + delete 127.0.0.1-127.0.0.1; + } + + # delete range with two /16 + geo $geo_ranges_delete_2 { + ranges; + default default; + 127.0.0.0-127.1.0.0 loopback; + delete 127.0.0.0-127.1.0.0; + } + server { listen 127.0.0.1:8080; return "geo:$geo geo_include:$geo_include + geo_delete:$geo_delete geo_ranges:$geo_ranges geo_ranges_include:$geo_ranges_include geo_from_addr:$geo_from_addr @@ -104,6 +142,21 @@ stream { listen 127.0.0.1:8082; return $geo_world; } + + server { + listen 127.0.0.1:8083; + return $geo_ranges_delete; + } + + server { + listen 127.0.0.1:8084; + return $geo_ranges_delete_2; + } + + server { + listen 127.0.0.1:8085; + return $geo_var_ranges; + } } EOF @@ -111,19 +164,38 @@ EOF $t->write_file('geo.conf', '127.0.0.0/8 loopback;'); $t->write_file('geo-ranges.conf', '127.0.0.0-127.255.255.255 loopback;'); -$t->try_run('no stream geo')->plan(8); +$t->try_run('no stream geo')->plan(12); ############################################################################### my %data = stream()->read() =~ /(\w+):(\w+)/g; is($data{geo}, 'loopback', 'geo'); is($data{geo_include}, 'loopback', 'geo include'); +is($data{geo_delete}, 'world', 'geo delete'); is($data{geo_ranges}, 'loopback', 'geo ranges'); is($data{geo_ranges_include}, 'loopback', 'geo ranges include'); +TODO: { +todo_skip 'use-after-free', 2 unless $ENV{TEST_NGINX_UNSAFE} + or $t->has_version('1.11.4'); + +is(stream('127.0.0.1:' . port(8083))->read(), 'default', 'geo ranges delete'); +is(stream('127.0.0.1:' . port(8084))->read(), 'default', 'geo ranges delete 2'); + +} + is($data{geo_from_addr}, 'loopback', 'geo from addr'); is($data{geo_from_var}, 'test', 'geo from var'); +TODO: { +todo_skip 'use-after-free', 1 unless $ENV{TEST_NGINX_UNSAFE} + or $t->has_version('1.11.4'); + +is(stream('127.0.0.1:' . port(8085))->read(), 'default', + 'geo delete range from variable'); + +} + is(stream('127.0.0.1:' . port(8081))->read(), 'default', 'geo default'); is(stream('127.0.0.1:' . port(8082))->read(), 'world', 'geo world');