#!/usr/bin/perl

# (C) Maxim Dounin
# (C) Sergey Kandaurov
# (C) Andrey Zelenkov
# (C) Nginx, Inc.

# Tests for stream geo module.

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

use warnings;
use strict;

use Test::More;

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/stream stream_return stream_map stream_geo/);

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

%%TEST_GLOBALS%%

daemon off;

events {
}

stream {
    geo $geo {
        127.0.0.0/8   loopback;
        192.0.2.0/24  test;
        0.0.0.0/0     world;
    }

    geo $geo_include {
        include       geo.conf;
        192.0.2.0/24  test;
        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;
    }

    map $server_port $var {
        %%PORT_8080%%  "192.0.2.1";
        %%PORT_8081%%  "10.0.0.1";
        %%PORT_8085%%  "10.11.2.1";
        %%PORT_8086%%  "loopback";
        %%PORT_8087%%  "10.13.2.1";
    }

    geo $var $geo_from_var {
        default       default;
        127.0.0.0/8   loopback;
        192.0.2.0/24  test;
    }

    geo $var $geo_var_ranges {
        ranges;
        default                default;
        127.0.0.0-127.0.0.1    loopback;

        # 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;
        10.12.3.0-10.13.2.255  foo2;
        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;
        0.0.0.0/0     world;
    }

    geo $geo_ranges {
        ranges;
        default                    default;
        127.0.0.0-127.255.255.255  loopback;
        192.0.2.0-192.0.2.255      test;
    }

    geo $geo_ranges_include {
        ranges;
        default                default;
        include                geo-ranges.conf;
        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;
    }

    geo $geo_before {
        ranges;
        default                default;
        127.0.0.1-127.0.0.255  loopback;
        127.0.0.0-127.0.0.0    test;
    }

    geo $geo_after {
        ranges;
        default                default;
        127.0.0.0-127.0.0.1    loopback;
        127.0.0.2-127.0.0.255  test;
    }

    geo $geo_insert {
        ranges;
        default                default;
        127.0.0.0-127.0.0.255  test;
        127.0.0.1-127.0.0.2    test2;
        127.0.0.1-127.0.0.1    loopback;
    }

    geo $geo_insert_before {
        ranges;
        default                default;
        127.0.0.0-127.0.0.255  test;
        127.0.0.0-127.0.0.1    loopback;
    }

    geo $geo_insert_after {
        ranges;
        default                default;
        127.0.0.0-127.0.0.255  test;
        127.0.0.1-127.0.0.255  loopback;
     }

    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_before:$geo_before
                 geo_after:$geo_after
                 geo_insert:$geo_insert
                 geo_insert_before:$geo_insert_before
                 geo_insert_after:$geo_insert_after
                 geo_from_addr:$geo_from_addr
                 geo_from_var:$geo_from_var";
    }

    server {
        listen  127.0.0.1:8081;
        return  $geo_from_var;
    }

    server {
        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;
    }

    server {
        listen  127.0.0.1:8086;
        return  $geo_var_ranges;
    }

    server {
        listen  127.0.0.1:8087;
        return  $geo_var_ranges;
    }
}

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->run()->plan(19);

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

my %data = stream('127.0.0.1:' . port(8080))->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');

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_before}, 'loopback', 'geo ranges add before');
is($data{geo_after}, 'loopback', 'geo ranges add after');
is($data{geo_insert}, 'loopback', 'geo ranges insert');
is($data{geo_insert_before}, 'loopback', 'geo ranges insert before');
is($data{geo_insert_after}, 'loopback', 'geo ranges insert after');

is($data{geo_from_addr}, 'loopback', 'geo from addr');
is($data{geo_from_var}, 'test', 'geo from var');

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');
is(stream('127.0.0.1:' . port(8086))->read(), 'default', 'geo ranges default');
is(stream('127.0.0.1:' . port(8087))->read(), 'foo2', 'geo ranges add');

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